/ Hex Artifact Content
Login

Artifact 30d6799f86445a8b989bed45c7d5f33c8192d838605e0abe99e0398892779974:


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 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
4f60: 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f  ion:  shell_add_
4f70: 73 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a  schema(S,X).**.*
4f80: 2a 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61  * Add the schema
4f90: 20 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43   name X to the C
4fa0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
4fb0: 69 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20  in S and return 
4fc0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45  the result..** E
4fd0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
4fe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4ff0: 31 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41  1(x)   ->   CREA
5000: 54 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28  TE TABLE xyz.t1(
5010: 78 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77  x);.**.** Also w
5020: 6f 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  orks on.**.**   
5030: 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a   CREATE INDEX.**
5040: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
5050: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5060: 45 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20  EATE VIEW.**    
5070: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a  CREATE TRIGGER.*
5080: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  *    CREATE VIRT
5090: 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20  UAL TABLE.**.** 
50a0: 54 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64  This UDF is used
50b0: 20 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20   by the .schema 
50c0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72  command to inser
50d0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  t the schema nam
50e0: 65 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  e of.** attached
50f0: 20 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20   databases into 
5100: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5110: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  e sqlite_master.
5120: 73 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  sql field..*/.st
5130: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41  atic void shellA
5140: 64 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20  ddSchemaName(.  
5150: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5160: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
5170: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
5180: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
5190: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
51a0: 72 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b  r *aPrefix[] = {
51b0: 0a 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20  .     "TABLE",. 
51c0: 20 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20      "INDEX",.   
51d0: 20 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22    "UNIQUE INDEX"
51e0: 2c 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20  ,.     "VIEW",. 
51f0: 20 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20      "TRIGGER",. 
5200: 20 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42      "VIRTUAL TAB
5210: 4c 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  LE".  };.  int i
5220: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
5230: 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ar *zIn = (const
5240: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5250: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5260: 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0]);.  const cha
5270: 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f  r *zSchema = (co
5280: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5290: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
52a0: 61 6c 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74  al[1]);.  assert
52b0: 28 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20 69  ( nVal==2 );.  i
52c0: 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74 72  f( zIn!=0 && str
52d0: 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41 54  ncmp(zIn, "CREAT
52e0: 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  E ", 7)==0 ){.  
52f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e    for(i=0; i<(in
5300: 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66 69  t)(sizeof(aPrefi
5310: 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66 69  x)/sizeof(aPrefi
5320: 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  x[0])); i++){.  
5330: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
5340: 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d 29  en30(aPrefix[i])
5350: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
5360: 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65 66  cmp(zIn+7, aPref
5370: 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26 20  ix[i], n)==0 && 
5380: 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b  zIn[n+7]==' ' ){
5390: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 51  .        char cQ
53a0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
53b0: 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  (zSchema);.     
53c0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
53d0: 20 20 20 20 69 66 28 20 63 51 75 6f 74 65 20 29      if( cQuote )
53e0: 7b 0a 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73  {.         z = s
53f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5400: 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c  %.*s \"%w\".%s",
5410: 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65   n+7, zIn, zSche
5420: 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20  ma, zIn+n+8);.  
5430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5440: 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74         z = sqlit
5450: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73  e3_mprintf("%.*s
5460: 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49   %s.%s", n+7, zI
5470: 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b  n, zSchema, zIn+
5480: 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+8);.        }.
5490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
54a0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
54b0: 2c 20 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  , z, -1, sqlite3
54c0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  _free);.        
54d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
54e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
54f0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
5500: 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29  (pCtx, apVal[0])
5510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
5520: 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 73  ource code for s
5530: 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d 65 20  everal run-time 
5540: 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69  loadable extensi
5550: 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65 64 0a  ons is inserted.
5560: 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68 65 20  ** below by the 
5570: 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c 6c 63  ../tool/mkshellc
5580: 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20 42 65  .tcl script.  Be
5590: 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20  fore processing 
55a0: 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a 2a 2a  that included.**
55b0: 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64 20 74   code, we need t
55c0: 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20  o override some 
55d0: 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65 20 74  macros to make t
55e0: 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72 6f 67  he included prog
55f0: 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f 72 6b  ram code.** work
5600: 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d 69 64   here in the mid
5610: 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65 67 75  dle of this regu
5620: 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  lar program..*/.
5630: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45  #define SQLITE_E
5640: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23  XTENSION_INIT1.#
5650: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
5660: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 58 29  TENSION_INIT2(X)
5670: 20 28 76 6f 69 64 29 28 58 29 0a 0a 49 4e 43 4c   (void)(X)..INCL
5680: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
5690: 73 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55  shathree.c.INCLU
56a0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66  DE ../ext/misc/f
56b0: 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20  ileio.c.INCLUDE 
56c0: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70  ../ext/misc/comp
56d0: 6c 65 74 69 6f 6e 2e 63 0a 0a 23 69 66 20 64 65  letion.c..#if de
56e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
56f0: 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
5700: 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61  ** State informa
5710: 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  tion for a singl
5720: 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a  e open session.*
5730: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5740: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65   OpenSession Ope
5750: 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74  nSession;.struct
5760: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20   OpenSession {. 
5770: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
5780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
5790: 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74  bolic name for t
57a0: 68 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20  his session */. 
57b0: 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20   int nFilter;   
57c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
57d0: 62 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72  ber of xFilter r
57e0: 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61  ejection GLOB pa
57f0: 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72  tterns */.  char
5800: 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20   **azFilter;    
5810: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
5820: 20 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69   xFilter rejecti
5830: 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  on GLOB patterns
5840: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65   */.  sqlite3_se
5850: 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f  ssion *p;      /
5860: 2a 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69  * The open sessi
5870: 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a  on */.};.#endif.
5880: 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74  ./*.** Shell out
5890: 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61  put mode informa
58a0: 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65  tion from before
58b0: 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a   ".explain on",.
58c0: 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74  ** saved so that
58d0: 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f   it can be resto
58e0: 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e  red by ".explain
58f0: 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66   off".*/.typedef
5900: 20 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64   struct SavedMod
5910: 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49  eInfo SavedModeI
5920: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65  nfo;.struct Save
5930: 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e  dModeInfo {.  in
5940: 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20  t valid;        
5950: 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65    /* Is there le
5960: 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65  git data in here
5970: 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b  ? */.  int mode;
5980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
5990: 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78  de prior to ".ex
59a0: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69  plain on" */.  i
59b0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
59c0: 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64     /* The ".head
59d0: 65 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f  er" setting prio
59e0: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
59f0: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57  n" */.  int colW
5a00: 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43  idth[100];  /* C
5a10: 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69  olumn widths pri
5a20: 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20  or to ".explain 
5a30: 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  on" */.};../*.**
5a40: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
5a50: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74  on about the dat
5a60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5a70: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
5a80: 20 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20   an.** instance 
5a90: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5aa0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
5ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68  ypedef struct Sh
5ac0: 65 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74  ellState ShellSt
5ad0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c  ate;.struct Shel
5ae0: 6c 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74  lState {.  sqlit
5af0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
5b00: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
5b10: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45  e */.  int autoE
5b20: 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 2f 2a  xplain;       /*
5b30: 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   Automatically t
5b40: 75 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20  urn on .explain 
5b50: 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61 75  mode */.  int au
5b60: 74 6f 45 51 50 3b 20 20 20 20 20 20 20 20 20 20  toEQP;          
5b70: 20 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20   /* Run EXPLAIN 
5b80: 51 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72  QUERY PLAN prior
5b90: 20 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74   to seach SQL st
5ba0: 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74  mt */.  int stat
5bb0: 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sOn;           /
5bc0: 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61  * True to displa
5bd0: 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62  y memory stats b
5be0: 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c  efore each final
5bf0: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 73 63 61  ize */.  int sca
5c00: 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20  nstatsOn;       
5c10: 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c  /* True to displ
5c20: 61 79 20 73 63 61 6e 20 73 74 61 74 73 20 62 65  ay scan stats be
5c30: 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69  fore each finali
5c40: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43  ze */.  int outC
5c50: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
5c60: 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64 6f  * Revert to stdo
5c70: 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e 67  ut when reaching
5c80: 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63   zero */.  int c
5c90: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5ca0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5cb0: 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64  ecords displayed
5cc0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c   so far */.  FIL
5cd0: 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20  E *out;         
5ce0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
5cf0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 46  ults here */.  F
5d00: 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20 20  ILE *traceOut;  
5d10: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
5d20: 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61 63  for sqlite3_trac
5d30: 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  e() */.  int nEr
5d40: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5d50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
5d60: 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e  ors seen */.  in
5d70: 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  t mode;         
5d80: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75       /* An outpu
5d90: 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a  t mode setting *
5da0: 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20  /.  int cMode;  
5db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
5dc0: 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d  mporary output m
5dd0: 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72  ode for the curr
5de0: 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ent query */.  i
5df0: 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20  nt normalMode;  
5e00: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
5e10: 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78  mode before ".ex
5e20: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69  plain on" */.  i
5e30: 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d  nt writableSchem
5e40: 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  a;    /* True if
5e50: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
5e60: 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20  _schema=ON */.  
5e70: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20  int showHeader; 
5e80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
5e90: 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61  o show column na
5ea0: 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43  mes in List or C
5eb0: 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  olumn mode */.  
5ec0: 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20  int nCheck;     
5ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5ee0: 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d   of ".check" com
5ef0: 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75  mands run */.  u
5f00: 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67  nsigned shellFlg
5f10: 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73  s;    /* Various
5f20: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72   flags */.  char
5f30: 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20   *zDestTable;   
5f40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65     /* Name of de
5f50: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
5f60: 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74  when MODE_Insert
5f70: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74   */.  char zTest
5f80: 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20  case[30];    /* 
5f90: 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20  Name of current 
5fa0: 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20 63  test case */.  c
5fb0: 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72  har colSeparator
5fc0: 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20  [20]; /* Column 
5fd0: 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
5fe0: 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ter for several 
5ff0: 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  modes */.  char 
6000: 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d  rowSeparator[20]
6010: 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74  ; /* Row separat
6020: 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72  or character for
6030: 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20   MODE_Ascii */. 
6040: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
6050: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
6060: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
6070: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
6080: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
6090: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
60a0: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
60b0: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
60c0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
60d0: 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b  r nullValue[20];
60e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
60f0: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
6100: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
6110: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
6140: 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b  .  char outfile[
6150: 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f  FILENAME_MAX]; /
6160: 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a  * Filename for *
6170: 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  out */.  const c
6180: 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65  har *zDbFilename
6190: 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ;    /* name of 
61a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
61b0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72  e */.  char *zFr
61c0: 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20  eeOnClose;      
61d0: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74     /* Filename t
61e0: 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73  o free when clos
61f0: 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
6200: 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20  har *zVfs;      
6210: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6220: 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  VFS to use */.  
6230: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
6240: 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e  tmt;   /* Curren
6250: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61  t statement if a
6260: 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70  ny. */.  FILE *p
6270: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
6280: 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74  /* Write log out
6290: 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  put here */.  in
62a0: 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20  t *aiIndent;    
62b0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
62c0: 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e   indents used in
62d0: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f   MODE_Explain */
62e0: 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20  .  int nIndent; 
62f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6300: 65 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64  e of array aiInd
6310: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ent[] */.  int i
6320: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
6330: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75    /* Index of cu
6340: 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e  rrent op in aiIn
6350: 64 65 6e 74 5b 5d 20 2a 2f 0a 23 69 66 20 64 65  dent[] */.#if de
6360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
6370: 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69  BLE_SESSION).  i
6380: 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20  nt nSession;    
6390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
63a0: 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73  er of active ses
63b0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53  sions */.  OpenS
63c0: 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b  ession aSession[
63d0: 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  4];  /* Array of
63e0: 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20   sessions.  [0] 
63f0: 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a  is in focus. */.
6400: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
6410: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
6420: 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73  llowed shellFlgs
6430: 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69   values.*/.#defi
6440: 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63  ne SHFLG_Pagecac
6450: 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  he      0x000000
6460: 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65  01 /* The --page
6470: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20  cache option is 
6480: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
6490: 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20  SHFLG_Lookaside 
64a0: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32 20       0x00000002 
64b0: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
64c0: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ory is used */.#
64d0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63  define SHFLG_Bac
64e0: 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30 30  kslash      0x00
64f0: 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d  000004 /* The --
6500: 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e  backslash option
6510: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
6520: 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72  ine SHFLG_Preser
6530: 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30 30  veRowid  0x00000
6540: 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65  008 /* .dump pre
6550: 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c  serves rowid val
6560: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ues */.#define S
6570: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20  HFLG_Newlines   
6580: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 2f      0x00000010 /
6590: 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e  * .dump --newlin
65a0: 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e  e flag */.#defin
65b0: 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  e SHFLG_CountCha
65c0: 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30 32  nges   0x0000002
65d0: 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65  0 /* .changes se
65e0: 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65  tting */.#define
65f0: 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20   SHFLG_Echo     
6600: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30        0x00000040
6610: 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65   /* .echo or --e
6620: 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a  cho setting */..
6630: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72  /*.** Macros for
6640: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74   testing and set
6650: 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a  ting shellFlgs.*
6660: 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48  /.#define ShellH
6670: 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  asFlag(P,X)    (
6680: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  ((P)->shellFlgs 
6690: 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69  & (X))!=0).#defi
66a0: 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28  ne ShellSetFlag(
66b0: 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68  P,X)    ((P)->sh
66c0: 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64  ellFlgs|=(X)).#d
66d0: 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72  efine ShellClear
66e0: 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d  Flag(P,X)  ((P)-
66f0: 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58  >shellFlgs&=(~(X
6700: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  )))../*.** These
6710: 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64   are the allowed
6720: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
6730: 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20  ne MODE_Line    
6740: 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d   0  /* One colum
6750: 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61  n per line.  Bla
6760: 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20  nk line between 
6770: 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69  records */.#defi
6780: 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20  ne MODE_Column  
6790: 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72   1  /* One recor
67a0: 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65  d per line in ne
67b0: 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64  at columns */.#d
67c0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20  efine MODE_List 
67d0: 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65      2  /* One re
67e0: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69  cord per line wi
67f0: 74 68 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a  th a separator *
6800: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53  /.#define MODE_S
6810: 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61  emi     3  /* Sa
6820: 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20  me as MODE_List 
6830: 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74  but append ";" t
6840: 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23  o each line */.#
6850: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c  define MODE_Html
6860: 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72       4  /* Gener
6870: 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62  ate an XHTML tab
6880: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  le */.#define MO
6890: 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f  DE_Insert   5  /
68a0: 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22  * Generate SQL "
68b0: 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e  insert" statemen
68c0: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
68d0: 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f  DE_Quote    6  /
68e0: 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61  * Quote values a
68f0: 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65  s for SQL */.#de
6900: 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20  fine MODE_Tcl   
6910: 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74     7  /* Generat
6920: 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20  e ANSI-C or TCL 
6930: 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20  quoted elements 
6940: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
6950: 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51  Csv      8  /* Q
6960: 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75  uote strings, nu
6970: 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20  mbers are plain 
6980: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
6990: 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c  Explain  9  /* L
69a0: 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c  ike MODE_Column,
69b0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e   but do not trun
69c0: 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65  cate data */.#de
69d0: 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20  fine MODE_Ascii 
69e0: 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43    10  /* Use ASC
69f0: 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f  II unit and reco
6a00: 72 64 20 73 65 70 61 72 61 74 6f 72 73 20 28 30  rd separators (0
6a10: 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65  x1F/0x1E) */.#de
6a20: 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79  fine MODE_Pretty
6a30: 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d    11  /* Pretty-
6a40: 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f  print schemas */
6a50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
6a60: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
6a70: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
6a80: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
6a90: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
6aa0: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
6ab0: 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a  rt",.  "quote",.
6ac0: 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22    "tcl",.  "csv"
6ad0: 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20  ,.  "explain",. 
6ae0: 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65   "ascii",.  "pre
6af0: 74 74 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f  ttyprint",.};../
6b00: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
6b10: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
6b20: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
6b30: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
6b40: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
6b50: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
6b60: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
6b70: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
6b80: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
6b90: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
6ba0: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
6bb0: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
6bc0: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
6bd0: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
6be0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
6bf0: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
6c00: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
6c10: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
6c20: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
6c30: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 4e   "\x1E"../*.** N
6c40: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
6c50: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f  s in an array.*/
6c60: 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69  .#define ArraySi
6c70: 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a  ze(X)  (int)(siz
6c80: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
6c90: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  0]))../*.** A ca
6ca0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
6cb0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
6cc0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
6cd0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
6ce0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
6cf0: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
6d00: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
6d10: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
6d20: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
6d30: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
6d40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
6d50: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
6d60: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
6d70: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
6d80: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
6d90: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  og);.}../*.** Ou
6da0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
6db0: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
6dc0: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
6dd0: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
6de0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
6df0: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
6e00: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
6e10: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
6e20: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
6e30: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
6e40: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
6e50: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
6e60: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
6e70: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
6e80: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
6e90: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
6ea0: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
6eb0: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
6ec0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
6ed0: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
6ee0: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
6ef0: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
6f00: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
6f10: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
6f20: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
6f30: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
6f40: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
6f50: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
6f60: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
6f70: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
6f80: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
6f90: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
6fa0: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
6fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
6fc0: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
6fd0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ff0: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
7000: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
7010: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
7020: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
7030: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
7040: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
7050: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
7080: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
7090: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
70a0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
70b0: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
70c0: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
70d0: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
70e0: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
70f0: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
7100: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
7110: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
7120: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
7130: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
7140: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
7150: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
7160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
7170: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
7180: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
7190: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
71a0: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
71b0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
71c0: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
71d0: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
71e0: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
71f0: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
7200: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
7210: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
7220: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
7230: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
7240: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
7250: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
7260: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
7270: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
7280: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
7290: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
72a0: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
72b0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
72c0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
72d0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
72e0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
72f0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
7300: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
7310: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
7320: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
7330: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
7340: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
7350: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
7360: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
7370: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
7380: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
7390: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
73a0: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
73b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
73c0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
73d0: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
73e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
73f0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
7400: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
7410: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
7420: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
7430: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
7440: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
7450: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
7460: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
7470: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
7480: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
7490: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
74a0: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
74b0: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
74c0: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
74d0: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
74e0: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
74f0: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
7500: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
7510: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
7520: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
7530: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
7540: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
7550: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
7560: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
7570: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
7580: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
7590: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
75a0: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
75b0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
75c0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
75d0: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
75e0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
75f0: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
7600: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
7610: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
7620: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
7630: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
7640: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
7650: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
7660: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
7670: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7680: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
7690: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
76a0: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
76b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
76c0: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
76d0: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
76e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
76f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
7700: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
7710: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
7720: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
7730: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
7740: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
7750: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
7760: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
7770: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
7780: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
7790: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
77a0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
77b0: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
77c0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
77d0: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
77e0: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
77f0: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
7800: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
7810: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
7820: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
7830: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
7840: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
7850: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
7860: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
7870: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
7880: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
7890: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
78a0: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
78b0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
78c0: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
78d0: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
78e0: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
78f0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
7900: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
7910: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
7920: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
7930: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7940: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
7950: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
7970: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
7980: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
7990: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
79a0: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
79b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
79c0: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
79d0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
79e0: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
79f0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
7a00: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
7a10: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
7a20: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
7a30: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
7a40: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
7a50: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
7a60: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
7a70: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
7a80: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
7a90: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
7aa0: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
7ab0: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
7ac0: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
7ad0: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
7ae0: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
7af0: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
7b00: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
7b10: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
7b20: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
7b30: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
7b40: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
7b50: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
7b60: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
7b70: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
7b80: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
7b90: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
7ba0: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
7bb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7bc0: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
7bd0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
7be0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
7bf0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
7c00: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
7c10: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
7c20: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
7c30: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
7c40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7c50: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
7c60: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
7c70: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
7c80: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
7c90: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
7ca0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
7cb0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
7cc0: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
7cd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7ce0: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
7cf0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
7d00: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
7d10: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
7d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
7d30: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
7d40: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
7d50: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
7d60: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
7d70: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
7d80: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
7d90: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
7da0: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
7db0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
7dc0: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
7dd0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
7de0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
7df0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
7e00: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
7e10: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
7e20: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
7e30: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
7e40: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
7e50: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
7e70: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
7e80: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
7e90: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
7ea0: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
7eb0: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
7ec0: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
7ed0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
7ee0: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
7ef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
7f00: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
7f10: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
7f20: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
7f30: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
7f40: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
7f50: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
7f60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7f70: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
7f80: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
7f90: 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
7fa0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
7fb0: 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \"' ){.      raw
7fc0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  _printf(out,"&qu
7fd0: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
7fe0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
7ff0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8000: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
8010: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8030: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
8040: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
8050: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
8060: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
8070: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
8080: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
8090: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
80a0: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
80b0: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
80c0: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
80d0: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
80e0: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
80f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8100: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8110: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8120: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8130: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8140: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8150: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
8160: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
8170: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8180: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8190: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
81a0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
81b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
81c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
81d0: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
81e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
81f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
8200: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
8210: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8220: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
8230: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
8240: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8250: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8260: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8270: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8280: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
8290: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
82a0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
82b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
82c0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
82d0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
82e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
82f0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8300: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8310: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8320: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8330: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8340: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8350: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8360: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8370: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8380: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8390: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
83a0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
83b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
83c0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
83d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
83e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
83f0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8400: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8410: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8420: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
8430: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
8440: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
8450: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
8460: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
8470: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
8480: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
8490: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
84a0: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
84b0: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
84c0: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
84d0: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
84e0: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
84f0: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
8500: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
8510: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
8520: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
8530: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
8540: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
8550: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
8560: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
8570: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
8580: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
8590: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
85a0: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
85b0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
85c0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
85d0: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
85e0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
85f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
8600: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
8610: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
8620: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
8630: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
8640: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
8650: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
8660: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
8670: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
8680: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
8690: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
86a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
86b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
86c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
86d0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
86e0: 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27 2c  .      putc('"',
86f0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f 72   out);.      for
8700: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
8710: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
8720: 69 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28 27  i]=='"' ) putc('
8730: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  "', out);.      
8740: 20 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75 74    putc(z[i], out
8750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8760: 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b   putc('"', out);
8770: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8780: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
8790: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
87a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 53 65   }.  }.  if( bSe
87b0: 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  p ){.    utf8_pr
87c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
87d0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
87e0: 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  or);.  }.}..#ifd
87f0: 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20  ef SIGINT./*.** 
8800: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
8810: 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  s when the user 
8820: 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a  presses Ctrl-C.*
8830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
8840: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
8850: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
8860: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8870: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65  (NotUsed);.  see
8880: 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20  nInterrupt++;.  
8890: 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70  if( seenInterrup
88a0: 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20  t>2 ) exit(1);. 
88b0: 20 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20   if( globalDb ) 
88c0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
88d0: 74 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 23  t(globalDb);.}.#
88e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
88f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
8900: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57  RIZATION./*.** W
8910: 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68 20 4f  hen the ".auth O
8920: 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65 20 66  N" is set, the f
8930: 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f 72 69  ollowing authori
8940: 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a  zer callback is.
8950: 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20  ** invoked.  It 
8960: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
8970: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
8980: 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41 75 74  tic int shellAut
8990: 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  h(.  void *pClie
89a0: 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70  ntData,.  int op
89b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
89c0: 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA1,.  const cha
89d0: 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20  r *zA2,.  const 
89e0: 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e  char *zA3,.  con
89f0: 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a  st char *zA4.){.
8a00: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
8a10: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
8a20: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 74  ClientData;.  st
8a30: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8a40: 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20  *azAction[] = { 
8a50: 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  0,.     "CREATE_
8a60: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20  INDEX",         
8a70: 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22 2c 20  "CREATE_TABLE", 
8a80: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
8a90: 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20  TEMP_INDEX",.   
8aa0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
8ab0: 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45 41 54  ABLE",    "CREAT
8ac0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  E_TEMP_TRIGGER",
8ad0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 56    "CREATE_TEMP_V
8ae0: 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52 45 41  IEW",.     "CREA
8af0: 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20  TE_TRIGGER",    
8b00: 20 20 20 22 43 52 45 41 54 45 5f 56 49 45 57 22     "CREATE_VIEW"
8b10: 2c 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  ,          "DELE
8b20: 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  TE",.     "DROP_
8b30: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20  INDEX",         
8b40: 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20    "DROP_TABLE", 
8b50: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
8b60: 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20  TEMP_INDEX",.   
8b70: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42    "DROP_TEMP_TAB
8b80: 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f 50 5f  LE",      "DROP_
8b90: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20  TEMP_TRIGGER",  
8ba0: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45    "DROP_TEMP_VIE
8bb0: 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  W",.     "DROP_T
8bc0: 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 20  RIGGER",        
8bd0: 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20 20 20   "DROP_VIEW",   
8be0: 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
8bf0: 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d 41 22  ",.     "PRAGMA"
8c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8c10: 22 52 45 41 44 22 2c 20 20 20 20 20 20 20 20 20  "READ",         
8c20: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 22          "SELECT"
8c30: 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41 43 54  ,.     "TRANSACT
8c40: 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 22  ION",          "
8c50: 55 50 44 41 54 45 22 2c 20 20 20 20 20 20 20 20  UPDATE",        
8c60: 20 20 20 20 20 20 20 22 41 54 54 41 43 48 22 2c         "ATTACH",
8c70: 0a 20 20 20 20 20 22 44 45 54 41 43 48 22 2c 20  .     "DETACH", 
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
8c90: 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20 20 20  LTER_TABLE",    
8ca0: 20 20 20 20 20 20 22 52 45 49 4e 44 45 58 22 2c        "REINDEX",
8cb0: 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c  .     "ANALYZE",
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
8cd0: 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c 20 20  REATE_VTABLE",  
8ce0: 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54 41 42        "DROP_VTAB
8cf0: 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e 43 54  LE",.     "FUNCT
8d00: 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ION",           
8d10: 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 20    "SAVEPOINT",  
8d20: 20 20 20 20 20 20 20 20 20 20 22 52 45 43 55 52            "RECUR
8d30: 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74  SIVE".  };.  int
8d40: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
8d50: 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d   *az[4];.  az[0]
8d60: 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20   = zA1;.  az[1] 
8d70: 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d  = zA2;.  az[2] =
8d80: 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20   zA3;.  az[3] = 
8d90: 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  zA4;.  utf8_prin
8da0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68  tf(p->out, "auth
8db0: 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41  orizer: %s", azA
8dc0: 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f  ction[op]);.  fo
8dd0: 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=0; i<4; i++)
8de0: 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
8df0: 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
8e00: 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a     if( az[i] ){.
8e10: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
8e20: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
8e30: 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [i]);.    }else{
8e40: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8e50: 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22  f(p->out, "NULL"
8e60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8e70: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
8e80: 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72  , "\n");.  retur
8e90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
8ea0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  endif../*.** Pri
8eb0: 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74 61 74  nt a schema stat
8ec0: 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f 66 20  ement.  Part of 
8ed0: 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f  MODE_Semi and MO
8ee0: 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70 75 74  DE_Pretty output
8ef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8f00: 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 73 6f  tine converts so
8f10: 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  me CREATE TABLE 
8f20: 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 73  statements for s
8f30: 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20  hadow tables.** 
8f40: 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f  in FTS3/4/5 into
8f50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46   CREATE TABLE IF
8f60: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74 61 74   NOT EXISTS stat
8f70: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
8f80: 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65  c void printSche
8f90: 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74  maLine(FILE *out
8fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
8fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
8fc0: 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  il){.  if( sqlit
8fd0: 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41  e3_strglob("CREA
8fe0: 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22  TE TABLE ['\"]*"
8ff0: 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , z)==0 ){.    u
9000: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
9010: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
9020: 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25 73   NOT EXISTS %s%s
9030: 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b  ", z+13, zTail);
9040: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
9050: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9060: 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29  %s%s", z, zTail)
9070: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9080: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
9090: 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ineN(FILE *out, 
90a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
90b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
90c0: 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a  l){.  char c = z
90d0: 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  [n];.  z[n] = 0;
90e0: 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  .  printSchemaLi
90f0: 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c  ne(out, z, zTail
9100: 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d  );.  z[n] = c;.}
9110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
9120: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
9130: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
9140: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
9150: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
9160: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
9170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
9180: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ll_callback(.  v
9190: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
91a0: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a   nArg,        /*
91b0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
91c0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  t columns */.  c
91d0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
91e0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
91f0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
9200: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
9210: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
9220: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  mes */.  int *ai
9230: 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c  Type      /* Col
9240: 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a  umn types */.){.
9250: 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c    int i;.  Shell
9260: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
9270: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20  lState*)pArg;.. 
9280: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
9290: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
92a0: 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a  ch( p->cMode ){.
92b0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
92c0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
92d0: 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  w = 5;.      if(
92e0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
92f0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
9300: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
9310: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
9320: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  = strlen30(azCol
9330: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
9340: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66   "");.        if
9350: 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65  ( len>w ) w = le
9360: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
9370: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20   if( p->cnt++>0 
9380: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
9390: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
93a0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
93b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
93c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
93d0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
93e0: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
93f0: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
9400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9410: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
9420: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
9430: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
9440: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
9470: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
9480: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
9490: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
94a0: 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e  nst int aExplain
94b0: 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31  Widths[] = {4, 1
94c0: 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20  3, 4, 4, 4, 13, 
94d0: 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f  2, 13};.      co
94e0: 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74  nst int *colWidt
94f0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f  h;.      int sho
9500: 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  wHdr;.      char
9510: 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20   *rowSep;.      
9520: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
9530: 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  DE_Column ){.   
9540: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
9550: 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  p->colWidth;.   
9560: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70       showHdr = p
9570: 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
9580: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70        rowSep = p
9590: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a  ->rowSeparator;.
95a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
95b0: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
95c0: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a  aExplainWidths;.
95d0: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
95e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  = 1;.        row
95f0: 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20  Sep = SEP_Row;. 
9600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9610: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
9620: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
9630: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
9640: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
9650: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
9660: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
9670: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
9680: 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c           w = col
9690: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
96a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
96b0: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
96c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
96d0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
96f0: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c  strlenChar(azCol
9700: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
9710: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
9720: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
9730: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
9740: 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   n = strlenChar(
9750: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
9760: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
9770: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
9780: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
9790: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
97a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
97b0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
97c0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
97d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
97e0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
97f0: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
9800: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
9810: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
9820: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
9830: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
9840: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20   w, azCol[i]);. 
9850: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
9860: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
9870: 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f  %s", i==nArg-1 ?
9880: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
9890: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
98a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
98b0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
98c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
98d0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
98e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
98f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9900: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
9910: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
9920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9930: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
9940: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
9950: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20        if( w<0 ) 
9960: 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20  w = -w;.        
9970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9980: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
9990: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
99b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
99c0: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20  %-*.*s%s",w,w,. 
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
9a90: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
9aa0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9ac0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
9ad0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9ae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
9af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
9b00: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66  nt w;.        if
9b10: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
9b20: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
9b30: 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  .           w = 
9b40: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
9b50: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
9b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
9b70: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
9b80: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d         if( p->cM
9b90: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
9ba0: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
9bb0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
9bc0: 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20  g[i])>w ){.     
9bd0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
9be0: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  har(azArg[i]);. 
9bf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9c00: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
9c10: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
9c20: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
9c30: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
9c40: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
9c50: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
9c60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
9c70: 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65  %*.s", p->aiInde
9c80: 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20  nt[p->iIndent], 
9c90: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "");.          }
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49  .          p->iI
9cb0: 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ndent++;.       
9cc0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
9cd0: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
9ce0: 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20  ut, w, azArg[i] 
9cf0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
9d00: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
9d10: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9d20: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
9d30: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
9d40: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
9d50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9d60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
9d70: 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20  DE_Semi: {   /* 
9d80: 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c  .schema and .ful
9d90: 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a  lschema output *
9da0: 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  /.      printSch
9db0: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
9dc0: 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29  azArg[0], ";\n")
9dd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9de0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
9df0: 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a  DE_Pretty: {  /*
9e00: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
9e10: 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d  llschema with --
9e20: 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  indent */.      
9e30: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
9e40: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
9e50: 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nParen = 0;.    
9e60: 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b    char cEnd = 0;
9e70: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
9e80: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d       int nLine =
9e90: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
9ea0: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
9eb0: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d     if( azArg[0]=
9ec0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9ed0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
9ee0: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56 49  rlike("CREATE VI
9ef0: 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  EW%", azArg[0], 
9f00: 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  0)==0.       || 
9f10: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
9f20: 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c 20  "CREATE TRIG%", 
9f30: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
9f40: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
9f50: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
9f60: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a  out, "%s;\n", az
9f70: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
9f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9f90: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
9fa0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
9fb0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
9fc0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   j = 0;.      fo
9fd0: 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a  r(i=0; IsSpace(z
9fe0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
9ff0: 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b     for(; (c = z[
a000: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
a010: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
a020: 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e(c) ){.        
a030: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
a040: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
a050: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
a060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
a070: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
a080: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
a090: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
a0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
a0b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a0c0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
a0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
a0e0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
a0f0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
a100: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
a110: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
a120: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
a130: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
a140: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
a150: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
a160: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e 64       if( c==cEnd
a170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a180: 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  cEnd = 0;.      
a190: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a1a0: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27 20  ='"' || c=='\'' 
a1b0: 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20 20  || c=='`' ){.   
a1c0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
a1d0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  c;.          }el
a1e0: 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
a1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
a200: 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 20  d = ']';.       
a210: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a220: 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '(' ){.         
a230: 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20     nParen++;.   
a240: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a250: 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20   c==')' ){.     
a260: 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b         nParen--;
a270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a280: 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72   nLine>0 && nPar
a290: 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a  en==0 && j>0 ){.
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
a2b0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70  intSchemaLineN(p
a2c0: 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e  ->out, z, j, "\n
a2d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
a2e0: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    j = 0;.       
a2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a300: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a   }.          z[j
a310: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  ++] = c;.       
a320: 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31     if( nParen==1
a330: 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63   && (c=='(' || c
a340: 3d 3d 27 2c 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27  ==',' || c=='\n'
a350: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a360: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a   if( c=='\n' ) j
a370: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
a380: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
a390: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
a3a0: 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  \n  ");.        
a3b0: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
a3c0: 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a         nLine++;.
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
a3e0: 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31  e( IsSpace(z[i+1
a3f0: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
a400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a410: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20   }.        z[j] 
a420: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
a430: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
a440: 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b  ne(p->out, z, ";
a450: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
a460: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
a470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a480: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
a490: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
a4a0: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
a4b0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
a4c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
a4d0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
a4e0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
a4f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
a500: 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  s",azCol[i],.   
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
a520: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
a530: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e  wSeparator : p->
a540: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
a550: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a560: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
a570: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
a580: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
a590: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
a5a0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
a5b0: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  g[i];.        if
a5c0: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e  ( z==0 ) z = p->
a5d0: 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20  nullValue;.     
a5e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
a5f0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
a600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
a610: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
a620: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
a630: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
a640: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
a650: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a660: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a670: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
a680: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
a690: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
a6a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a6b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a6c0: 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20  e MODE_Html: {. 
a6d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
a6e0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
a6f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
a700: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
a710: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
a720: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a730: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
a740: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a750: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
a760: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
a770: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
a780: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
a790: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
a7a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
a7b0: 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  H>\n");.        
a7c0: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
a7d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
a7e0: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
a7f0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
a800: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
a810: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
a820: 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20  out,"<TR>");.   
a830: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
a840: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
a850: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
a860: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
a870: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
a880: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
a890: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
a8a0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
a8b0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ue);.        raw
a8c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
a8d0: 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TD>\n");.     
a8e0: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
a8f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
a900: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
a910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a920: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
a930: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
a940: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
a950: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
a960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
a970: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a980: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
a990: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
a9a0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
a9b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
a9c0: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
a9d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
a9e0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
a9f0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
aa00: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
aa10: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
aa20: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
aa30: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
aa40: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
aa50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
aa60: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
aa70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
aa80: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
aa90: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
aaa0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
aab0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
aac0: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
aad0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
aae0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
aaf0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
ab00: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
ab10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
ab20: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
ab30: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
ab40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ab50: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
ab60: 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
ab70: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
ab80: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
ab90: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
aba0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
abb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
abc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
abd0: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
abe0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
abf0: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
ac00: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
ac10: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ac20: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ac30: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
ac40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac50: 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20  if( nArg>0 ){.  
ac60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac70: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ac80: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
ac90: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
aca0: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
acb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
acc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
acd0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
ace0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
acf0: 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
ad00: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
ad10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad20: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
ad30: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69  nsert: {.      i
ad40: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
ad50: 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  eak;.      utf8_
ad60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
ad70: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70  NSERT INTO %s",p
ad80: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
ad90: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
ada0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
adb0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
adc0: 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20  out,"(");.      
add0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ade0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
adf0: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
ae00: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ae10: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
ae20: 69 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a  if( quoteChar(az
ae30: 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  Col[i]) ){.     
ae40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
ae50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ae60: 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c  ("\"%w\"", azCol
ae70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
ae80: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ae90: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aeb0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
aec0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aed0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
aee0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
aef0: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
af00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af10: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
af20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
af30: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
af40: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
af50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
af60: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
af70: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
af80: 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20  ut, i>0 ? "," : 
af90: 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20  " VALUES(");.   
afa0: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
afb0: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
afc0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
afd0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
afe0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
aff0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
b000: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
b010: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
b020: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
b030: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
b040: 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
b050: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
b060: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
b070: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
b080: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
b090: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
b0a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b0b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
b0c0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
b0d0: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
b0e0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
b0f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b100: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
b110: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
b120: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
b130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
b140: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b150: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
b160: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
b170: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
b180: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
b190: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
b1a0: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
b1b0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
b1c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
b1d0: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
b1e0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b1f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b200: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
b210: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   r);.          r
b220: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
b230: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
b240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
b250: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
b260: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
b270: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
b280: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
b290: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
b2a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
b2b0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
b2c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
b2d0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
b2e0: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
b2f0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b300: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
b310: 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20  (p->out, pBlob, 
b320: 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  nBlob);.        
b330: 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62  }else if( isNumb
b340: 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20  er(azArg[i], 0) 
b350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
b360: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b370: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
b380: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
b390: 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  f( ShellHasFlag(
b3a0: 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  p, SHFLG_Newline
b3b0: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
b3c0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
b3d0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
b3e0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
b3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b400: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
b410: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d  scaped_string(p-
b420: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
b430: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b440: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
b450: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e  ntf(p->out,");\n
b460: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
b470: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b480: 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20  MODE_Quote: {.  
b490: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
b4a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
b4b0: 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26  if( p->cnt==0 &&
b4c0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
b4d0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
b4e0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
b500: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
b510: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
b520: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
b530: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
b540: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
b550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b560: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b570: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
b580: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b   }.      p->cnt+
b590: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  +;.      for(i=0
b5a0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b5b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
b5c0: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
b5d0: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
b5e0: 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d     if( (azArg[i]
b5f0: 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20  ==0) || (aiType 
b600: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
b610: 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
b620: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
b630: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c  ntf(p->out,"NULL
b640: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
b650: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
b660: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
b670: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
b680: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
b690: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
b6a0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
b6b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
b6c0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
b6d0: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
b6e0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
b6f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b700: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
b710: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b720: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
b730: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
b740: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
b750: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
b760: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
b770: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
b780: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
b790: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b7a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
b7b0: 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67  ntf(50,z,"%!.20g
b7c0: 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ", r);.         
b7d0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b7e0: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
b7f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b800: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
b810: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
b820: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
b830: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
b840: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
b850: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b860: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
b870: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
b880: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
b890: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
b8a0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b8b0: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
b8c0: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
b8d0: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
b8e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
b8f0: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
b900: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
b910: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b920: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
b930: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b940: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
b950: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
b960: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
b970: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
b980: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
b990: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
b9a0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
b9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b9c0: 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20   MODE_Ascii: {. 
b9d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
b9e0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
b9f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
ba00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
ba10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ba20: 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38    if( i>0 ) utf8
ba30: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ba40: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
ba50: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
ba60: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ba70: 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b  >out,"%s",azCol[
ba80: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
ba90: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "");.        }. 
baa0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
bab0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
bac0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
bad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bae0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
baf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
bb00: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
bb10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
bb20: 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  i>0 ) utf8_print
bb30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bb40: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
bb50: 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
bb60: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
bb70: 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  ",azArg[i] ? azA
bb80: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
bb90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  alue);.      }. 
bba0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
bbb0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
bbc0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
bbd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbe0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bbf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
bc00: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
bc10: 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74  k routine that t
bc20: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
bc30: 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  y.** invokes for
bc40: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
bc50: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
bc60: 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62  static int callb
bc70: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
bc80: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
bc90: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
bca0: 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63  zCol){.  /* sinc
bcb0: 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  e we don't have 
bcc0: 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20  type info, call 
bcd0: 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  the shell_callba
bce0: 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  ck with a NULL v
bcf0: 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alue */.  return
bd00: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
bd10: 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72  pArg, nArg, azAr
bd20: 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b  g, azCol, NULL);
bd30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
bd40: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
bd50: 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69  outine from sqli
bd60: 74 65 33 5f 65 78 65 63 28 29 20 74 68 61 74 20  te3_exec() that 
bd70: 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f  appends all.** o
bd80: 75 74 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65  utput onto the e
bd90: 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78  nd of a ShellTex
bda0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
bdb0: 74 69 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f  tic int captureO
bdc0: 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f  utputCallback(vo
bdd0: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
bde0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
bdf0: 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20  , char **az){.  
be00: 53 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28  ShellText *p = (
be10: 53 68 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b  ShellText*)pArg;
be20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53  .  int i;.  UNUS
be30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29  ED_PARAMETER(az)
be40: 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30  ;.  if( azArg==0
be50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
be60: 66 28 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64  f( p->n ) append
be70: 54 65 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b  Text(p, "|", 0);
be80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
be90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rg; i++){.    if
bea0: 28 20 69 20 29 20 61 70 70 65 6e 64 54 65 78 74  ( i ) appendText
beb0: 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  (p, ",", 0);.   
bec0: 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20   if( azArg[i] ) 
bed0: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a  appendText(p, az
bee0: 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a  Arg[i], 0);.  }.
bef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bf00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
bf10: 20 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c   appropriate SEL
bf20: 46 54 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74  FTEST table in t
bf30: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
bf40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bf50: 20 63 72 65 61 74 65 53 65 6c 66 74 65 73 74 54   createSelftestT
bf60: 61 62 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20  able(ShellState 
bf70: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  *p){.  char *zEr
bf80: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
bf90: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
bfa0: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73      "SAVEPOINT s
bfb0: 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22  elftest_init;\n"
bfc0: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
bfd0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
bfe0: 20 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20   selftest(\n".  
bff0: 20 20 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52    "  tno INTEGER
c000: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22   PRIMARY KEY,\n"
c010: 20 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65     /* Test numbe
c020: 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54  r */.    "  op T
c030: 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20  EXT,\n"         
c040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
c050: 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e  rator:  memo run
c060: 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54   */.    "  cmd T
c070: 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20  EXT,\n"         
c080: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
c090: 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20  and text */.    
c0a0: 22 20 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20  "  ans TEXT\n"  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 2f 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77   /* Desired answ
c0d0: 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20  er */.    ");". 
c0e0: 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
c0f0: 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65  TABLE [_shell$se
c100: 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b  lf](op,cmd,ans);
c110: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
c120: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
c130: 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29  f](rowid,op,cmd)
c140: 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
c150: 53 28 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45  S(coalesce((SELE
c160: 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30  CT (max(tno)+100
c170: 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65  )/10 FROM selfte
c180: 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20  st),10),\n".    
c190: 22 20 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27  "         'memo'
c1a0: 2c 27 54 65 73 74 73 20 67 65 6e 65 72 61 74 65  ,'Tests generate
c1b0: 64 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e  d by --init');\n
c1c0: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
c1d0: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
c1e0: 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
c1f0: 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20  T 'run',\n".    
c200: 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
c210: 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
c220: 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
c230: 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c260: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
c270: 65 72 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c  er ORDER BY 2'',
c280: 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
c290: 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
c2a0: 72 79 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c  ry('SELECT type,
c2b0: 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
c2c0: 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  l ".            
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
c2e0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
c2f0: 72 20 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32  r ORDER BY 2',22
c300: 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  4));\n".    "INS
c310: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
c320: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
c330: 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a   SELECT 'run',".
c340: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
c350: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
c360: 27 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ''SELECT * FROM 
c370: 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20  \"' ||".    "   
c380: 20 20 20 20 20 70 72 69 6e 74 66 28 27 25 77 27       printf('%w'
c390: 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f  ,name) || '\" NO
c3a0: 54 20 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29  T INDEXED'',224)
c3b0: 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
c3c0: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 70  hex(sha3_query(p
c3d0: 72 69 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20  rintf('SELECT * 
c3e0: 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20  FROM \"%w\" NOT 
c3f0: 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32  INDEXED',name),2
c400: 32 34 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46  24))\n".    "  F
c410: 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20  ROM (\n".    "  
c420: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
c430: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
c440: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 57 48  \n".    "     WH
c450: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
c460: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
c470: 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74  AND name<>'selft
c480: 65 73 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  est'\n".    "   
c490: 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65      AND coalesce
c4a0: 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e  (rootpage,0)>0\n
c4b0: 22 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20  ".    "  )\n".  
c4c0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
c4d0: 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  e;\n".    "INSER
c4e0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
c4f0: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56  elf]\n".    "  V
c500: 41 4c 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41  ALUES('run','PRA
c510: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
c520: 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20  eck','ok');\n". 
c530: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
c540: 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c  selftest(tno,op,
c550: 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20  cmd,ans)".    " 
c560: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30   SELECT rowid*10
c570: 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d  ,op,cmd,ans FROM
c580: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c   [_shell$self];\
c590: 6e 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  n".    "DROP TAB
c5a0: 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  LE [_shell$self]
c5b0: 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72  ;".    ,0,0,&zEr
c5c0: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72  rMsg);.  if( zEr
c5d0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38  rMsg ){.    utf8
c5e0: 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
c5f0: 22 53 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61  "SELFTEST initia
c600: 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  lization failure
c610: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
c620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c630: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
c640: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  }.  sqlite3_exec
c650: 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
c660: 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c   selftest_init",
c670: 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  0,0,0);.}.../*.*
c680: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
c690: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
c6a0: 64 20 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74  d of the ShellSt
c6b0: 61 74 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ate structure to
c6c0: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
c6d0: 74 68 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e  the table given.
c6e0: 20 20 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f    Escape any quo
c6f0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  te characters in
c700: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61   the.** table na
c710: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
c720: 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d  id set_table_nam
c730: 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
c740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c750: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  me){.  int i, n;
c760: 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a  .  char cQuote;.
c770: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
c780: 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  ( p->zDestTable 
c790: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a  ){.    free(p->z
c7a0: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
c7b0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
c7c0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
c7d0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
c7e0: 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65    cQuote = quote
c7f0: 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  Char(zName);.  n
c800: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d   = strlen30(zNam
c810: 65 29 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65  e);.  if( cQuote
c820: 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a   ) n += n+2;.  z
c830: 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
c840: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29   = malloc( n+1 )
c850: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
c860: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
c870: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75  tderr,"Error: ou
c880: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
c890: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
c8a0: 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  }.  n = 0;.  if(
c8b0: 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
c8c0: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72   = cQuote;.  for
c8d0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
c8e0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
c8f0: 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
c900: 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63   if( zName[i]==c
c910: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
c920: 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69   cQuote;.  }.  i
c930: 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
c940: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a  +] = cQuote;.  z
c950: 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  [n] = 0;.}.../*.
c960: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
c970: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
c980: 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  t will generate 
c990: 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69  SQL output.  Pri
c9a0: 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  nt.** the result
c9b0: 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d   columns, comma-
c9c0: 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20  separated, on a 
c9d0: 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64  line and then ad
c9e0: 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  d a.** semicolon
c9f0: 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74   terminator to t
ca00: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c  he end of that l
ca10: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ine..**.** If th
ca20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
ca30: 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61  mns is 1 and tha
ca40: 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  t column contain
ca50: 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74  s text "--".** t
ca60: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65  hen write the se
ca70: 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70  micolon on a sep
ca80: 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61  arate line.  Tha
ca90: 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22  t way, if a.** "
caa0: 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
cab0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
cac0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
cad0: 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
cae0: 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
caf0: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
cb00: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
cb10: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
cb20: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
cb30: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
cb40: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
cb50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
cb60: 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
cb70: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
cb80: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
cb90: 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
cba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
cbb0: 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
cbc0: 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
cbd0: 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
cbe0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
cbf0: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
cc00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
cc10: 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
cc20: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
cc30: 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
cc40: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
cc50: 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
cc60: 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
cc70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cc80: 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
cc90: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
cca0: 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
ccb0: 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
ccc0: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cce0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
ccf0: 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
cd00: 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
cd10: 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
cd20: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
cd30: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
cd40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
cd50: 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74  lect);.  nResult
cd60: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
cd70: 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29  n_count(pSelect)
cd80: 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
cd90: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
cda0: 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29   if( zFirstRow )
cdb0: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
cdc0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
cdd0: 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20  , zFirstRow);.  
cde0: 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20      zFirstRow = 
cdf0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  0;.    }.    z =
ce00: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
ce10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
ce20: 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
ce30: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ce40: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
ce50: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
ce60: 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
ce70: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ce80: 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
ce90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
cea0: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
ceb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cec0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
ced0: 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
cee0: 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
cef0: 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
cf00: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
cf10: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
cf20: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c  tf(p->out, "\n;\
cf30: 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
cf40: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
cf50: 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b  (p->out, ";\n");
cf60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
cf70: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
cf80: 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
cf90: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
cfa0: 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
cfb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cfc0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
cfd0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
cfe0: 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
cff0: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
d000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d010: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
d020: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
d030: 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
d040: 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
d050: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
d060: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d070: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
d080: 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
d090: 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
d0a0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
d0b0: 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
d0c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
d0e0: 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
d0f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
d100: 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
d110: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
d120: 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
d130: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
d140: 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67  malloc64(nErrMsg
d150: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
d160: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
d170: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
d180: 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
d190: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
d1a0: 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23  rn zErrMsg;.}..#
d1b0: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
d1c0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
d1d0: 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61   display I/O sta
d1e0: 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e  ts on Linux usin
d1f0: 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a  g /proc/PID/io.*
d200: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
d210: 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
d220: 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  s(FILE *out){.  
d230: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
d240: 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74   z[200];.  sqlit
d250: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
d260: 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63  of(z), z, "/proc
d270: 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28  /%d/io", getpid(
d280: 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ));.  in = fopen
d290: 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  (z, "rb");.  if(
d2a0: 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
d2b0: 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
d2c0: 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e  z, sizeof(z), in
d2d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )!=0 ){.    stat
d2e0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
d2f0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d300: 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20  ar *zPattern;.  
d310: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d320: 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72  zDesc;.    } aTr
d330: 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ans[] = {.      
d340: 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20  { "rchar: ",    
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
d360: 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79  ytes received by
d370: 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20   read():" },.   
d380: 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20     { "wchar: ", 
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20   "Bytes sent to 
d3b0: 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a  write():"    },.
d3c0: 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20        { "syscr: 
d3d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d3e0: 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74      "Read() syst
d3f0: 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20  em calls:"      
d400: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
d410: 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  w: ",           
d420: 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20         "Write() 
d430: 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
d440: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72     },.      { "r
d450: 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ead_bytes: ",   
d460: 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
d470: 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61   read from stora
d480: 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b  ge:"  },.      {
d490: 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22   "write_bytes: "
d4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79  ,            "By
d4b0: 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  tes written to s
d4c0: 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20  torage:" },.    
d4d0: 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77    { "cancelled_w
d4e0: 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
d4f0: 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65  "Cancelled write
d500: 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20   bytes:"    },. 
d510: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
d520: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d530: 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73  ArraySize(aTrans
d540: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
d550: 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
d560: 65 6e 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  en(aTrans[i].zPa
d570: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66  ttern);.      if
d580: 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73  ( strncmp(aTrans
d590: 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c  [i].zPattern, z,
d5a0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
d5b0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
d5c0: 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61  t, "%-36s %s", a
d5d0: 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20  Trans[i].zDesc, 
d5e0: 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[n]);.        
d5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d600: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73     }.  }.  fclos
d610: 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e(in);.}.#endif.
d620: 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61  ./*.** Display a
d630: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
d640: 73 74 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d  status using 64-
d650: 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  bit values..*/.s
d660: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
d670: 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68  ayStatLine(.  Sh
d680: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20  ellState *p,    
d690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
d6a0: 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  hell context */.
d6b0: 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20    char *zLabel, 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d6d0: 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e  abel for this on
d6e0: 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  e line */.  char
d6f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20   *zFormat,      
d700: 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20        /* Format 
d710: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a  for the result *
d720: 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73 43  /.  int iStatusC
d730: 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  trl,          /*
d740: 20 57 68 69 63 68 20 73 74 61 74 75 73 20 74 6f   Which status to
d750: 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e   display */.  in
d760: 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
d770: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d780: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
d790: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
d7a0: 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20  e3_int64 iCur = 
d7b0: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  -1;.  sqlite3_in
d7c0: 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b  t64 iHiwtr = -1;
d7d0: 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65  .  int i, nPerce
d7e0: 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65  nt;.  char zLine
d7f0: 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
d800: 5f 73 74 61 74 75 73 36 34 28 69 53 74 61 74 75  _status64(iStatu
d810: 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69  sCtrl, &iCur, &i
d820: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
d830: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63    for(i=0, nPerc
d840: 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69  ent=0; zFormat[i
d850: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
d860: 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27   zFormat[i]=='%'
d870: 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20   ) nPercent++;. 
d880: 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e   }.  if( nPercen
d890: 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>1 ){.    sqlit
d8a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
d8b0: 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65  of(zLine), zLine
d8c0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c  , zFormat, iCur,
d8d0: 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73   iHiwtr);.  }els
d8e0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
d8f0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
d900: 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46  Line), zLine, zF
d910: 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a  ormat, iHiwtr);.
d920: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
d930: 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20  (p->out, "%-36s 
d940: 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a  %s\n", zLabel, z
d950: 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Line);.}../*.** 
d960: 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  Display memory s
d970: 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
d980: 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74  int display_stat
d990: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
d9a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d9b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
d9c0: 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
d9d0: 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
d9e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d9f0: 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
da00: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
da30: 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
da40: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  {.  int iCur;.  
da50: 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69  int iHiwtr;..  i
da60: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
da70: 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69 73 70  >out ){.    disp
da80: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
da90: 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22  , "Memory Used:"
daa0: 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28  ,.       "%lld (
dab0: 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
dac0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
dad0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65  MEMORY_USED, bRe
dae0: 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  set);.    displa
daf0: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
db00: 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74  "Number of Outst
db10: 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f  anding Allocatio
db20: 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  ns:",.       "%l
db30: 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20  ld (max %lld)", 
db40: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
db50: 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73  LLOC_COUNT, bRes
db60: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72  et);.    if( pAr
db70: 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
db80: 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
db90: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 53  {.      displayS
dba0: 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
dbb0: 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
dbc0: 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20  Pages Used:",.  
dbd0: 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
dbe0: 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20  x %lld) pages", 
dbf0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
dc00: 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52  GECACHE_USED, bR
dc10: 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eset);.    }.   
dc20: 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
dc30: 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
dc40: 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c 6f  f Pcache Overflo
dc50: 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20 20  w Bytes:",.     
dc60: 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
dc70: 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
dc80: 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
dc90: 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65  HE_OVERFLOW, bRe
dca0: 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  set);.    displa
dcb0: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
dcc0: 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74  "Largest Allocat
dcd0: 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ion:",.       "%
dce0: 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
dcf0: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
dd00: 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a  _SIZE, bReset);.
dd10: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
dd20: 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65  ine(pArg, "Large
dd30: 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
dd40: 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22  tion:",.       "
dd50: 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
dd60: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
dd70: 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65  ACHE_SIZE, bRese
dd80: 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41  t);.#ifdef YYTRA
dd90: 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a  CKMAXSTACKDEPTH.
dda0: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
ddb0: 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65  ine(pArg, "Deepe
ddc0: 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a  st Parser Stack:
ddd0: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
dde0: 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c  (max %lld)", SQL
ddf0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45  ITE_STATUS_PARSE
de00: 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29  R_STACK, bReset)
de10: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
de20: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
de30: 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b 0a 20  ->out && db ){. 
de40: 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
de50: 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
de60: 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
de70: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
de80: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
de90: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
dea0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
deb0: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
dec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ded0: 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
dee0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
def0: 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
df00: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
df20: 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
df30: 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
df40: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
df50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
df60: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
df70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
df80: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
df90: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
dfa0: 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
dfd0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
dfe0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
dff0: 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
e000: 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
e010: 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
e020: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e030: 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
e040: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
e050: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
e060: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
e070: 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
e0a0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
e0b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e0c0: 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
e0d0: 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
e0e0: 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
e0f0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
e100: 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
e110: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
e120: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
e130: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
e140: 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
e170: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
e180: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e190: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
e1a0: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
e1b0: 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
e1c0: 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
e1d0: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
e1e0: 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
e1f0: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
e200: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
e210: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
e220: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
e230: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
e240: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
e250: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
e260: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
e270: 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
e290: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
e2a0: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
e2b0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
e2c0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
e2d0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
e2e0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
e2f0: 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
e300: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
e310: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
e320: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
e330: 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
e350: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
e360: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
e370: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
e380: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
e390: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
e3a0: 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
e3b0: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
e3c0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
e3d0: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
e3e0: 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
e400: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
e410: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
e420: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
e430: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
e440: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
e450: 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
e460: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
e470: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
e480: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
e490: 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
e4b0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
e4c0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
e4d0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
e4e0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
e4f0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
e500: 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75  CHEMA_USED, &iCu
e510: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
e520: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
e530: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
e540: 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67  Schema Heap Usag
e550: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
e560: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
e570: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
e580: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
e590: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
e5a0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
e5b0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
e5c0: 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44  STATUS_STMT_USED
e5d0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
e5e0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
e5f0: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
e600: 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20  out, "Statement 
e610: 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55  Heap/Lookaside U
e620: 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79  sage:      %d by
e630: 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
e640: 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a      iCur);.  }..
e650: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
e660: 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26 26  rg->out && db &&
e670: 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a   pArg->pStmt ){.
e680: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
e690: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
e6a0: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
e6b0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
e6c0: 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20  LLSCAN_STEP,.   
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 73              bRes
e6f0: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
e700: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
e710: 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
e740: 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
e750: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
e760: 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
e770: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
e780: 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
e790: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e7a0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20  Arg->out, "Sort 
e7b0: 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20  Operations:     
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
e7e0: 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
e7f0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
e800: 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
e810: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
e820: 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20  INDEX,bReset);. 
e830: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
e840: 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e  rg->out, "Autoin
e850: 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20  dex Inserts:    
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
e870: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
e880: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
e890: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
e8a0: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
e8b0: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
e8c0: 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
e8d0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
e8e0: 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c 20  ->out, "Virtual 
e8f0: 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20 20  Machine Steps:  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
e910: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
e920: 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
e930: 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
e940: 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
e950: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
e960: 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
e970: 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
e980: 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
e990: 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
e9a0: 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
e9b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
e9c0: 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
e9d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e9e0: 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
e9f0: 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
ea00: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
ea10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
ea20: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
ea30: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
ea60: 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
ea70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
ea80: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
ea90: 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
eaa0: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
eab0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
eac0: 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
ead0: 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
eae0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
eaf0: 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
eb00: 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
eb10: 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
eb20: 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
eb30: 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
eb40: 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
eb50: 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
eb60: 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
eb70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
eb80: 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
eb90: 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
eba0: 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
ebb0: 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
ebc0: 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
ebd0: 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
ebe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
ebf0: 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
ec00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
ec10: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
ec20: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
ec30: 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
ec40: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
ec50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ec60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
ec70: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
ec80: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
ec90: 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
eca0: 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
ecb0: 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
ecc0: 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
ecd0: 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
ece0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
ecf0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
ed00: 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
ed10: 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
ed20: 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
ed30: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
ed40: 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
ed50: 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
ed60: 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
ed70: 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
ed80: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
ed90: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
eda0: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
edb0: 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
edc0: 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
edd0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
ede0: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
edf0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
ee00: 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
ee10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ee20: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
ee30: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
ee40: 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
ee50: 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
ee60: 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
ee70: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
ee80: 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
ee90: 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
eea0: 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
eeb0: 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
eec0: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
eed0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
eee0: 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
eef0: 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
ef00: 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
ef10: 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
ef20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
ef30: 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
ef40: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
ef50: 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
ef60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
ef70: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
ef80: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
efb0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
efc0: 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
efd0: 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
efe0: 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
eff0: 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
f000: 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
f010: 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
f020: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
f030: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
f040: 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
f050: 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
f060: 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
f070: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
f080: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
f090: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
f0a0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
f0b0: 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
f0c0: 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
f0d0: 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
f0e0: 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
f0f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
f100: 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
f110: 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
f120: 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
f130: 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
f140: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
f150: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
f160: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
f170: 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
f180: 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
f190: 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
f1a0: 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
f1b0: 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
f1c0: 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
f1d0: 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
f1e0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
f1f0: 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
f200: 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
f210: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
f220: 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
f230: 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
f240: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
f250: 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
f260: 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
f270: 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
f280: 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
f290: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
f2a0: 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
f2b0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
f2c0: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
f2d0: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
f2e0: 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
f2f0: 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
f300: 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
f310: 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
f320: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
f330: 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
f340: 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
f350: 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
f360: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
f370: 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
f380: 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
f390: 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
f3a0: 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
f3b0: 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
f3c0: 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
f3d0: 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
f3e0: 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
f3f0: 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
f400: 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
f410: 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
f420: 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
f430: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
f440: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
f450: 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
f460: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
f470: 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
f480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f490: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
f4a0: 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
f4b0: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
f4c0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
f4d0: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
f4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
f4f0: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
f500: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
f510: 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
f520: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
f530: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f540: 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
f550: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
f560: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
f570: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
f580: 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
f590: 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
f5a0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f5d0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
f5e0: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
f5f0: 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
f600: 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
f610: 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
f620: 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
f630: 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20 20  "SorterNext",.  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 20 22 4e 65 78 74 49 66           "NextIf
f660: 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f 70  Open", "PrevIfOp
f670: 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73  en", 0 };.  cons
f680: 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b  t char *azYield[
f690: 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22  ] = { "Yield", "
f6a0: 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54  SeekLT", "SeekGT
f6b0: 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c  ", "RowSetRead",
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
f6e0: 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f  wind", 0 };.  co
f6f0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f  nst char *azGoto
f700: 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30  [] = { "Goto", 0
f710: 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f   };..  /* Try to
f720: 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20 74   figure out if t
f730: 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  his is really an
f740: 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
f750: 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a 2a  nt. If this.  **
f760: 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69 66   cannot be verif
f770: 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ied, return earl
f780: 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  y.  */.  if( sql
f790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
f7a0: 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20  t(pSql)!=8 ){.  
f7b0: 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
f7c0: 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  mode;.    return
f7d0: 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73  ;.  }.  zSql = s
f7e0: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
f7f0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
f800: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
f810: 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20  z=zSql; *z==' ' 
f820: 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a  || *z=='\t' || *
f830: 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\n' || *z=='
f840: 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b  \f' || *z=='\r';
f850: 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c   z++);.  if( sql
f860: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
f870: 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20 29   "explain", 7) )
f880: 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
f890: 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
f8a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
f8b0: 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52  (iOp=0; SQLITE_R
f8c0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
f8d0: 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a  (pSql); iOp++){.
f8e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
f8f0: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
f900: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
f910: 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  ql, 0);.    cons
f920: 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63  t char *zOp = (c
f930: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
f940: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
f950: 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a  Sql, 1);..    /*
f960: 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20 50   Set p2 to the P
f970: 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  2 field of the c
f980: 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54  urrent opcode. T
f990: 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  hen, assuming th
f9a0: 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73 20  at.    ** p2 is 
f9b0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  an instruction a
f9c0: 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72 69  ddress, set vari
f9d0: 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68 65  able p2op to the
f9e0: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a 20   index of that. 
f9f0: 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
fa00: 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65 6e  n in the aiInden
fa10: 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61 6e  t[] array. p2 an
fa20: 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64 69  d p2op may be di
fa30: 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20 2a  fferent if.    *
fa40: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  * the current in
fa50: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61 72  struction is par
fa60: 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67 72  t of a sub-progr
fa70: 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  am generated by 
fa80: 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74 72  an.    ** SQL tr
fa90: 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67 6e  igger or foreign
faa0: 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e   key.  */.    in
fab0: 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63  t p2 = sqlite3_c
fac0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
fad0: 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f 70  3);.    int p2op
fae0: 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69 41   = (p2 + (iOp-iA
faf0: 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ddr));..    /* G
fb00: 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e 64  row the p->aiInd
fb10: 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65 71  ent array as req
fb20: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
fb30: 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a   iOp>=nAlloc ){.
fb40: 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30        if( iOp==0
fb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
fb60: 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69 63  o further verfic
fb70: 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73 20  ation that this 
fb80: 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70 75  is explain outpu
fb90: 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20 20  t.  Abort if.   
fba0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
fbb0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61  t */.        sta
fbc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
fbd0: 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20  explainCols[] = 
fbe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 64  {.           "ad
fbf0: 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22  dr", "opcode", "
fc00: 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c  p1", "p2", "p3",
fc10: 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f   "p4", "p5", "co
fc20: 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20  mment" };.      
fc30: 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20    int jj;.      
fc40: 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41    for(jj=0; jj<A
fc50: 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69 6e  rraySize(explain
fc60: 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  Cols); jj++){.  
fc70: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
fc80: 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  mp(sqlite3_colum
fc90: 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c  n_name(pSql,jj),
fca0: 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29  explainCols[jj])
fcb0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
fcc0: 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
fcd0: 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  >mode;.         
fce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
fcf0: 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  (pSql);.        
fd00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
fd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fd20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fd30: 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20  nAlloc += 100;. 
fd40: 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74       p->aiIndent
fd50: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
fd60: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69  _realloc64(p->ai
fd70: 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73  Indent, nAlloc*s
fd80: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
fd90: 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e     abYield = (in
fda0: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
fdb0: 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41  oc64(abYield, nA
fdc0: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29  lloc*sizeof(int)
fdd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59  );.    }.    abY
fde0: 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f  ield[iOp] = str_
fdf0: 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
fe00: 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61  Yield);.    p->a
fe10: 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30  iIndent[iOp] = 0
fe20: 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74  ;.    p->nIndent
fe30: 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69   = iOp+1;..    i
fe40: 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  f( str_in_array(
fe50: 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a  zOp, azNext) ){.
fe60: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
fe70: 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
fe80: 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
fe90: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
fea0: 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
feb0: 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32  p, azGoto) && p2
fec0: 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20  op<p->nIndent.  
fed0: 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70     && (abYield[p
fee0: 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f  2op] || sqlite3_
fef0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
ff00: 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20   2)).    ){.    
ff10: 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c    for(i=p2op; i<
ff20: 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49  iOp; i++) p->aiI
ff30: 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20  ndent[i] += 2;. 
ff40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69     }.  }..  p->i
ff50: 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71  Indent = 0;.  sq
ff60: 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69 65  lite3_free(abYie
ff70: 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ld);.  sqlite3_r
ff80: 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f  eset(pSql);.}../
ff90: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72  *.** Free the ar
ffa0: 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ray allocated by
ffb0: 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
ffc0: 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  epare()..*/.stat
ffd0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
ffe0: 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c  data_delete(Shel
fff0: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71  lState *p){.  sq
10000 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
10010 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69  Indent);.  p->ai
10020 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  Indent = 0;.  p-
10030 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >nIndent = 0;.  
10040 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
10050 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  }../*.** Disable
10060 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77 68   and restore .wh
10070 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73 65  eretrace and .se
10080 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69 6e  lecttrace settin
10090 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  gs..*/.#if defin
100a0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
100b0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
100c0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
100d0 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e  TRACE).extern in
100e0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  t sqlite3SelectT
100f0 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74  race;.static int
10100 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
10110 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
10120 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
10130 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
10140 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
10150 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20  RETRACE).extern 
10160 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
10170 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
10180 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63  t savedWhereTrac
10190 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  e;.#endif.static
101a0 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64 65   void disable_de
101b0 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
101c0 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
101d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
101e0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
101f0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
10200 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53 65  TRACE).  savedSe
10210 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c 69  lectTrace = sqli
10220 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  te3SelectTrace;.
10230 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
10240 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
10250 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
10260 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
10270 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
10280 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
10290 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63    savedWhereTrac
102a0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
102b0 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
102c0 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a  WhereTrace = 0;.
102d0 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20  #endif.}.static 
102e0 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65 62  void restore_deb
102f0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76  ug_trace_modes(v
10300 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  oid){.#if define
10310 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
10320 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
10330 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
10340 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 53  RACE).  sqlite3S
10350 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61 76  electTrace = sav
10360 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23  edSelectTrace;.#
10370 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
10380 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
10390 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
103a0 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
103b0 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57 68  ACE).  sqlite3Wh
103c0 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65 64  ereTrace = saved
103d0 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
103e0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  if.}../*.** Run 
103f0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
10400 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ment.*/.static v
10410 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72 65  oid exec_prepare
10420 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53  d_stmt(.  ShellS
10430 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10460 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
10470 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ate */.  sqlite3
10480 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20  _stmt *pStmt,   
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
104b0 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  tment to run */.
104c0 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
104d0 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
104e0 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
104f0 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
10500 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
10510 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
10520 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
10530 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
10540 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
10550 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
10560 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
10570 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
10580 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
10590 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
105a0 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
105b0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
105c0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
105d0 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
105e0 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65     /* if we have
105f0 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 2a   a callback... *
10600 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62  /.    if( xCallb
10610 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ack ){.      /* 
10620 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
10630 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
10640 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
10650 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  type */.      in
10660 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
10670 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
10680 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  tmt);.      void
10690 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65   *pData = sqlite
106a0 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f  3_malloc64(3*nCo
106b0 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  l*sizeof(const c
106c0 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20  har*) + 1);.    
106d0 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
106e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
106f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10710 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20  char **azCols = 
10720 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20  (char **)pData; 
10730 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66       /* Names of
10740 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
10750 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
10760 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f  **azVals = &azCo
10770 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20  ls[nCol];       
10780 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20  /* Results */.  
10790 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
107a0 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
107b0 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
107c0 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
107d0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
107e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 73          assert(s
107f0 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69  izeof(int) <= si
10800 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20  zeof(char *));. 
10810 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f         /* save o
10820 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
10830 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
10840 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
10850 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10860 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20      azCols[i] = 
10870 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
10880 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
10890 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, i);.        }
108a0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
108b0 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
108c0 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
108d0 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
108e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
108f0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
10900 20 20 20 20 20 20 20 20 20 20 61 69 54 79 70 65            aiType
10910 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74  s[i] = x = sqlit
10920 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
10930 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
10940 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
10950 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
10960 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
10970 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
10990 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
109a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
109b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
109c0 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
109d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
109e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
109f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
10a00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
10a10 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
10a20 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
10a30 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
10a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10a50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10a60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
10a70 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20  /* from for */. 
10a80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10a90 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
10aa0 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
10ab0 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64    /* if data and
10ac0 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64   types extracted
10ad0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e   successfully...
10ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
10af0 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
10b00 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
10b10 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75    /* call the su
10b20 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20  pplied callback 
10b30 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
10b40 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  row data */.    
10b50 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61 6c          if( xCal
10b60 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c  lback(pArg, nCol
10b70 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73  , azVals, azCols
10b80 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20  , aiTypes) ){.  
10b90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
10ba0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
10bb0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
10bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
10bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
10be0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
10bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10c00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 77 68    }.        } wh
10c10 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20  ile( SQLITE_ROW 
10c20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20  == rc );.       
10c30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
10c40 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
10c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
10c60 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o{.        rc = 
10c70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
10c80 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77 68 69  mt);.      } whi
10c90 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45  le( rc == SQLITE
10ca0 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a 20 20  _ROW );.    }.  
10cb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
10cc0 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
10cd0 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
10ce0 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61  nts.  Print.** a
10cf0 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63  ny result rows/c
10d00 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67  olumns depending
10d10 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
10d20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20  mode.** set via 
10d30 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
10d40 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
10d50 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
10d60 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
10d70 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
10d80 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xec().** functio
10d90 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
10da0 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
10db0 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a  ferent callback.
10dc0 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
10dd0 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
10de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
10df0 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74  ll_exec(.  sqlit
10e00 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
10e30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
10e40 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
10e70 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a  o be evaluated *
10e80 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
10e90 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
10ea0 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
10eb0 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  *),   /* Callbac
10ec0 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f            /* (no
10f00 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  t the same as sq
10f10 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20  lite3_exec) */. 
10f20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
10f30 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
10f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10f50 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
10f60 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
10f70 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
10fa0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
10fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
10fc0 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
10fd0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
10fe0 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
10ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11000 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
11010 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
11020 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 2c 20  e */.  int rc2, 
11030 72 63 33 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc3;.  const cha
11040 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
11050 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
11060 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
11070 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72  L */..  if( pzEr
11080 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45  rMsg ){.    *pzE
11090 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrMsg = NULL;.  
110a0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  }..  while( zSql
110b0 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
110c0 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
110d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
110e0 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
110f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
11100 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
11110 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
11120 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
11130 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
11140 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
11150 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
11160 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
11170 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
11180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11190 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
111a0 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
111b0 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
111c0 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
111d0 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
111e0 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
111f0 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
11200 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
11210 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
11220 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
11230 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
11240 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
11250 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
11260 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
11270 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
11280 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
11290 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
112a0 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
112b0 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
112c0 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
112d0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
112e0 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
112f0 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
11300 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
11310 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
11320 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
11330 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
11340 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
11350 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
11360 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
11370 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
11380 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
11390 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
113a0 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
113b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
113c0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
113d0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
113e0 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
113f0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
11400 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
11410 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
11420 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
11430 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
11440 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
11450 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
11460 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41  3_strlike("EXPLA
11470 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29  IN%",zStmtSql,0)
11480 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
11490 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
114a0 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63  plain;.        c
114b0 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20  har *zEQP;.     
114c0 20 20 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67     disable_debug
114d0 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a  _trace_modes();.
114e0 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73          zEQP = s
114f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11500 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
11510 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c  AN %s", zStmtSql
11520 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
11530 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
11540 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c  v2(db, zEQP, -1,
11550 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
11560 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
11570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11580 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71         while( sq
11590 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
115a0 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ain)==SQLITE_ROW
115b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
115c0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
115d0 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64  >out,"--EQP-- %d
115e0 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ,",sqlite3_colum
115f0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
11600 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0));.           
11610 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11620 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c  ->out,"%d,", sql
11630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
11640 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20  pExplain, 1));. 
11650 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
11660 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11670 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63  "%d,", sqlite3_c
11680 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
11690 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20 20 20  in, 2));.       
116a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
116b0 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e  (pArg->out,"%s\n
116c0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
116d0 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
116e0 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3));.          
116f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
11700 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
11710 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
11720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11730 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
11740 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
11750 74 6f 45 51 50 3e 3d 32 20 29 7b 0a 20 20 20 20  toEQP>=2 ){.    
11760 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f        /* Also do
11770 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20   an EXPLAIN for 
11780 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65  ".eqp full" mode
11790 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
117a0 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  QP = sqlite3_mpr
117b0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73  intf("EXPLAIN %s
117c0 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20  ", zStmtSql);.  
117d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
117e0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
117f0 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
11800 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
11810 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
11820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11830 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
11840 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
11850 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  in;.            
11860 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
11870 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c  pare(pArg, pExpl
11880 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
11890 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
118a0 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c  stmt(pArg, pExpl
118b0 61 69 6e 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b  ain, xCallback);
118c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70  .            exp
118d0 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
118e0 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
118f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
11900 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11910 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
11920 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11930 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  (zEQP);.        
11940 7d 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f 72  }.        restor
11950 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
11960 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  des();.      }..
11970 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
11980 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
11990 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f  cMode = pArg->mo
119a0 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
119b0 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69  pArg->autoExplai
119c0 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  n.         && sq
119d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
119e0 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20  nt(pStmt)==8.   
119f0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
11a00 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
11a10 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29  N%", zStmtSql,0)
11a20 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
11a30 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
11a40 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
11a50 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ain;.        }..
11a60 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
11a70 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
11a80 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
11a90 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
11aa0 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
11ab0 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
11ac0 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
11ad0 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
11ae0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
11af0 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
11b00 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
11b10 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
11b20 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
11b30 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
11b40 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
11b50 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
11b60 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
11b70 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  , xCallback);.  
11b80 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
11b90 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a  _delete(pArg);..
11ba0 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
11bb0 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
11bc0 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
11bd0 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
11be0 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
11bf0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
11c00 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
11c10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11c20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
11c30 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
11c40 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
11c50 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
11c60 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
11c70 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
11c80 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
11c90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11ca0 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
11cb0 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
11cc0 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
11cd0 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
11ce0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
11cf0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
11d00 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
11d10 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
11d20 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
11d30 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
11d40 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
11d50 20 20 20 20 20 72 63 33 20 3d 20 73 71 6c 69 74       rc3 = sqlit
11d60 65 33 5f 73 74 6d 74 5f 72 65 74 72 79 61 62 6c  e3_stmt_retryabl
11d70 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
11d80 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
11d90 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
11da0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11db0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d  ITE_NOMEM ) rc =
11dc0 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20   rc2;.      if( 
11dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11de0 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
11df0 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
11e00 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
11e10 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
11e20 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  l++;.      }else
11e30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
11e40 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
11e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
11e60 63 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c3 ){.          
11e70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11e80 67 2d 3e 6f 75 74 2c 20 22 42 75 73 79 3a 20 6d  g->out, "Busy: m
11e90 69 67 68 74 20 73 75 63 63 65 65 64 20 6f 6e 20  ight succeed on 
11ea0 72 65 74 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  retry\n");.     
11eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11ec0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
11ed0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 42  tf(pArg->out, "B
11ee0 75 73 79 3a 20 63 61 6e 6e 6f 74 20 73 75 63 63  usy: cannot succ
11ef0 65 65 64 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 72  eed - rollback r
11f00 65 71 75 69 72 65 64 5c 6e 22 29 3b 0a 20 20 20  equired\n");.   
11f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11f20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
11f30 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
11f40 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
11f50 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
11f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11f70 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
11f80 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
11f90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
11fa0 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
11fb0 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
11fc0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
11fd0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
11fe0 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
11ff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12000 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
12010 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
12020 61 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c  ated by tableCol
12030 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  umnList()..*/.st
12040 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f  atic void freeCo
12050 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a  lumnList(char **
12060 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  azCol){.  int i;
12070 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f  .  for(i=1; azCo
12080 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
12090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
120a0 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ol[i]);.  }.  /*
120b0 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73   azCol[0] is a s
120c0 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a  tatic string */.
120d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
120e0 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zCol);.}../*.** 
120f0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
12100 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72   pointers to str
12110 69 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74  ings which are t
12120 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a  he names of all.
12130 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  ** columns in ta
12140 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20  ble zTab.   The 
12150 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  memory to hold t
12160 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61  he names is dyna
12170 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
12180 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65  ated and must be
12190 20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65   released by the
121a0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20   caller using a 
121b0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
121c0 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e  ** to freeColumn
121d0 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  List()..**.** Th
121e0 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79  e azCol[0] entry
121f0 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c   is usually NULL
12200 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a  .  However, if z
12210 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  Tab contains a r
12220 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68  owid.** value th
12230 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
12240 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61  reserved, then a
12250 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65  zCol[0] is fille
12260 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a  d in with the.**
12270 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77   name of the row
12280 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  id column..**.**
12290 20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c   The first regul
122a0 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ar column in the
122b0 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b   table is azCol[
122c0 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  1].  The list is
122d0 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62   terminated.** b
122e0 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  y an entry with 
122f0 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a  azCol[i]==0..*/.
12300 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61  static char **ta
12310 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68  bleColumnList(Sh
12320 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
12330 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
12340 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
12350 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
12360 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
12370 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e  r *zSql;.  int n
12380 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Col = 0;.  int n
12390 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74  Alloc = 0;.  int
123a0 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20   nPK = 0;       
123b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49  /* Number of PRI
123c0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
123d0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
123e0 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  sIPK = 0;     /*
123f0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49   True if one PRI
12400 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
12410 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  of type INTEGER 
12420 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76  */.  int preserv
12430 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61  eRowid = ShellHa
12440 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  sFlag(p, SHFLG_P
12450 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20  reserveRowid);. 
12460 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c   int rc;..  zSql
12470 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12480 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
12490 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29  _info=%Q", zTab)
124a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
124b0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
124c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
124d0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
124e0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
124f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12500 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
12510 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12520 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
12530 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41      if( nCol>=nA
12540 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20  lloc-2 ){.      
12550 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a  nAlloc = nAlloc*
12560 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20  2 + nCol + 10;. 
12570 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c       azCol = sql
12580 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43  ite3_realloc(azC
12590 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ol, nAlloc*sizeo
125a0 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  f(azCol[0]));.  
125b0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
125c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
125d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
125e0 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
125f0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
12600 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
12610 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43   }.    }.    azC
12620 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c  ol[++nCol] = sql
12630 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
12640 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
12650 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
12660 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
12670 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
12680 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  tmt, 5) ){.     
12690 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nPK++;.      if
126a0 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20  ( nPK==1.       
126b0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
126c0 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
126d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
126e0 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20  ext(pStmt,2),.  
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 20 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52          "INTEGER
12710 22 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  ")==0.      ){. 
12720 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31         isIPK = 1
12730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12740 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30         isIPK = 0
12750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12760 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
12770 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
12780 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20   azCol[0] = 0;. 
12790 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d   azCol[nCol+1] =
127a0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65   0;..  /* The de
127b0 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65  cision of whethe
127c0 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64  r or not a rowid
127d0 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f   really needs to
127e0 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20   be preserved.  
127f0 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57  ** is tricky.  W
12800 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  e never need to 
12810 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64  preserve a rowid
12820 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
12830 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20  OWID table.  ** 
12840 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
12850 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
12860 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20  RY KEY.  We are 
12870 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72  unable to preser
12880 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f  ve.  ** rowids o
12890 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74  n tables where t
128a0 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63  he rowid is inac
128b0 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65  cessible because
128c0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
128d0 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  .  ** columns in
128e0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
128f0 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
12900 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a  d_", and "oid"..
12910 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65    */.  if( prese
12920 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50  rveRowid && isIP
12930 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
12940 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20   single PRIMARY 
12950 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  KEY column with 
12960 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73  type INTEGER was
12970 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20   seen, then it. 
12980 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61     ** might be a
12990 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20  n alise for the 
129a0 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d  ROWID.  But it m
129b0 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57  ight also be a W
129c0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
129d0 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49   ** table or a I
129e0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
129f0 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20  EY DESC column, 
12a00 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
12a10 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   are.    ** ROWI
12a20 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64  D aliases.  To d
12a30 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65  istinguish these
12a40 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f   cases, check to
12a50 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
12a60 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65  here is a "pk" e
12a70 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20  ntry in "PRAGMA 
12a80 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68  index_list".  Th
12a90 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ere will be.    
12aa0 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78  ** no "pk" index
12ab0 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   if the PRIMARY 
12ac0 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  KEY really is an
12ad0 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
12ae0 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  OWID..    */.   
12af0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
12b00 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
12b10 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e  1 FROM pragma_in
12b20 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20  dex_list(%Q)".  
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
12b50 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a   origin='pk'", z
12b60 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Tab);.    rc = s
12b70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
12b80 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
12b90 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
12ba0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12bb0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
12bc0 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43  c ){.      freeC
12bd0 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
12be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
12bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12c00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
12c10 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
12c20 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
12c30 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52  );.    preserveR
12c40 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54  owid = rc==SQLIT
12c50 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  E_ROW;.  }.  if(
12c60 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29   preserveRowid )
12c70 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72  {.    /* Only pr
12c80 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64  eserve the rowid
12c90 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20   if we can find 
12ca0 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f  a name to use fo
12cb0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77  r the.    ** row
12cc0 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  id */.    static
12cd0 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d   char *azRowid[]
12ce0 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f   = { "rowid", "_
12cf0 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d  rowid_", "oid" }
12d00 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
12d10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
12d20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
12d30 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=1; i<=nCol; 
12d40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
12d50 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
12d60 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43  p(azRowid[j],azC
12d70 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  ol[i])==0 ) brea
12d80 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
12d90 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20   if( i>nCol ){. 
12da0 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
12db0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
12dc0 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d   that azRowid[j]
12dd0 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
12de0 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20   of any.        
12df0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  ** ordinary colu
12e00 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  mn in the table.
12e10 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a    Verify that az
12e20 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61  Rowid[j] is a va
12e30 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  lid.        ** n
12e40 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  ame for the rowi
12e50 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20  d before adding 
12e60 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20  it to azCol[0]. 
12e70 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
12e80 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
12e90 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20   will fail this 
12ea0 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20  last check */.  
12eb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12ec0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
12ed0 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30  metadata(p->db,0
12ee0 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d  ,zTab,azRowid[j]
12ef0 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
12f00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12f10 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30  ITE_OK ) azCol[0
12f20 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a  ] = azRowid[j];.
12f30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12f40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12f50 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b  .  return azCol;
12f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65  .}../*.** Toggle
12f70 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f   the reverse_uno
12f80 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73  rdered_selects s
12f90 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  etting..*/.stati
12fa0 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c  c void toggleSel
12fb0 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33  ectOrder(sqlite3
12fc0 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   *db){.  sqlite3
12fd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
12fe0 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67  ;.  int iSetting
12ff0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74   = 0;.  char zSt
13000 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  mt[100];.  sqlit
13010 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
13020 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73  , "PRAGMA revers
13030 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
13040 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  cts", -1, &pStmt
13050 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
13060 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
13070 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
13080 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71     iSetting = sq
13090 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
130a0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
130b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
130c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
130d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
130e0 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74  zeof(zStmt), zSt
130f0 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47  mt,.       "PRAG
13100 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
13110 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29  ered_selects(%d)
13120 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20  ", !iSetting);. 
13130 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
13140 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30  , zStmt, 0, 0, 0
13150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
13160 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20   is a different 
13170 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
13180 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e   used for dumpin
13190 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
131a0 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65  ** Each row rece
131b0 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c  ived by this cal
131c0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
131d0 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  f a table name,.
131e0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70  ** the table typ
131f0 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74  e ("index" or "t
13200 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74  able") and SQL t
13210 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
13220 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  le..** This rout
13230 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74  ine should print
13240 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74   text sufficient
13250 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
13260 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
13270 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62  c int dump_callb
13280 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
13290 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
132a0 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
132b0 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74  zNotUsed){.  int
132c0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
132d0 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  r *zTable;.  con
132e0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
132f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
13300 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ql;.  ShellState
13310 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
13320 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  e *)pArg;..  UNU
13330 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
13340 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
13350 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67  nArg!=3 || azArg
13360 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13370 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
13380 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
13390 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
133a0 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69  = azArg[2];..  i
133b0 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
133c0 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
133d0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ce")==0 ){.    r
133e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
133f0 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
13400 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
13410 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
13420 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
13430 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c  ("sqlite_stat?",
13440 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20   zTable)==0 ){. 
13450 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
13460 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
13470 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
13480 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
13490 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
134a0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
134b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
134c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
134d0 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
134e0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
134f0 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
13500 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
13510 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
13520 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
13530 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
13540 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
13550 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
13560 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
13570 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
13580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
13590 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
135a0 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
135b0 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
135c0 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
135d0 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
135e0 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
135f0 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
13600 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
13610 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
13620 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
13630 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
13640 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
13650 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
13660 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
13670 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
13690 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
136a0 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29  ut, zSql, ";\n")
136b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72  ;.  }..  if( str
136c0 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
136d0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68  e")==0 ){.    Sh
136e0 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b  ellText sSelect;
136f0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
13700 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  Table;.    char 
13710 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  **azCol;.    int
13720 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61   i;.    char *sa
13730 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
13740 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b    int savedMode;
13750 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61  ..    azCol = ta
13760 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c  bleColumnList(p,
13770 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
13780 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  ( azCol==0 ){.  
13790 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
137a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
137b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77     }..    /* Alw
137c0 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
137d0 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
137e0 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
137f0 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
13800 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
13810 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
13820 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
13830 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
13840 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61     initText(&sTa
13850 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ble);.    append
13860 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54  Text(&sTable, zT
13870 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
13880 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a  zTable));.    /*
13890 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74   If preserving t
138a0 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20  he rowid, add a 
138b0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65  column list afte
138c0 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  r the table name
138d0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  ..    ** In othe
138e0 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52  r words:  "INSER
138f0 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64  T INTO tab(rowid
13900 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55  ,a,b,c,...) VALU
13910 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ES(...)".    ** 
13920 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
13930 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  sual "INSERT INT
13940 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e  O tab VALUES(...
13950 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  )"..    */.    i
13960 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
13970 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
13980 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29  &sTable, "(", 0)
13990 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
139a0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
139b0 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
139c0 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
139d0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
139e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
139f0 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ble, ",", 0);.  
13a00 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
13a10 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
13a20 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
13a30 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
13a40 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
13a50 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c  xt(&sTable, ")",
13a60 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
13a70 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72  /* Build an appr
13a80 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73  opriate SELECT s
13a90 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
13aa0 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
13ab0 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
13ac0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
13ad0 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20  LECT ", 0);.    
13ae0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
13af0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
13b00 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
13b10 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  [0], 0);.      a
13b20 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
13b30 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
13b40 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20   }.    for(i=1; 
13b50 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
13b60 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
13b70 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
13b80 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
13b90 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
13ba0 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20   if( azCol[i+1] 
13bb0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
13bc0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
13bd0 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ",", 0);.      }
13be0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43  .    }.    freeC
13bf0 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
13c00 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
13c10 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
13c20 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
13c30 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
13c40 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
13c50 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
13c60 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c     savedDestTabl
13c70 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  e = p->zDestTabl
13c80 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65  e;.    savedMode
13c90 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
13ca0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
13cb0 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d  sTable.z;.    p-
13cc0 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65  >mode = p->cMode
13cd0 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
13ce0 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
13cf0 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65  xec(p->db, sSele
13d00 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  ct.z, shell_call
13d10 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
13d20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
13d30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
13d40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
13d50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
13d60 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45  *** CORRUPTION E
13d70 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  RROR *******/\n"
13d80 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53  );.      toggleS
13d90 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62  electOrder(p->db
13da0 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  );.      shell_e
13db0 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65  xec(p->db, sSele
13dc0 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  ct.z, shell_call
13dd0 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
13de0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
13df0 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
13e00 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54   }.    p->zDestT
13e10 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74  able = savedDest
13e20 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f  Table;.    p->mo
13e30 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a  de = savedMode;.
13e40 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 54      freeText(&sT
13e50 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54  able);.    freeT
13e60 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
13e70 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e     if( rc ) p->n
13e80 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
13e90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
13ea0 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65  Run zQuery.  Use
13eb0 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29   dump_callback()
13ec0 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   as the callback
13ed0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
13ee0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
13ef0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72   of the query ar
13f00 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20  e output as SQL 
13f10 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
13f20 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51  * If we get a SQ
13f30 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
13f40 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75  or, rerun the qu
13f50 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64  ery after append
13f60 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59  ing.** "ORDER BY
13f70 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20   rowid DESC" to 
13f80 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
13f90 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d  ic int run_schem
13fa0 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20  a_dump_query(.  
13fb0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
13fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
13fd0 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ery.){.  int rc;
13fe0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
13ff0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
14000 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
14010 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
14020 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
14030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14040 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
14050 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
14060 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
14070 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  0(zQuery);.    r
14080 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
14090 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
140a0 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
140b0 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66  ***/\n");.    if
140c0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
140d0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
140e0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20  ut, "/****** %s 
140f0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
14100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14110 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
14120 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20     zErr = 0;.   
14130 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c   }.    zQ2 = mal
14140 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a  loc( len+100 );.
14150 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29      if( zQ2==0 )
14160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14170 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
14180 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22  (len+100, zQ2, "
14190 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
141a0 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
141b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
141c0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
141d0 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
141e0 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
141f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14200 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
14210 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45  >out, "/****** E
14220 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  RROR: %s ******/
14230 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
14240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
14250 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
14260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14270 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
14280 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20      free(zQ2);. 
14290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
142a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66  }../*.** Text of
142b0 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65 0a   a help message.
142c0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
142d0 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 6e 64 65 66  Help[] =.#ifndef
142e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
142f0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
14300 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
14310 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
14320 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e  izer callbacks\n
14330 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ".#endif.  ".bac
14340 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
14350 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64 65     Backup DB (de
14360 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
14370 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62  to FILE\n".  ".b
14380 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
14390 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
143a0 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
143b0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e  .  Default OFF\n
143c0 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ".  ".binary on|
143d0 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72 6e  off         Turn
143e0 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f   binary output o
143f0 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75  n or off.  Defau
14400 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64  lt OFF\n".  ".cd
14410 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
14420 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77      Change the w
14430 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
14440 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22   to DIRECTORY\n"
14450 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  .  ".changes on|
14460 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77 20  off        Show 
14470 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63  number of rows c
14480 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22  hanged by SQL\n"
14490 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20  .  ".check GLOB 
144a0 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20             Fail 
144b0 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20  if output since 
144c0 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e  .testcase does n
144d0 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e  ot match\n".  ".
144e0 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20  clone NEWDB     
144f0 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
14500 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
14510 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
14520 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61  tabase\n".  ".da
14530 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20  tabases         
14540 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
14550 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
14560 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e  ched databases\n
14570 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ".  ".dbinfo ?DB
14580 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  ?           Show
14590 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
145a0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
145b0 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75  tabase\n".  ".du
145c0 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
145d0 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74      Dump the dat
145e0 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20  abase in an SQL 
145f0 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20  text format\n". 
14600 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
14610 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
14620 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
14630 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20  nly dump tables 
14640 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
14670 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
14680 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20   ".echo on|off  
14690 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f           Turn co
146a0 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72  mmand echo on or
146b0 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20   off\n".  ".eqp 
146c0 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20  on|off|full     
146d0 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61    Enable or disa
146e0 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58  ble automatic EX
146f0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
14700 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20  \n".  ".exit    
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
14720 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c  it this program\
14730 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78  n"./* Because ex
14740 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73  plain mode comes
14750 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   on automaticall
14760 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70  y now, the ".exp
14770 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73  lain" mode.** is
14780 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
14790 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20  e help screen.  
147a0 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70  It is still supp
147b0 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79  orted for legacy
147c0 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22  , however */./*"
147d0 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66  .explain ?on|off
147e0 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c  |auto? Turn EXPL
147f0 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  AIN output mode 
14800 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20  on or off or to 
14810 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20  automatic\n"*/. 
14820 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d   ".fullschema ?-
14830 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73 63  -indent? Show sc
14840 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e  hema and the con
14850 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  tent of sqlite_s
14860 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20  tat tables\n".  
14870 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66  ".headers on|off
14880 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73          Turn dis
14890 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20  play of headers 
148a0 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
148b0 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20  .help           
148c0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73         Show this
148d0 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e   message\n".  ".
148e0 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
148f0 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74  E     Import dat
14900 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
14910 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65   TABLE\n".#ifnde
14920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
14930 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69  ST_CONTROL.  ".i
14940 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41  mposter INDEX TA
14950 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70 6f  BLE  Create impo
14960 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45  ster table TABLE
14970 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 5c   on index INDEX\
14980 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e  n".#endif.  ".in
14990 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dexes ?TABLE?   
149a0 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
149b0 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22  f all indexes\n"
149c0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
149e0 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
149f0 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78   only show index
14a00 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22  es for tables\n"
14a10 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74               mat
14a30 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65  ching LIKE patte
14a40 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66  rn TABLE.\n".#if
14a50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14a60 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f  E_IOTRACE.  ".io
14a70 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20  trace FILE      
14a80 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64      Enable I/O d
14a90 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e  iagnostic loggin
14aa0 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e  g to FILE\n".#en
14ab0 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c  dif.  ".limit ?L
14ac0 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69  IMIT? ?VAL?   Di
14ad0 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20  splay or change 
14ae0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
14af0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a  SQLITE_LIMIT\n".
14b00 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53    ".lint OPTIONS
14b10 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74            Report
14b20 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d   potential schem
14b30 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e  a issues. Option
14b40 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  s:\n".  "       
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20    fkey-indexes  
14b70 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20     Find missing 
14b80 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65  foreign key inde
14b90 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53  xes\n".#ifndef S
14ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
14bb0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f  EXTENSION.  ".lo
14bc0 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20  ad FILE ?ENTRY? 
14bd0 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
14be0 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22  nsion library\n"
14bf0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20  .#endif.  ".log 
14c00 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
14c10 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f    Turn logging o
14c20 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20  n or off.  FILE 
14c30 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74  can be stderr/st
14c40 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65  dout\n".  ".mode
14c50 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
14c60 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
14c70 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20  e where MODE is 
14c80 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20  one of:\n".  "  
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 61 73 63 69 69 20 20 20 20         ascii    
14cb0 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c  Columns/rows del
14cc0 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61  imited by 0x1F a
14cd0 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20 20  nd 0x1E\n".  "  
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20         csv      
14d00 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  Comma-separated 
14d10 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c        column   L
14d40 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75  eft-aligned colu
14d50 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74  mns.  (See .widt
14d60 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  h)\n".  "       
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
14d90 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a  <table> code\n".
14da0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
14db0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65              inse
14dc0 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20  rt   SQL insert 
14dd0 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54  statements for T
14de0 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  ABLE\n".  "     
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65      line     One
14e10 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c   value per line\
14e20 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
14e40 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64  ist     Values d
14e50 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c  elimited by \"|\
14e60 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  "\n".  "        
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
14e90 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
14ea0 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  SQL\n".  "      
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
14ed0 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
14ee0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
14f10 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  t elements\n".  
14f20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49  ".nullvalue STRI
14f30 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49  NG      Use STRI
14f40 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
14f50 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
14f60 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d 45 20  ".once FILENAME 
14f70 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 66          Output f
14f80 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  or the next SQL 
14f90 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20  command only to 
14fa0 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
14fb0 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f  open ?OPTIONS? ?
14fc0 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73  FILE? Close exis
14fd0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e  ting database an
14fe0 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22  d reopen FILE\n"
14ff0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
15010 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74   --new option st
15020 61 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70  arts with an emp
15030 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e 6f  ty file\n".  ".o
15040 75 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d 45 3f  utput ?FILENAME?
15050 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
15060 20 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f 72 20   to FILENAME or 
15070 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72  stdout\n".  ".pr
15080 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20  int STRING...   
15090 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61      Print litera
150a0 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e  l STRING\n".  ".
150b0 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54  prompt MAIN CONT
150c0 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74 68  INUE  Replace th
150d0 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70  e standard promp
150e0 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20  ts\n".  ".quit  
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
15110 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49  m\n".  ".read FI
15120 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45  LENAME         E
15130 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49  xecute SQL in FI
15140 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65  LENAME\n".  ".re
15150 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20  store ?DB? FILE 
15160 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74      Restore cont
15170 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75  ent of DB (defau
15180 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f  lt \"main\") fro
15190 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61  m FILE\n".  ".sa
151a0 76 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ve FILE         
151b0 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d      Write in-mem
151c0 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74  ory database int
151d0 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63  o FILE\n".  ".sc
151e0 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20  anstats on|off  
151f0 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33      Turn sqlite3
15200 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
15210 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72  () metrics on or
15220 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65   off\n".  ".sche
15230 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  ma ?PATTERN?    
15240 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
15250 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74  E statements mat
15260 63 68 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22  ching PATTERN\n"
15270 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
15290 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70  d --indent for p
152a0 72 65 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e  retty-printing\n
152b0 22 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f  ".  ".selftest ?
152c0 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52 75 6e 20  --init?     Run 
152d0 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e  tests defined in
152e0 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
152f0 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72  ble\n".  ".separ
15300 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20  ator COL ?ROW?  
15310 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75   Change the colu
15320 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 61 6e 64  mn separator and
15330 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20   optionally the 
15340 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  row\n".  "      
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 73 65 70 61 72 61 74 6f 72 20 66 6f 72     separator for
15370 20 62 6f 74 68 20 74 68 65 20 6f 75 74 70 75 74   both the output
15380 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72   mode and .impor
15390 74 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64  t\n".#if defined
153a0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
153b0 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73  ESSION).  ".sess
153c0 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20  ion CMD ...     
153d0 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74    Create or cont
153e0 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a  rol sessions\n".
153f0 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73  #endif.  ".sha3s
15400 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20  um ?OPTIONS...? 
15410 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20   Compute a SHA3 
15420 68 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65  hash of database
15430 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 2e   content\n".  ".
15440 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e  shell CMD ARGS..
15450 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52  .     Run CMD AR
15460 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
15470 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73  m shell\n".  ".s
15480 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  how             
15490 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75       Show the cu
154a0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
154b0 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67   various setting
154c0 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f  s\n".  ".stats ?
154d0 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53  on|off?        S
154e0 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72  how stats or tur
154f0 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66  n stats on or of
15500 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20  f\n".  ".system 
15510 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52  CMD ARGS...    R
15520 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
15530 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
15540 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f  \n".  ".tables ?
15550 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69  TABLE?        Li
15560 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c  st names of tabl
15570 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
155a0 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20  fied, only list 
155b0 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c  tables matching\
155c0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
155e0 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
155f0 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63 61  E.\n".  ".testca
15600 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20  se NAME         
15610 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e  Begin redirectin
15620 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73  g output to 'tes
15630 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e  tcase-out.txt'\n
15640 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53  ".  ".timeout MS
15650 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20              Try 
15660 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74  opening locked t
15670 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c  ables for MS mil
15680 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22  liseconds\n".  "
15690 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20  .timer on|off   
156a0 20 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20         Turn SQL 
156b0 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c  timer on or off\
156c0 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c  n".  ".trace FIL
156d0 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74  E|off        Out
156e0 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61  put each SQL sta
156f0 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20  tement as it is 
15700 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e  run\n".  ".vfsin
15710 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  fo ?AUX?        
15720 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
15730 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ut the top-level
15740 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c   VFS\n".  ".vfsl
15750 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
15760 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c    List all avail
15770 61 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20 20  able VFSes\n".  
15780 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20  ".vfsname ?AUX? 
15790 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68          Print th
157a0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
157b0 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77  S stack\n".  ".w
157c0 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e  idth NUM1 NUM2 .
157d0 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20  ..   Set column 
157e0 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c  widths for \"col
157f0 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20  umn\" mode\n".  
15800 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
15810 20 20 20 20 20 20 20 20 20 20 4e 65 67 61 74 69            Negati
15820 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d  ve values right-
15830 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69  justify\n".;..#i
15840 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
15850 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
15860 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c  ./*.** Print hel
15870 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  p information fo
15880 72 20 74 68 65 20 22 2e 73 65 73 73 69 6f 6e 73  r the ".sessions
15890 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69  " command.*/.voi
158a0 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53  d session_help(S
158b0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
158c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
158d0 75 74 2c 0a 20 20 20 20 22 2e 73 65 73 73 69 6f  ut,.    ".sessio
158e0 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d  n ?NAME? SUBCOMM
158f0 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22  AND ?ARGS...?\n"
15900 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20  .    "If ?NAME? 
15910 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20  is omitted, the 
15920 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 73 65  first defined se
15930 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e  ssion is used.\n
15940 22 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e  ".    "Subcomman
15950 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 61  ds:\n".    "   a
15960 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20 20  ttach TABLE     
15970 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20 54          Attach T
15980 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20  ABLE\n".    "   
15990 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20  changeset FILE  
159a0 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
159b0 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20   changeset into 
159c0 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20  FILE\n".    "   
159d0 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  close           
159e0 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f           Close o
159f0 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20  ne session\n".  
15a00 20 20 22 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f    "   enable ?BO
15a10 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53  OLEAN?         S
15a20 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  et or query the 
15a30 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20  enable bit\n".  
15a40 20 20 22 20 20 20 66 69 6c 74 65 72 20 47 4c 4f    "   filter GLO
15a50 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52  B...           R
15a60 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74  eject tables mat
15a70 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20  ching GLOBs\n". 
15a80 20 20 20 22 20 20 20 69 6e 64 69 72 65 63 74 20     "   indirect 
15a90 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
15aa0 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68  Mark or query th
15ab0 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75  e indirect statu
15ac0 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 73 65  s\n".    "   ise
15ad0 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20  mpty            
15ae0 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74        Query whet
15af0 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20  her the session 
15b00 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20  is empty\n".    
15b10 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20  "   list        
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
15b30 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
15b40 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e   session names\n
15b50 22 0a 20 20 20 20 22 20 20 20 6f 70 65 6e 20 44  ".    "   open D
15b60 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  B NAME          
15b70 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65     Open a new se
15b80 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20  ssion on DB\n". 
15b90 20 20 20 22 20 20 20 70 61 74 63 68 73 65 74 20     "   patchset 
15ba0 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
15bb0 57 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74  Write a patchset
15bc0 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20   into FILE\n".  
15bd0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
15be0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
15bf0 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
15c00 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53   process_input(S
15c10 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49  hellState *p, FI
15c20 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
15c30 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
15c40 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69   of file zName i
15c50 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
15c60 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
15c70 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61  _malloc64().** a
15c80 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
15c90 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
15ca0 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  r. The caller is
15cb0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
15cc0 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20   freeing.** the 
15cd0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  memory..**.** If
15ce0 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74   parameter pnByt
15cf0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28  e is not NULL, (
15d00 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20  *pnByte) is set 
15d10 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15d20 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a   bytes.** read..
15d30 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e  **.** For conven
15d40 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72  ience, a nul-ter
15d50 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
15d60 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20  always appended 
15d70 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64  to the data read
15d80 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
15d90 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  e before the buf
15da0 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  fer is returned.
15db0 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f   This byte is no
15dc0 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a  t included in.**
15dd0 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   the final value
15de0 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69   of (*pnByte), i
15df0 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a  f applicable..**
15e00 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
15e10 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f  rned if any erro
15e20 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
15e30 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
15e40 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20  e of *pnByte.** 
15e50 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
15e60 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
15e70 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46  atic char *readF
15e80 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
15e90 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79  zName, int *pnBy
15ea0 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  te){.  FILE *in 
15eb0 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
15ec0 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e  rb");.  long nIn
15ed0 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64  ;.  size_t nRead
15ee0 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a  ;.  char *pBuf;.
15ef0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
15f00 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28  turn 0;.  fseek(
15f10 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  in, 0, SEEK_END)
15f20 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28  ;.  nIn = ftell(
15f30 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e  in);.  rewind(in
15f40 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69  );.  pBuf = sqli
15f50 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49  te3_malloc64( nI
15f60 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75  n+1 );.  if( pBu
15f70 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  f==0 ) return 0;
15f80 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64  .  nRead = fread
15f90 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69  (pBuf, nIn, 1, i
15fa0 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  n);.  fclose(in)
15fb0 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31  ;.  if( nRead!=1
15fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15fd0 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20  free(pBuf);.    
15fe0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15ff0 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20  pBuf[nIn] = 0;. 
16000 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70   if( pnByte ) *p
16010 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72  nByte = nIn;.  r
16020 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23  eturn pBuf;.}..#
16030 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
16040 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
16050 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  )./*.** Close a 
16060 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69  single OpenSessi
16070 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  on object and re
16080 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73  lease all of its
16090 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72   associated.** r
160a0 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61  esources..*/.sta
160b0 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
160c0 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69  _close(OpenSessi
160d0 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20  on *pSession){. 
160e0 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
160f0 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28  3session_delete(
16100 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
16110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
16120 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ssion->zName);. 
16130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
16140 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
16150 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
16160 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
16170 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20  azFilter[i]);.  
16180 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
16190 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
161a0 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter);.  memset(p
161b0 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65  Session, 0, size
161c0 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29  of(OpenSession))
161d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
161e0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e  * Close all Open
161f0 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20  Session objects 
16200 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
16210 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75  associated resou
16220 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rces..*/.#if def
16230 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
16240 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
16250 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
16260 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53  close_all(ShellS
16270 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
16280 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
16290 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b  p->nSession; i++
162a0 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  ){.    session_c
162b0 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f  lose(&p->aSessio
162c0 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  n[i]);.  }.  p->
162d0 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a  nSession = 0;.}.
162e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
162f0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
16300 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
16310 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
16320 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20   of the xFilter 
16330 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
16340 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f  open session.  O
16350 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65  mit.** any table
16360 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73  s named by ".ses
16370 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74  sion filter" but
16380 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74   let all other t
16390 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  able through..*/
163a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
163b0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
163c0 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ON).static int s
163d0 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f  ession_filter(vo
163e0 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20  id *pCtx, const 
163f0 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f  char *zTab){.  O
16400 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
16410 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73  sion = (OpenSess
16420 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74  ion*)pCtx;.  int
16430 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
16440 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
16450 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  er; i++){.    if
16460 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
16470 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  b(pSession->azFi
16480 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d  lter[i], zTab)==
16490 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
164a0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
164b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
164c0 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
164d0 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49  base is open.  I
164e0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
164f0 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a  n open it.  If.*
16500 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
16510 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72  ails to open, pr
16520 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
16530 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a  sage and exit..*
16540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70  /.static void op
16550 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65  en_db(ShellState
16560 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69   *p, int keepAli
16570 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  ve){.  if( p->db
16580 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
16590 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
165a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  .    sqlite3_ope
165b0 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
165c0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 67  , &p->db);.    g
165d0 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b  lobalDb = p->db;
165e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
165f0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 || SQLITE_OK!=
16600 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
16610 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
16620 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
16630 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c  rr,"Error: unabl
16640 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
16650 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
16660 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ,.          p->z
16670 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
16680 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
16690 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 65  ));.      if( ke
166a0 65 70 41 6c 69 76 65 20 29 20 72 65 74 75 72 6e  epAlive ) return
166b0 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
166c0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
166d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
166e0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71  EXTENSION.    sq
166f0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
16700 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
16710 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, 1);.#endif.  
16720 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f    sqlite3_fileio
16730 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
16740 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
16750 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70 2d  shathree_init(p-
16760 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
16770 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69  sqlite3_completi
16780 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  on_init(p->db, 0
16790 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
167a0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
167b0 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
167c0 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 32 2c 20  add_schema", 2, 
167d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
16800 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20  lAddSchemaName, 
16810 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  0, 0);.  }.}..#i
16820 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20  f HAVE_READLINE 
16830 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45  || HAVE_EDITLINE
16840 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20  ./*.** Readline 
16850 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62  completion callb
16860 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  acks.*/.static c
16870 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  har *readline_co
16880 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
16890 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  or(const char *t
168a0 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b  ext, int state){
168b0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
168c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
168d0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
168e0 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20  .  if( state==0 
168f0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
16900 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  l;.    sqlite3_f
16910 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
16920 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
16930 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
16940 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64  CT DISTINCT cand
16950 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f  idate COLLATE no
16960 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74   "  FROM complet
16990 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59  ion(%Q) ORDER BY
169a0 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20   1", text);.    
169b0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
169c0 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71  v2(globalDb, zSq
169d0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
169e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
169f0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
16a00 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
16a10 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
16a20 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74  _ROW ){.    zRet
16a30 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74   = strdup((const
16a40 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
16a50 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
16a60 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , 0));.  }else{.
16a70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16a80 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
16a90 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
16aa0 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRet = 0;.  }.  
16ab0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73  return zRet;.}.s
16ac0 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61  tatic char **rea
16ad0 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
16ae0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
16af0 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  xt, int iStart, 
16b00 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f  int iEnd){.  rl_
16b10 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65  attempted_comple
16b20 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20  tion_over = 1;. 
16b30 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c   return rl_compl
16b40 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54  etion_matches(zT
16b50 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f  ext, readline_co
16b60 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
16b70 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41  or);.}..#elif HA
16b80 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a  VE_LINENOISE./*.
16b90 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d  ** Linenoise com
16ba0 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
16bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16bc0 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65  linenoise_comple
16bd0 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
16be0 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73  *zLine, linenois
16bf0 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63  eCompletions *lc
16c00 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d  ){.  int nLine =
16c10 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69   (int)strlen(zLi
16c20 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53  ne);.  int i, iS
16c30 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tart;.  sqlite3_
16c40 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
16c50 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
16c60 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
16c70 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73  ;..  if( nLine>s
16c80 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29  izeof(zBuf)-30 )
16c90 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a   return;.  if( z
16ca0 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72  Line[0]=='.' ) r
16cb0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e  eturn;.  for(i=n
16cc0 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20  Line-1; i>=0 && 
16cd0 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69  (isalnum(zLine[i
16ce0 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d  ]) || zLine[i]==
16cf0 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  '_'); i--){}.  i
16d00 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20  f( i==nLine-1 ) 
16d10 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74  return;.  iStart
16d20 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79   = i+1;.  memcpy
16d30 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53  (zBuf, zLine, iS
16d40 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  tart);.  zSql = 
16d50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16d60 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
16d70 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41   candidate COLLA
16d80 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20  TE nocase".     
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70      "  FROM comp
16db0 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52  letion(%Q,%Q) OR
16dc0 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20  DER BY 1",.     
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72      &zLine[iStar
16df0 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71  t], zLine);.  sq
16e00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16e10 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c  (globalDb, zSql,
16e20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
16e30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16e40 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
16e50 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20  _exec(globalDb, 
16e60 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75  "PRAGMA page_cou
16e70 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f  nt", 0, 0, 0); /
16e80 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  * Load the schem
16e90 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71  a */.  while( sq
16ea0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
16eb0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
16ec0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16ed0 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28  *zCompletion = (
16ee0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
16ef0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
16f00 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
16f10 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d  nt nCompletion =
16f20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
16f30 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
16f40 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b  .    if( iStart+
16f50 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69  nCompletion < si
16f60 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a  zeof(zBuf)-1 ){.
16f70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
16f80 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c  f+iStart, zCompl
16f90 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69  etion, nCompleti
16fa0 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e  on+1);.      lin
16fb0 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74  enoiseAddComplet
16fc0 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20  ion(lc, zBuf);. 
16fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16fe0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16ff0 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
17000 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
17010 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
17020 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20  g..**.**    \a  
17030 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20    -> alarm.**   
17040 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70   \b    -> backsp
17050 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20  ace.**    \t    
17060 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20  -> tab.**    \n 
17070 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a     -> newline.**
17080 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72      \v    -> ver
17090 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20  tical tab.**    
170a0 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65  \f    -> form fe
170b0 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d  ed.**    \r    -
170c0 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72  > carriage retur
170d0 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e  n.**    \s    ->
170e0 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20   space.**    \" 
170f0 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27     -> ".**    \'
17100 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c      -> '.**    \
17110 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73  \    -> backslas
17120 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e  h.**    \NNN  ->
17130 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72   ascii character
17140 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f   NNN in octal.*/
17150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
17160 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
17170 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74  (char *z){.  int
17180 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b   i, j;.  char c;
17190 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20  .  while( *z && 
171a0 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a  *z!='\\' ) z++;.
171b0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
171c0 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
171d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
171e0 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d  =='\\' && z[i+1]
171f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  !=0 ){.      c =
17200 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
17210 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20  f( c=='a' ){.   
17220 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20       c = '\a';. 
17230 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
17240 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20  =='b' ){.       
17250 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20   c = '\b';.     
17260 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74   }else if( c=='t
17270 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
17280 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\t';.      }el
17290 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b  se if( c=='n' ){
172a0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e  .        c = '\n
172b0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
172c0 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20  f( c=='v' ){.   
172d0 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20       c = '\v';. 
172e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
172f0 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20  =='f' ){.       
17300 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20   c = '\f';.     
17310 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
17320 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
17330 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
17340 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
17350 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27  .        c = '"'
17360 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17370 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
17380 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20       c = '\'';. 
17390 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
173a0 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
173b0 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20    c = '\\';.    
173c0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27    }else if( c>='
173d0 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a  0' && c<='7' ){.
173e0 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27          c -= '0'
173f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
17400 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69  i+1]>='0' && z[i
17410 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  +1]<='7' ){.    
17420 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
17430 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
17440 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
17450 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
17460 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
17470 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
17480 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
17490 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33         c = (c<<3
174a0 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a  ) + z[i] - '0';.
174b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
174c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
174d0 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63    }.    z[j] = c
174e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20  ;.  }.  if( j<i 
174f0 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  ) z[j] = 0;.}../
17500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17510 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
17520 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
17530 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
17540 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
17550 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
17560 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
17570 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
17580 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
17590 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
175a0 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
175b0 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
175c0 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
175d0 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
175e0 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
175f0 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
17600 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
17610 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
17620 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
17630 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
17640 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
17650 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
17660 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
17670 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
17680 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
17690 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
176a0 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
176b0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
176c0 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
176d0 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
176e0 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
176f0 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
17700 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
17710 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
17720 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
17730 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
17740 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
17750 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
17760 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
17770 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
17780 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
17790 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
177a0 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
177b0 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
177c0 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
177d0 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
177e0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
177f0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
17800 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
17810 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
17820 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
17830 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
17840 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
17850 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
17860 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
17870 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
17880 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
17890 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
178a0 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
178b0 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
178c0 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
178d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
178e0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
178f0 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
17900 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
17910 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
17920 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
17930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
17940 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
17950 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
17960 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
17970 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
17980 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
17990 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
179a0 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
179b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
179c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
179d0 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
179e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
179f0 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72  t zArg as either
17a00 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61   an integer or a
17a10 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
17a20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a   Return 1 or 0.*
17a30 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46  * for TRUE and F
17a40 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68  ALSE.  Return th
17a50 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
17a60 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
17a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
17a80 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74  oleanValue(const
17a90 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
17aa0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72  int i;.  if( zAr
17ab0 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
17ac0 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
17ad0 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67   for(i=2; hexDig
17ae0 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29  itValue(zArg[i])
17af0 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65  >=0; i++){}.  }e
17b00 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
17b10 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
17b20 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
17b30 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28  i++){}.  }.  if(
17b40 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d   i>0 && zArg[i]=
17b50 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74  =0 ) return (int
17b60 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  )(integerValue(z
17b70 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66  Arg) & 0xfffffff
17b80 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f);.  if( sqlite
17b90 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
17ba0 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
17bb0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
17bc0 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
17bd0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
17be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17bf0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
17c00 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
17c10 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
17c20 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
17c30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74  turn 0;.  }.  ut
17c40 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
17c50 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20  , "ERROR: Not a 
17c60 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c  boolean value: \
17c70 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20  "%s\". Assuming 
17c80 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"no\".\n",.    
17c90 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72        zArg);.  r
17ca0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
17cb0 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
17cc0 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f   shell flag acco
17cd0 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65  rding to a boole
17ce0 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
17cf0 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c  tic void setOrCl
17d00 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61  earFlag(ShellSta
17d10 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  te *p, unsigned 
17d20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61  mFlag, const cha
17d30 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20  r *zArg){.  if( 
17d40 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72  booleanValue(zAr
17d50 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  g) ){.    ShellS
17d60 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  etFlag(p, mFlag)
17d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
17d80 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
17d90 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a   mFlag);.  }.}..
17da0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
17db0 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
17dc0 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
17dd0 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
17de0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
17df0 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
17e00 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
17e10 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
17e20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
17e30 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
17e40 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
17e50 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
17e60 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
17e70 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
17e80 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
17e90 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
17ea0 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
17eb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17ec0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69  the output.** fi
17ed0 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e  lename is "off".
17ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .*/.static FILE 
17ef0 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65  *output_file_ope
17f00 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
17f10 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ile){.  FILE *f;
17f20 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
17f30 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
17f40 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
17f50 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
17f60 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
17f70 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
17f80 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
17f90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
17fa0 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
17fb0 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
17fd0 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77   fopen(zFile, "w
17fe0 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d  b");.    if( f==
17ff0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
18000 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
18010 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
18020 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
18030 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
18040 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23    return f;.}..#
18050 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18060 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a 23  TE_UNTESTABLE).#
18070 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18080 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
18090 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
180a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
180b0 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72  POINT)./*.** A r
180c0 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c  outine for handl
180d0 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  ing output from 
180e0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e  sqlite3_trace().
180f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18100 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63  ql_trace_callbac
18110 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  k(.  unsigned mT
18120 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  ype,.  void *pAr
18130 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20  g,.  void *pP,. 
18140 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46   void *pX.){.  F
18150 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29  ILE *f = (FILE*)
18160 70 41 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50  pArg;.  UNUSED_P
18170 41 52 41 4d 45 54 45 52 28 6d 54 79 70 65 29 3b  ARAMETER(mType);
18180 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18190 54 45 52 28 70 50 29 3b 0a 20 20 69 66 28 20 66  TER(pP);.  if( f
181a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
181b0 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
181c0 68 61 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74  har*)pX;.    int
181d0 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   i = (int)strlen
181e0 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
181f0 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
18200 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
18210 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
18220 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
18230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
18240 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
18250 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70  f../*.** A no-op
18260 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75   routine that ru
18270 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72  ns with the ".br
18280 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f  eakpoint" doc-co
18290 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a  mmand.  This is.
182a0 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74  ** a useful spot
182b0 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67   to set a debugg
182c0 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a  er breakpoint..*
182d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
182e0 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f  st_breakpoint(vo
182f0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
18300 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
18310 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Call++;.}../*.**
18320 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20   An object used 
18330 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61 6e  to read a CSV an
18340 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f  d other files fo
18350 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70  r import..*/.typ
18360 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f  edef struct Impo
18370 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b  rtCtx ImportCtx;
18380 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74  .struct ImportCt
18390 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x {.  const char
183a0 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d   *zFile;  /* Nam
183b0 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
183c0 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ile */.  FILE *i
183d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
183e0 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65 78  Read the CSV tex
183f0 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  t from this inpu
18400 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68  t stream */.  ch
18410 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
18420 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64    /* Accumulated
18430 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c   text for a fiel
18440 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
18450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18460 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
18470 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c   z */.  int nAll
18480 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  oc;         /* S
18490 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
184a0 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  or z[] */.  int 
184b0 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  nLine;          
184c0 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20  /* Current line 
184d0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
184e0 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20  bNotFirst;      
184f0 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f  /* True if one o
18500 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72  r more bytes alr
18510 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69  eady read */.  i
18520 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20  nt cTerm;       
18530 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20     /* Character 
18540 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20  that terminated 
18550 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18560 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63  field */.  int c
18570 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f  ColSep;        /
18580 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  * The column sep
18590 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
185a0 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29  .  (Usually ",")
185b0 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65   */.  int cRowSe
185c0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
185d0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63   row separator c
185e0 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
185f0 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a  lly "\n") */.};.
18600 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  ./* Append a sin
18610 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20  gle byte to z[] 
18620 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
18630 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
18640 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20  r(ImportCtx *p, 
18650 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d  int c){.  if( p-
18660 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20  >n+1>=p->nAlloc 
18670 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  ){.    p->nAlloc
18680 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20   += p->nAlloc + 
18690 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  100;.    p->z = 
186a0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
186b0 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  4(p->z, p->nAllo
186c0 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
186d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
186e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
186f0 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
18700 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
18710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
18720 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63  ->z[p->n++] = (c
18730 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61  har)c;.}../* Rea
18740 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  d a single field
18750 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43   of CSV text.  C
18760 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72  ompatible with r
18770 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e  fc4180 and exten
18780 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ded.** with the 
18790 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67  option of having
187a0 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68   a separator oth
187b0 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a  er than ","..**.
187c0 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
187d0 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
187e0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
187f0 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
18800 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
18810 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
18820 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
18830 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
18840 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
18850 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
18860 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
18870 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
18880 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20  lt is ","..**   
18890 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61  +  Use p->rSep a
188a0 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  s the row separa
188b0 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
188c0 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20  t is "\n"..**   
188d0 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  +  Keep track of
188e0 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
188f0 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
18900 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
18910 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
18920 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
18930 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
18940 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
18950 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
18960 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
18970 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
18980 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
18990 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
189a0 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64  E_CDECL csv_read
189b0 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
189c0 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
189d0 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
189e0 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
189f0 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
18a00 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
18a10 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
18a20 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
18a30 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
18a40 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
18a50 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
18a60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
18a70 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
18a80 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20  int pc, ppc;.   
18a90 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
18aa0 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69   p->nLine;.    i
18ab0 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20  nt cQuote = c;. 
18ac0 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b     pc = ppc = 0;
18ad0 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
18ae0 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
18af0 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
18b00 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e  f( c==rSep ) p->
18b10 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
18b20 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  f( c==cQuote ){.
18b30 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
18b40 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
18b50 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20      pc = 0;.    
18b60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b80 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d  }.      if( (c==
18b90 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  cSep && pc==cQuo
18ba0 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
18bb0 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==rSep && pc==cQ
18bc0 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
18bd0 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
18be0 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75  '\r' && ppc==cQu
18bf0 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
18c00 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51  c==EOF && pc==cQ
18c10 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  uote).      ){. 
18c20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d         do{ p->n-
18c30 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b  -; }while( p->z[
18c40 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b  p->n]!=cQuote );
18c50 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
18c60 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
18c70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18c80 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
18c90 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b  te && c!='\r' ){
18ca0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
18cb0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
18cc0 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25  :%d: unescaped %
18cd0 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a  c character\n",.
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69  p->zFile, p->nLi
18d00 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
18d10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
18d20 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20  ==EOF ){.       
18d30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
18d40 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74  err, "%s:%d: unt
18d50 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f  erminated %c-quo
18d60 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20  ted field\n",.  
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
18d80 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  >zFile, startLin
18d90 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  e, cQuote);.    
18da0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
18db0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18dd0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
18de0 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
18df0 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
18e00 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
18e10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
18e20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
18e30 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61  t field being pa
18e40 72 73 65 64 20 61 6e 64 20 69 74 20 62 65 67 69  rsed and it begi
18e50 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ns with the.    
18e60 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30  ** UTF-8 BOM  (0
18e70 78 45 46 20 42 42 20 42 46 29 20 74 68 65 6e 20  xEF BB BF) then 
18e80 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a  skip the BOM */.
18e90 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
18ea0 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f  ==0xef && p->bNo
18eb0 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  tFirst==0 ){.   
18ec0 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
18ed0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
18ee0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
18ef0 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  in);.      if( (
18f00 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b  c&0xff)==0xbb ){
18f10 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  .        import_
18f20 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
18f30 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66  );.        c = f
18f40 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
18f50 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
18f60 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20  )==0xbf ){.     
18f70 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73       p->bNotFirs
18f80 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
18f90 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20   p->n = 0;.     
18fa0 20 20 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f       return csv_
18fb0 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70  read_one_field(p
18fc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18fd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
18fe0 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
18ff0 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53  c!=cSep && c!=rS
19000 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  ep ){.      impo
19010 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
19020 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
19030 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
19040 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72    }.    if( c==r
19050 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sep ){.      p->
19060 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
19070 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e  f( p->n>0 && p->
19080 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20  z[p->n-1]=='\r' 
19090 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  ) p->n--;.    }.
190a0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
190b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
190c0 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
190d0 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73  0;.  p->bNotFirs
190e0 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
190f0 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  p->z;.}../* Read
19100 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
19110 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74  of ASCII delimit
19120 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed text..**.**  
19130 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
19140 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
19150 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
19160 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
19170 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
19180 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
19190 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
191a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
191b0 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
191c0 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
191d0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
191e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
191f0 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b  s "\x1F"..**   +
19200 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73    Use p->rSep as
19210 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
19220 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
19230 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20   is "\x1E"..**  
19240 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   +  Keep track o
19250 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72  f the row number
19260 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
19270 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
19280 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
19290 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
192a0 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
192b0 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
192c0 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
192d0 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
192e0 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
192f0 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
19300 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
19310 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65  E_CDECL ascii_re
19320 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
19330 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
19340 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
19350 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
19360 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
19370 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
19380 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
19390 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
193a0 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
193b0 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
193c0 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
193d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
193e0 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
193f0 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
19400 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72  Sep ){.    impor
19410 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
19420 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65   c);.    c = fge
19430 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20  tc(p->in);.  }. 
19440 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
19450 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
19460 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d    }.  p->cTerm =
19470 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29   c;.  if( p->z )
19480 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
19490 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
194a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
194b0 74 72 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f  transfer data fo
194c0 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20  r table zTable. 
194d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
194e0 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f  seen while.** mo
194f0 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72  ving forward, tr
19500 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64  y to go backward
19510 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72 64  s.  The backward
19520 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74  s movement won't
19530 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54  .** work for WIT
19540 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
19550 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19560 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  d tryToCloneData
19570 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
19580 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  p,.  sqlite3 *ne
19590 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  wDb,.  const cha
195a0 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73  r *zTable.){.  s
195b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
195c0 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ery = 0;.  sqlit
195d0 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
195e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
195f0 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
19600 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *zInsert = 0;. 
19610 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
19620 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54  , j, n;.  int nT
19630 61 62 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  able = (int)strl
19640 65 6e 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  en(zTable);.  in
19650 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
19660 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
19670 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
19680 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
19690 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
196a0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
196b0 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
196c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
196d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
196e0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
196f0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
19700 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
19710 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
19720 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
19730 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
19740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
19750 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
19760 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
19770 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
19780 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
19790 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
197a0 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
197b0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
197c0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
197d0 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
197e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
197f0 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
19800 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
19810 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
19820 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
19830 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
19840 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
19850 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
19860 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
19870 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
19880 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
19890 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
198a0 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
198b0 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
198c0 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
198d0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
198e0 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
198f0 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
19900 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
19910 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
19920 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
19930 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
19940 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
19950 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19960 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
19970 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
19980 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
19990 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
199a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
199b0 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
199c0 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
199d0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
199e0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
199f0 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
19a00 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
19a10 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
19a20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
19a30 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
19a40 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
19a50 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
19a60 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
19a70 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
19a80 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
19a90 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
19aa0 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
19ab0 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
19ac0 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
19ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
19ae0 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
19af0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
19b00 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
19b10 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
19b20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19b30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19b40 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
19b50 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
19b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19b70 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
19b80 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
19b90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
19ba0 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
19bb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19bc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19bd0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
19be0 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
19bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19c00 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
19c10 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
19c20 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
19c30 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
19c40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19c60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19c70 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
19c80 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19c90 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
19ca0 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
19cd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
19ce0 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
19d10 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
19d20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19d30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19d40 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
19d50 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
19d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19d70 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
19d80 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
19d90 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
19da0 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
19de0 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
19df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19e20 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
19e30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
19e60 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
19e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
19e80 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
19e90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19ea0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
19eb0 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
19ec0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
19ed0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
19ee0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
19ef0 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
19f00 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
19f10 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
19f40 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
19f50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
19f60 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
19f70 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
19f80 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
19f90 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
19fa0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
19fb0 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
19fc0 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
19fd0 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
19fe0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
19ff0 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
1a000 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
1a010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1a020 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
1a030 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1a040 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1a050 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1a060 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1a070 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1a080 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1a090 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
1a0a0 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
1a0d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a0e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1a0f0 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1a100 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1a110 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1a120 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1a130 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
1a140 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
1a150 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
1a160 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1a170 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
1a180 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
1a190 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
1a1a0 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1a1b0 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1a1c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1a1d0 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
1a1e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1a1f0 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1a200 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
1a210 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1a220 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
1a230 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
1a240 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
1a250 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
1a260 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
1a270 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
1a280 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
1a290 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
1a2a0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1a2b0 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
1a2c0 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
1a2d0 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
1a2e0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
1a2f0 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
1a300 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
1a310 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1a320 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
1a330 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1a340 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1a350 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a360 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
1a370 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
1a380 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
1a390 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
1a3a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a3b0 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1a3c0 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1a3d0 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
1a3e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a3f0 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
1a400 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
1a410 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1a420 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
1a430 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1a440 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1a450 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1a460 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1a490 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
1a4a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1a4b0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1a4c0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1a4d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1a4e0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1a4f0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1a500 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
1a510 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1a520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a530 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1a540 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1a550 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1a560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a570 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1a580 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1a590 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
1a5a0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1a5b0 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1a5c0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1a5d0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1a5e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1a5f0 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1a600 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1a610 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1a620 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
1a630 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
1a640 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
1a650 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1a660 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1a670 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1a680 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1a690 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
1a6a0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1a6b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1a6c0 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1a6d0 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1a6e0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
1a6f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1a700 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
1a710 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
1a720 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1a730 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
1a740 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
1a750 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
1a760 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
1a770 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
1a780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a790 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
1a7a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1a7b0 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1a7c0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1a7d0 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1a7e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1a7f0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1a800 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1a810 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
1a840 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1a850 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
1a860 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1a870 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1a880 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1a890 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1a8a0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1a8b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1a8c0 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1a8d0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1a900 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1a910 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1a920 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1a940 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
1a950 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
1a960 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
1a970 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1a980 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1a990 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1a9a0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
1a9b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1a9c0 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1a9d0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1a9e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1a9f0 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
1aa00 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1aa10 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1aa20 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1aa30 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1aa40 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1aa50 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1aa60 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
1aa70 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1aa80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1aa90 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1aaa0 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
1aab0 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
1aac0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1aad0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1aae0 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
1aaf0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
1ab00 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
1ab10 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
1ab20 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1ab30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1ab40 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1ab50 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1ab60 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
1ab70 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
1ab80 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1ab90 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
1aba0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1abb0 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
1abc0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1abd0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
1abe0 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
1abf0 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
1ac00 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
1ac10 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
1ac20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1ac30 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
1ac40 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
1ac50 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
1ac60 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
1ac70 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1ac80 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
1ac90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
1aca0 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
1acb0 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1acc0 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
1acd0 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
1ace0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1acf0 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
1ad00 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
1ad10 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
1ad20 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
1ad30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1ad40 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
1ad50 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
1ad60 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1ad70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
1ad80 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
1ad90 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
1ada0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1adb0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1adc0 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
1add0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
1ade0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1adf0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1ae00 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
1ae10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1ae20 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
1ae30 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
1ae40 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
1ae50 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1ae60 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
1ae70 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
1ae80 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
1ae90 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1aea0 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
1aeb0 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
1aec0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1aed0 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
1aee0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1aef0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1af00 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
1af10 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
1af20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
1af30 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65  sqlite3_close(ne
1af40 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
1af50 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
1af60 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
1af70 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1af80 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
1af90 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1afa0 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
1afb0 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
1afc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1afd0 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73  _POPEN.    pclos
1afe0 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  e(p->out);.#endi
1aff0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  f.  }else{.    o
1b000 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
1b010 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  (p->out);.  }.  
1b020 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
1b030 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
1b040 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
1b050 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
1b060 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
1b070 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
1b080 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
1b090 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
1b0a0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
1b0b0 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1b0c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b0d0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
1b0e0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
1b0f0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1b100 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1b110 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
1b120 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
1b130 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1b140 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
1b150 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1b160 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
1b170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
1b180 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1b190 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1b1a0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1b1b0 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
1b1c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b1d0 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
1b1e0 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
1b1f0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1b200 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
1b210 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1b220 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1b230 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
1b240 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1b250 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
1b260 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1b270 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1b280 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
1b290 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
1b2a0 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
1b2b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1b2c0 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
1b2d0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
1b2e0 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
1b2f0 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
1b300 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1b310 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
1b320 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
1b330 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1b340 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
1b350 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
1b360 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
1b370 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
1b380 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
1b390 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
1b3a0 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
1b3b0 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
1b3c0 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
1b3d0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1b3e0 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
1b3f0 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
1b400 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
1b410 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
1b420 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
1b430 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
1b440 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
1b450 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
1b460 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
1b470 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
1b480 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
1b490 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
1b4a0 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
1b4b0 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
1b4c0 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
1b4d0 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
1b4e0 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
1b4f0 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
1b500 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
1b510 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
1b520 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
1b530 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
1b540 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
1b550 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
1b560 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
1b570 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1b580 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1b590 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
1b5a0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
1b5b0 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
1b5c0 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1b5d0 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
1b5e0 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
1b5f0 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
1b600 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
1b610 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
1b620 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
1b630 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
1b640 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
1b650 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
1b660 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1b670 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
1b680 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1b690 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1b6a0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1b6b0 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
1b6c0 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
1b6d0 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
1b6e0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1b6f0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1b700 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
1b710 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
1b720 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1b730 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
1b740 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
1b750 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33  ,.  };.  sqlite3
1b760 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 30  _file *pFile = 0
1b770 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
1b780 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20  r *zSchemaTab;. 
1b790 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72   char *zDb = nAr
1b7a0 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g>=2 ? azArg[1] 
1b7b0 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 75 6e 73 69  : "main";.  unsi
1b7c0 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
1b7d0 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
1b7e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
1b7f0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1b800 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  .  sqlite3_file_
1b810 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a  control(p->db, z
1b820 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
1b830 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 26  _FILE_POINTER, &
1b840 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
1b850 69 6c 65 3d 3d 30 20 7c 7c 20 70 46 69 6c 65 2d  ile==0 || pFile-
1b860 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 20  >pMethods==0 || 
1b870 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  pFile->pMethods-
1b880 3e 78 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  >xRead==0 ){.   
1b890 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1b8a0 20 69 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74   i = pFile->pMet
1b8b0 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 69 6c  hods->xRead(pFil
1b8c0 65 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29  e, aHdr, 100, 0)
1b8d0 3b 0a 20 20 69 66 28 20 69 21 3d 53 51 4c 49 54  ;.  if( i!=SQLIT
1b8e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 61 77 5f  E_OK ){.    raw_
1b8f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1b900 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64  unable to read d
1b910 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e  atabase header\n
1b920 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
1b930 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32  ;.  }.  i = get2
1b940 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29  byteInt(aHdr+16)
1b950 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69  ;.  if( i==1 ) i
1b960 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38   = 65536;.  utf8
1b970 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1b980 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64  "%-20s %d\n", "d
1b990 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
1b9a0 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f  e:", i);.  utf8_
1b9b0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1b9c0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72  %-20s %d\n", "wr
1b9d0 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48  ite format:", aH
1b9e0 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f  dr[18]);.  utf8_
1b9f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1ba00 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65  %-20s %d\n", "re
1ba10 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  ad format:", aHd
1ba20 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[19]);.  utf8_p
1ba30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1ba40 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73  -20s %d\n", "res
1ba50 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61  erved bytes:", a
1ba60 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28  Hdr[20]);.  for(
1ba70 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1ba80 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a  (aField); i++){.
1ba90 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61      int ofst = a
1baa0 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20  Field[i].ofst;. 
1bab0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1bac0 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e  val = get4byteIn
1bad0 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a  t(aHdr + ofst);.
1bae0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1baf0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1bb00 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e  u", aField[i].zN
1bb10 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73  ame, val);.    s
1bb20 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20  witch( ofst ){. 
1bb30 20 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a       case 56: {.
1bb40 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
1bb50 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =1 ) raw_printf(
1bb60 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29  p->out, " (utf8)
1bb70 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
1bb80 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69  val==2 ) raw_pri
1bb90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
1bba0 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20  tf16le)");.     
1bbb0 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20     if( val==3 ) 
1bbc0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
1bbd0 74 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29  t, " (utf16be)")
1bbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bbf0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
1bc00 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
1bc10 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29  }.  if( zDb==0 )
1bc20 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
1bc30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1bc40 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  tf("main.sqlite_
1bc50 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
1bc60 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62  e if( strcmp(zDb
1bc70 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"temp")==0 ){. 
1bc80 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
1bc90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bca0 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65  "%s", "sqlite_te
1bcb0 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  mp_master");.  }
1bcc0 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d  else{.    zSchem
1bcd0 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
1bce0 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73  printf("\"%w\".s
1bcf0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a  qlite_master", z
1bd00 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Db);.  }.  for(i
1bd10 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1bd20 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20  aQuery); i++){. 
1bd30 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1bd40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bd50 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20  aQuery[i].zSql, 
1bd60 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20  zSchemaTab);.   
1bd70 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e   int val = db_in
1bd80 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  t(p, zSql);.    
1bd90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1bda0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
1bdb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1bdc0 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79  0s %d\n", aQuery
1bdd0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
1bde0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1bdf0 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b  ree(zSchemaTab);
1be00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1be10 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1be20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
1be30 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74  errmsg() value t
1be40 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
1be50 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 1..*/.static
1be60 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61   int shellDataba
1be70 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  seError(sqlite3 
1be80 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
1be90 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74  ar *zErr = sqlit
1bea0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20  e3_errmsg(db);. 
1beb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1bec0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
1bed0 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74  n", zErr);.  ret
1bee0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1bef0 50 72 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d  Print an out-of-
1bf00 6d 65 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74  memory message t
1bf10 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
1bf20 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 1..*/.static
1bf30 20 69 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45   int shellNomemE
1bf40 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61  rror(void){.  ra
1bf50 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1bf60 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
1bf70 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65  memory\n");.  re
1bf80 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1bf90 20 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74   Compare the pat
1bfa0 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20  tern in zGlob[] 
1bfb0 61 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74  against the text
1bfc0 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
1bfd0 20 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79   TRUE.** if they
1bfe0 20 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45   match and FALSE
1bff0 20 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20   (0) if they do 
1c000 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a  not match..**.**
1c010 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a   Globbing rules:
1c020 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20  .**.**      '*' 
1c030 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
1c040 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
1c050 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
1c060 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
1c070 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63    '?'       Matc
1c080 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  hes exactly one 
1c090 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a  character..**.**
1c0a0 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20       [...]      
1c0b0 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
1c0c0 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65  acter from the e
1c0d0 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a  nclosed list of.
1c0e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c0f0 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a    characters..**
1c100 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20  .**     [^...]  
1c110 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
1c120 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20  haracter not in 
1c130 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
1c140 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23  t..**.**      '#
1c150 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
1c160 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
1c170 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69  one or more digi
1c180 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20  ts with an.**   
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74               opt
1c1a0 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67  ional + or - sig
1c1b0 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a  n in front.**.**
1c1c0 20 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20        ' '       
1c1d0 41 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74  Any span of whit
1c1e0 65 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61  espace matches a
1c1f0 6e 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66  ny other span of
1c200 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c210 20 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a     whitespace..*
1c220 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65  *.** Extra white
1c230 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
1c240 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72   of z[] is ignor
1c250 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c260 74 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  t testcase_glob(
1c270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
1c280 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1c290 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a  ){.  int c, c2;.
1c2a0 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
1c2b0 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69  int seen;..  whi
1c2c0 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f  le( (c = (*(zGlo
1c2d0 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  b++)))!=0 ){.   
1c2e0 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20   if( IsSpace(c) 
1c2f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  ){.      if( !Is
1c300 53 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75  Space(*z) ) retu
1c310 72 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c  rn 0;.      whil
1c320 65 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f  e( IsSpace(*zGlo
1c330 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20  b) ) zGlob++;.  
1c340 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
1c350 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
1c360 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1c370 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  *' ){.      whil
1c380 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b  e( (c=(*(zGlob++
1c390 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d  ))) == '*' || c=
1c3a0 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='?' ){.        
1c3b0 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a  if( c=='?' && (*
1c3c0 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75  (z++))==0 ) retu
1c3d0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1c3e0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1c3f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1c400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c410 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
1c420 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
1c430 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a   testcase_glob(z
1c440 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a  Glob-1,z)==0 ){.
1c450 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20            z++;. 
1c460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c470 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b   return (*z)!=0;
1c480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
1c490 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a  hile( (c2 = (*(z
1c4a0 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
1c4b0 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63      while( c2!=c
1c4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
1c4d0 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20   = *(z++);.     
1c4e0 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
1c4f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1c500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c510 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a   testcase_glob(z
1c520 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e  Glob,z) ) return
1c530 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1c540 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c550 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27  }else if( c=='?'
1c560 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a   ){.      if( (*
1c570 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75  (z++))==0 ) retu
1c580 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
1c590 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
1c5a0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20      int prior_c 
1c5b0 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20  = 0;.      seen 
1c5c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72  = 0;.      inver
1c5d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d  t = 0;.      c =
1c5e0 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69   *(z++);.      i
1c5f0 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
1c600 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a   0;.      c2 = *
1c610 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1c620 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a   if( c2=='^' ){.
1c630 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d          invert =
1c640 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
1c650 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1c660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1c670 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2==']' ){.      
1c680 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73    if( c==']' ) s
1c690 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1c6a0 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
1c6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c6c0 77 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21  while( c2 && c2!
1c6d0 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
1c6e0 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a  if( c2=='-' && z
1c6f0 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20  Glob[0]!=']' && 
1c700 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70  zGlob[0]!=0 && p
1c710 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20  rior_c>0 ){.    
1c720 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
1c730 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  ob++);.         
1c740 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20   if( c>=prior_c 
1c750 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20  && c<=c2 ) seen 
1c760 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
1c770 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
1c780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c790 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29       if( c==c2 )
1c7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
1c7b0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1c7c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72    }.          pr
1c7d0 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
1c7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32      }.        c2
1c7f0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
1c800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c810 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20   c2==0 || (seen 
1c820 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72  ^ invert)==0 ) r
1c830 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
1c840 73 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b  se if( c=='#' ){
1c850 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d  .      if( (z[0]
1c860 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27  =='-' || z[0]=='
1c870 2b 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a  +') && IsDigit(z
1c880 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  [1]) ) z++;.    
1c890 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a    if( !IsDigit(z
1c8a0 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [0]) ) return 0;
1c8b0 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
1c8c0 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
1c8d0 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d  (z[0]) ){ z++; }
1c8e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c8f0 20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29    if( c!=(*(z++)
1c900 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1c910 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
1c920 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20   IsSpace(*z) ){ 
1c930 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  z++; }.  return 
1c940 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  *z==0;.}.../*.**
1c950 20 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72   Compare the str
1c960 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64  ing as a command
1c970 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74  -line option wit
1c980 68 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20  h either one or 
1c990 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22  two.** initial "
1c9a0 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  -" characters..*
1c9b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74  /.static int opt
1c9c0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
1c9d0 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74  har *zStr, const
1c9e0 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20   char *zOpt){.  
1c9f0 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27  if( zStr[0]!='-'
1ca00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1ca10 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74  Str++;.  if( zSt
1ca20 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72  r[0]=='-' ) zStr
1ca30 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72  ++;.  return str
1ca40 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d  cmp(zStr, zOpt)=
1ca50 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  =0;.}../*.** Del
1ca60 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69  ete a file..*/.i
1ca70 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69  nt shellDeleteFi
1ca80 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
1ca90 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
1caa0 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e   rc;.#ifdef _WIN
1cab0 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20  32.  wchar_t *z 
1cac0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1cad0 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
1cae0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  zFilename);.  rc
1caf0 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a   = _wunlink(z);.
1cb00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1cb10 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
1cb20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
1cb30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1cb40 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1cb50 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1cb60 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
1cb70 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f  r function fkey_
1cb80 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29  collate_clause()
1cb90 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  , used.** by the
1cba0 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64   ".lint fkey-ind
1cbb0 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  exes" command. T
1cbc0 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74  his scalar funct
1cbd0 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ion is always.**
1cbe0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75   called with fou
1cbf0 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68  r arguments - th
1cc00 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  e parent table n
1cc10 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  ame, the parent 
1cc20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20  column name,.** 
1cc30 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
1cc40 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69  name and the chi
1cc50 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  ld column name..
1cc60 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c  **.**   fkey_col
1cc70 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72  late_clause('par
1cc80 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e  ent-tab', 'paren
1cc90 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74  t-col', 'child-t
1cca0 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27  ab', 'child-col'
1ccb0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ).**.** If eithe
1ccc0 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  r of the named t
1ccd0 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73  ables or columns
1cce0 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74   do not exist, t
1ccf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1cd00 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79  returns an empty
1cd10 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74   string. An empt
1cd20 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f  y string is also
1cd30 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74   returned if bot
1cd40 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  h tables.** and 
1cd50 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75  columns exist bu
1cd60 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
1cd70 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
1cd80 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a  n sequence. Or,.
1cd90 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74  ** if both exist
1cda0 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74   but the default
1cdb0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1cdc0 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65  nces are differe
1cdd0 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  nt, this.** func
1cde0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
1cdf0 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54   string " COLLAT
1ce00 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  E <parent-collat
1ce10 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20  ion>", where.** 
1ce20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
1ce30 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  n> is the defaul
1ce40 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
1ce50 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65  ence of the pare
1ce60 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  nt column..*/.st
1ce70 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46  atic void shellF
1ce80 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
1ce90 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1cea0 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
1ceb0 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
1cec0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
1ced0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1cee0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
1cef0 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
1cf00 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
1cf10 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73  *zParent;.  cons
1cf20 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43  t char *zParentC
1cf30 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
1cf40 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20   *zParentSeq;.  
1cf50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
1cf60 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ld;.  const char
1cf70 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63   *zChildCol;.  c
1cf80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
1cf90 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  dSeq = 0;  /* In
1cfa0 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69  itialize to avoi
1cfb0 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  d false-positive
1cfc0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   warning */.  in
1cfd0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1cfe0 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50   nVal==4 );.  zP
1cff0 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
1d000 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1d010 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
1d020 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20  );.  zParentCol 
1d030 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1d040 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1d050 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a  t(apVal[1]);.  z
1d060 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63  Child = (const c
1d070 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1d080 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
1d090 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d  );.  zChildCol =
1d0a0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1d0b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1d0c0 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73  (apVal[3]);..  s
1d0d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1d0e0 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c  xt(pCtx, "", -1,
1d0f0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1d100 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1d110 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1d120 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c  adata(.      db,
1d130 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74   "main", zParent
1d140 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c  , zParentCol, 0,
1d150 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c   &zParentSeq, 0,
1d160 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
1d170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d180 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d190 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
1d1a0 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
1d1b0 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43    db, "main", zC
1d1c0 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c  hild, zChildCol,
1d1d0 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20   0, &zChildSeq, 
1d1e0 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  0, 0, 0.    );. 
1d1f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1d200 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
1d210 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65  e3_stricmp(zPare
1d220 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71  ntSeq, zChildSeq
1d230 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
1d240 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d250 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22  tf(" COLLATE %s"
1d260 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20  , zParentSeq);. 
1d270 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1d280 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
1d290 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
1d2a0 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
1d2b0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
1d2c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
1d2d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d2e0 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69  dot-command ".li
1d2f0 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
1d300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d310 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
1d320 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
1d330 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
1d340 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
1d350 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
1d360 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
1d370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d380 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1d390 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
1d3a0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
1d3b0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d3e0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
1d3f0 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  rg[] */.){.  sql
1d400 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74  ite3 *db = pStat
1d410 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
1d420 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1d430 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20  to query "main" 
1d440 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20  db of */.  FILE 
1d450 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
1d460 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ut;        /* St
1d470 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f  ream to write no
1d480 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74  n-error output t
1d490 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62  o */.  int bVerb
1d4a0 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ose = 0;        
1d4b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65         /* If -ve
1d4c0 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74  rbose is present
1d4d0 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70   */.  int bGroup
1d4e0 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20  ByParent = 0;   
1d4f0 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f        /* If -gro
1d500 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72  upbyparent is pr
1d510 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esent */.  int i
1d520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1d540 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1d550 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f   azArg[] */.  co
1d560 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e  nst char *zInden
1d570 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a  t = "";       /*
1d580 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64   How much to ind
1d590 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  ent CREATE INDEX
1d5a0 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   by */.  int rc;
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d5d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
1d5e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20  ite3_stmt *pSql 
1d5f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1d600 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  Compiled version
1d610 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   of SQL statemen
1d620 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a  t below */..  /*
1d630 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43  .  ** This SELEC
1d640 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  T statement retu
1d650 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20  rns one row for 
1d660 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  each foreign key
1d670 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a   constraint.  **
1d680 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f   in the schema o
1d690 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
1d6a0 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ase. The column 
1d6b0 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a  values are:.  **
1d6c0 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78  .  ** 0. The tex
1d6d0 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
1d6e0 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f  ement similar to
1d6f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1d700 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
1d710 50 4c 41 4e 20 53 45 4c 45 43 54 20 72 6f 77 69  PLAN SELECT rowi
1d720 64 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62  d FROM child_tab
1d730 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b  le WHERE child_k
1d740 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ey=?".  **.  ** 
1d750 20 20 20 54 68 69 73 20 69 73 20 74 68 65 20 73     This is the s
1d760 61 6d 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  ame SELECT that 
1d770 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  the foreign keys
1d780 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1d790 6e 65 65 64 73 0a 20 20 2a 2a 20 20 20 20 74 6f  needs.  **    to
1d7a0 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20   run internally 
1d7b0 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e  on child tables.
1d7c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1d7d0 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20  index that can. 
1d7e0 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20 74   **    be used t
1d7f0 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20  o optimize this 
1d800 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63  query, then it c
1d810 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  an also be used 
1d820 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20  by the FK.  **  
1d830 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e    implementation
1d840 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c   to optimize DEL
1d850 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74  ETE or UPDATE st
1d860 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  atements on the 
1d870 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74  parent.  **    t
1d880 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
1d890 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72  1. A GLOB patter
1d8a0 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73  n suitable for s
1d8b0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29  qlite3_strglob()
1d8c0 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75  . If the plan ou
1d8d0 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20  tput by.  **    
1d8e0 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
1d8f0 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d  Y PLAN command m
1d900 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74 74  atches this patt
1d910 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63  ern, then the sc
1d920 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e  hema.  **    con
1d930 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74  tains an index t
1d940 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1d950 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
1d960 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1d970 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   2. Human readab
1d980 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
1d990 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c 64  cribes the child
1d9a0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
1d9b0 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  ns. e.g..  **.  
1d9c0 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f  **       "child_
1d9d0 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31  table(child_key1
1d9e0 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20  , child_key2)". 
1d9f0 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61   **.  ** 3. Huma
1da00 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
1da10 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1da20 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
1da30 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67  and columns. e.g
1da40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
1da50 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28    "parent_table(
1da60 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72  parent_key1, par
1da70 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ent_key2)".  **.
1da80 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43    ** 4. A full C
1da90 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1daa0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  ement for an ind
1dab0 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65  ex that could be
1dac0 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20   used to.  **   
1dad0 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45   optimize DELETE
1dae0 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
1daf0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72  ments on the par
1db00 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a  ent table. e.g..
1db10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1db20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 68  "CREATE INDEX ch
1db30 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f  ild_table_child_
1db40 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62  key ON child_tab
1db50 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20  le(child_key)". 
1db60 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20   **.  ** 5. The 
1db70 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65  name of the pare
1db80 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  nt table..  **. 
1db90 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76 61   ** These six va
1dba0 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62 79  lues are used by
1dbb0 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c   the C logic bel
1dbc0 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74  ow to generate t
1dbd0 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a  he report..  */.
1dbe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1dbf0 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22  ql =.  "SELECT "
1dc00 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50 4c  .    "     'EXPL
1dc10 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
1dc20 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
1dc30 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
1dc40 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
1dc50 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
1dc60 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
1dc70 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
1dc80 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
1dc90 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
1dca0 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
1dcb0 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
1dcc0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1dcd0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1dce0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1dcf0 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1dd00 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
1dd10 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
1dd20 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
1dd30 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
1dd40 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
1dd50 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
1dd60 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
1dd70 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
1dd80 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
1dd90 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
1dda0 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
1ddb0 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
1ddc0 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
1ddd0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
1dde0 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
1ddf0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
1de00 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
1de10 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
1de20 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
1de30 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
1de40 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
1de50 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
1de60 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
1de70 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
1de80 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
1de90 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
1dea0 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
1deb0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
1dec0 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
1ded0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
1dee0 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
1def0 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
1df00 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1df10 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1df20 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1df30 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1df40 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
1df50 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
1df60 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
1df70 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
1df80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
1df90 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
1dfa0 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
1dfb0 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
1dfc0 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
1dfd0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
1dfe0 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
1dff0 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
1e000 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
1e010 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
1e020 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
1e030 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
1e040 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
1e050 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
1e060 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
1e070 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
1e080 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
1e090 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1e0a0 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
1e0b0 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
1e0c0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
1e0d0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
1e0e0 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  len(azArg[i]);. 
1e0f0 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71     if( n>1 && sq
1e100 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
1e110 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67  -verbose", azArg
1e120 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
1e130 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31      bVerbose = 1
1e140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
1e150 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
1e160 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67  te3_strnicmp("-g
1e170 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61  roupbyparent", a
1e180 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
1e190 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79  {.      bGroupBy
1e1a0 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  Parent = 1;.    
1e1b0 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20    zIndent = "   
1e1c0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   ";.    }.    el
1e1d0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
1e1e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
1e1f0 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72  age: %s %s ?-ver
1e200 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70  bose? ?-groupbyp
1e210 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20  arent?\n",.     
1e220 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61       azArg[0], a
1e230 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b  zArg[1].      );
1e240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e250 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1e260 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  }.  }..  /* Regi
1e270 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
1e280 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
1e290 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
1e2a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1e2b0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1e2c0 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
1e2d0 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
1e2e0 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
1e2f0 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
1e300 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
1e310 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
1e320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1e340 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
1e350 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
1e360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1e370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e380 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1e390 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
1e3a0 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
1e3b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
1e3d0 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
1e3e0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
1e3f0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
1e400 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
1e410 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
1e420 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
1e430 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1e440 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
1e450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e460 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
1e470 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1e480 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
1e490 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1e4a0 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
1e4b0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e4c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
1e4d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
1e4e0 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
1e4f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e500 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1e510 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
1e520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1e530 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
1e540 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1e550 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
1e560 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1e570 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
1e580 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1e590 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1e5a0 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
1e5b0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
1e5c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1e5d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1e5e0 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
1e5f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1e600 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
1e610 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
1e620 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
1e630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e640 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1e650 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
1e660 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
1e670 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
1e680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
1e690 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
1e6a0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1e6b0 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
1e6c0 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
1e6d0 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
1e6e0 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
1e6f0 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
1e700 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
1e710 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
1e720 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
1e730 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
1e740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1e750 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1e760 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
1e770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e780 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
1e790 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
1e7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
1e7b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1e7c0 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
1e7d0 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
1e7e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
1e7f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1e800 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a   bGroupByParent.
1e810 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72          && (bVer
1e820 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a  bose || res==0).
1e830 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65          && (zPre
1e840 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
1e850 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c  stricmp(zParent,
1e860 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20   zPrev)).       
1e870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
1e880 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
1e890 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25  - Parent table %
1e8a0 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  s\n", zParent);.
1e8b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e8c0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20  3_free(zPrev);. 
1e8d0 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d           zPrev =
1e8e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1e8f0 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b  ("%s", zParent);
1e900 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e910 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
1e920 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
1e930 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
1e940 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e  s --> %s\n", zIn
1e950 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67  dent, zCI, zTarg
1e960 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
1e970 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20  se if( bVerbose 
1e980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
1e990 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1e9a0 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65  /* no extra inde
1e9b0 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  xes required for
1e9c0 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c   %s -> %s */\n",
1e9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
1e9e0 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a  Indent, zFrom, z
1e9f0 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  Target.         
1ea00 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
1ea10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ea20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
1ea30 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ev);..    if( rc
1ea40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ea50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
1ea60 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
1ea70 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1ea80 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  b));.    }..    
1ea90 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
1eaa0 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20  nalize(pSql);.  
1eab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1eac0 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49  _OK && rc2!=SQLI
1ead0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1eae0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72  c = rc2;.      r
1eaf0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1eb00 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
1eb10 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
1eb20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1eb30 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1eb40 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
1eb50 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
1eb60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1eb70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1eb80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
1eb90 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61  .lint" dot comma
1eba0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
1ebb0 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64  t lintDotCommand
1ebc0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
1ebd0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
1ebe0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1ebf0 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
1ec00 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
1ec10 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1ec20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1ec30 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
1ec40 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
1ec50 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ec80 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
1ec90 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Arg[] */.){.  in
1eca0 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67  t n;.  n = (nArg
1ecb0 3e 3d 32 20 3f 20 28 69 6e 74 29 73 74 72 6c 65  >=2 ? (int)strle
1ecc0 6e 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  n(azArg[1]) : 0)
1ecd0 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73  ;.  if( n<1 || s
1ece0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
1ecf0 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d  azArg[1], "fkey-
1ed00 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67  indexes", n) ) g
1ed10 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74  oto usage;.  ret
1ed20 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65  urn lintFkeyInde
1ed30 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72  xes(pState, azAr
1ed40 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67  g, nArg);.. usag
1ed50 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  e:.  raw_printf(
1ed60 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20 25  stderr, "Usage %
1ed70 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73  s sub-command ?s
1ed80 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20  witches...?\n", 
1ed90 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77  azArg[0]);.  raw
1eda0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1edb0 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61  "Where sub-comma
1edc0 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20  nds are:\n");.  
1edd0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1ede0 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64  r, "    fkey-ind
1edf0 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75  exes\n");.  retu
1ee00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1ee10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  .}.../*.** If an
1ee20 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
1ee30 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
1ee40 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
1ee50 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
1ee60 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
1ee70 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
1ee80 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
1ee90 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
1eea0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1eeb0 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
1eec0 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68  (char *zLine, Sh
1eed0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
1eee0 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74  int h = 1;.  int
1eef0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
1ef00 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
1ef10 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
1ef20 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61  rg[50];..  /* Pa
1ef30 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69  rse the input li
1ef40 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a  ne into tokens..
1ef50 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c    */.  while( zL
1ef60 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41  ine[h] && nArg<A
1ef70 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
1ef80 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  ){.    while( Is
1ef90 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
1efa0 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ h++; }.    if
1efb0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20  ( zLine[h]==0 ) 
1efc0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a  break;.    if( z
1efd0 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c  Line[h]=='\'' ||
1efe0 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29   zLine[h]=='"' )
1eff0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69  {.      int deli
1f000 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a  m = zLine[h++];.
1f010 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
1f020 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
1f030 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
1f040 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[h] && zLine[
1f050 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]!=delim ){.   
1f060 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
1f070 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d  ]=='\\' && delim
1f080 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68  =='"' && zLine[h
1f090 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20  +1]!=0 ) h++;.  
1f0a0 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20        h++;.     
1f0b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
1f0c0 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]==delim ){.
1f0d0 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b          zLine[h+
1f0e0 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  +] = 0;.      }.
1f0f0 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d        if( delim=
1f100 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62  ='"' ) resolve_b
1f110 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
1f120 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
1f130 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72  else{.      azAr
1f140 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69  g[nArg++] = &zLi
1f150 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69  ne[h];.      whi
1f160 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20  le( zLine[h] && 
1f170 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68  !IsSpace(zLine[h
1f180 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
1f190 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20     if( zLine[h] 
1f1a0 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30  ) zLine[h++] = 0
1f1b0 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f  ;.      resolve_
1f1c0 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
1f1d0 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
1f1e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
1f1f0 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69  ess the input li
1f200 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
1f210 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
1f220 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c  0; /* no tokens,
1f230 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e   no error */.  n
1f240 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
1f250 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41  g[0]);.  c = azA
1f260 72 67 5b 30 5d 5b 30 5d 3b 0a 0a 23 69 66 6e 64  rg[0][0];..#ifnd
1f270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f280 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
1f290 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
1f2a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
1f2b0 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  auth", n)==0 ){.
1f2c0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
1f2d0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
1f2e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
1f2f0 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46  ge: .auth ON|OFF
1f300 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
1f310 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
1f320 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
1f330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
1f340 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
1f350 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
1f360 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20  azArg[1]) ){.   
1f370 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
1f380 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c  uthorizer(p->db,
1f390 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a   shellAuth, p);.
1f3a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f3b0 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
1f3c0 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30  horizer(p->db, 0
1f3d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
1f3e0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
1f3f0 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  ( (c=='b' && n>=
1f400 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
1f410 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c  rg[0], "backup",
1f420 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63   n)==0).   || (c
1f430 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='s' && n>=3 &&
1f440 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
1f450 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30  ], "save", n)==0
1f460 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
1f470 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65   char *zDestFile
1f480 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
1f490 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
1f4a0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
1f4b0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
1f4c0 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
1f4d0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
1f4e0 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20  or(j=1; j<nArg; 
1f4f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  j++){.      cons
1f500 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
1f510 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[j];.      if( 
1f520 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
1f530 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d       while( z[0]
1f540 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
1f550 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69 6f       /* No optio
1f560 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 61 74  ns to process at
1f570 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
1f580 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1f590 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1f5a0 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  derr, "unknown o
1f5b0 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a  ption: %s\n", az
1f5c0 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[j]);.       
1f5d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1f5f0 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65  se if( zDestFile
1f600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
1f610 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
1f620 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
1f630 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20   if( zDb==0 ){. 
1f640 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65         zDb = zDe
1f650 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20  stFile;.        
1f660 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
1f670 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
1f680 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
1f690 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 74  rintf(stderr, "t
1f6a0 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74  oo many argument
1f6b0 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c 6e 22 29  s to .backup\n")
1f6c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f6d0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f6e0 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74 46  }.    if( zDestF
1f6f0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
1f700 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1f710 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45  r, "missing FILE
1f720 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e  NAME argument on
1f730 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20   .backup\n");.  
1f740 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f750 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d    }.    if( zDb=
1f760 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e  =0 ) zDb = "main
1f770 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ";.    rc = sqli
1f780 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69  te3_open(zDestFi
1f790 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20  le, &pDest);.   
1f7a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f7b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
1f7c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1f7d0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
1f7e0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
1f7f0 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20  DestFile);.     
1f800 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1f810 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
1f820 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1f830 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
1f840 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
1f850 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
1f860 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
1f870 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20   p->db, zDb);.  
1f880 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
1f890 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1f8a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1f8b0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
1f8c0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
1f8d0 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
1f8e0 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
1f8f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1f900 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1f910 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  (  (rc = sqlite3
1f920 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
1f930 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
1f940 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71  TE_OK ){}.    sq
1f950 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
1f960 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
1f970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f980 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
1f990 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
1f9a0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1f9b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1f9c0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
1f9d0 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
1f9e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
1f9f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1fa00 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
1fa10 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
1fa20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
1fa30 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
1fa40 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d  0], "bail", n)==
1fa50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
1fa60 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61  g==2 ){.      ba
1fa70 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
1fa80 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
1fa90 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
1faa0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
1fab0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
1fac0 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e  : .bail on|off\n
1fad0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
1fae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1faf0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
1fb00 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
1fb10 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61  (azArg[0], "bina
1fb20 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ry", n)==0 ){.  
1fb30 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
1fb40 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  .      if( boole
1fb50 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
1fb60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ) ){.        set
1fb70 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75  BinaryMode(p->ou
1fb80 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 1);.      }el
1fb90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54  se{.        setT
1fba0 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
1fbb0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1fbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
1fbd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1fbe0 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20  "Usage: .binary 
1fbf0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
1fc00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
1fc10 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
1fc20 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70 28  =='c' && strcmp(
1fc30 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d  azArg[0],"cd")==
1fc40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
1fc50 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69  g==2 ){.#if defi
1fc60 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
1fc70 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
1fc80 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d      wchar_t *z =
1fc90 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
1fca0 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61  tf8_to_unicode(a
1fcb0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
1fcc0 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74  rc = !SetCurrent
1fcd0 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20  DirectoryW(z);. 
1fce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1fcf0 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  e(z);.#else.    
1fd00 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41    rc = chdir(azA
1fd10 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  rg[1]);.#endif. 
1fd20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1fd30 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1fd40 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
1fd50 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72  ot change to dir
1fd60 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22  ectory \"%s\"\n"
1fd70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
1fd80 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
1fd90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1fda0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1fdb0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
1fdc0 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e   .cd DIRECTORY\n
1fdd0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
1fde0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1fdf0 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75  .  /* The undocu
1fe00 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f  mented ".breakpo
1fe10 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  int" command cau
1fe20 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ses a call to th
1fe30 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75  e no-op.  ** rou
1fe40 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f  tine named test_
1fe50 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20  breakpoint()..  
1fe60 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  */.  if( c=='b' 
1fe70 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
1fe80 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72  mp(azArg[0], "br
1fe90 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30  eakpoint", n)==0
1fea0 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65   ){.    test_bre
1feb0 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c  akpoint();.  }el
1fec0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
1fed0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
1fee0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
1fef0 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29  hanges", n)==0 )
1ff00 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
1ff10 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
1ff20 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
1ff30 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c  LG_CountChanges,
1ff40 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
1ff50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
1ff60 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ff70 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73  "Usage: .changes
1ff80 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
1ff90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
1ffa0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43  .  }else..  /* C
1ffb0 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64  ancel output red
1ffc0 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  irection, if it 
1ffd0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
1ffe0 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a   (by .testcase).
1fff0 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74    ** Then read t
20000 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
20010 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  e testcase-out.t
20020 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70  xt file and comp
20030 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  are against.  **
20040 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74   azArg[1].  If t
20050 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
20060 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20  nces, report an 
20070 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a  error and exit..
20080 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63    */.  if( c=='c
20090 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
200a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
200b0 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b  check", n)==0 ){
200c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20  .    char *zRes 
200d0 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f  = 0;.    output_
200e0 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
200f0 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
20100 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
20110 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
20120 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52  heck GLOB-PATTER
20130 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  N\n");.      rc 
20140 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
20150 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46  f( (zRes = readF
20160 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75  ile("testcase-ou
20170 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29  t.txt", 0))==0 )
20180 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
20190 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
201a0 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27  r: cannot read '
201b0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
201c0 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  '\n");.      rc 
201d0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
201e0 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  f( testcase_glob
201f0 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d  (azArg[1],zRes)=
20200 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
20210 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  _printf(stderr,.
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46 41   "testcase-%s FA
20240 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a  ILED\n Expected:
20250 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74   [%s]\n      Got
20260 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  : [%s]\n",.     
20270 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
20280 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b  Testcase, azArg[
20290 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20  1], zRes);.     
202a0 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
202b0 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
202c0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
202d0 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22  estcase-%s ok\n"
202e0 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b  , p->zTestcase);
202f0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b  .      p->nCheck
20300 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
20310 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29  lite3_free(zRes)
20320 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
20330 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63   c=='c' && strnc
20340 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c  mp(azArg[0], "cl
20350 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  one", n)==0 ){. 
20360 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
20370 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f  {.      tryToClo
20380 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ne(p, azArg[1]);
20390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
203a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
203b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c  err, "Usage: .cl
203c0 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  one FILENAME\n")
203d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
203e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
203f0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
20400 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
20410 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
20420 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
20430 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
20440 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
20450 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
20460 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
20470 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
20480 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
20490 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
204a0 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
204b0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
204c0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
204d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
204e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
204f0 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  ta.colSeparator)
20500 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  ,data.colSeparat
20510 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61  or,": ");.    da
20520 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
20530 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
20540 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
20550 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67  , file FROM prag
20560 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74  ma_database_list
20570 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20580 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
20590 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
205a0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
205b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
205c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
205d0 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
205e0 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
205f0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
20600 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
20610 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
20620 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
20630 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
20640 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30   "dbinfo", n)==0
20650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 68 65   ){.    rc = she
20660 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e  ll_dbinfo_comman
20670 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67  d(p, nArg, azArg
20680 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
20690 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e  ( c=='d' && strn
206a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
206b0 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ump", n)==0 ){. 
206c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
206d0 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Like = 0;.    in
206e0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 73 61 76  t i;.    int sav
206f0 65 64 53 68 6f 77 48 65 61 64 65 72 20 3d 20 70  edShowHeader = p
20700 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
20710 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
20720 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
20730 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65  veRowid|SHFLG_Ne
20740 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 66 6f 72  wlines);.    for
20750 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
20760 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  +){.      if( az
20770 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29  Arg[i][0]=='-' )
20780 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
20790 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
207a0 69 5d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  i]+1;.        if
207b0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[0]=='-' ) z+
207c0 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  +;.        if( s
207d0 74 72 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76  trcmp(z,"preserv
207e0 65 2d 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b  e-rowids")==0 ){
207f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
20800 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20810 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
20820 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54  rintf(stderr, "T
20830 68 65 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  he --preserve-ro
20840 77 69 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e  wids option is n
20850 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20  ot compatible". 
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69              " wi
20880 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  th SQLITE_OMIT_V
20890 49 52 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b  IRTUALTABLE\n");
208a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
208b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
208c0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
208d0 78 69 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  xit;.#else.     
208e0 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61       ShellSetFla
208f0 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
20900 72 76 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69  rveRowid);.#endi
20910 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  f.        }else.
20920 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
20930 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29  mp(z,"newlines")
20940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20950 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
20960 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
20970 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
20980 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
20990 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
209a0 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
209b0 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
209c0 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61   \".dump\"\n", a
209d0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
209e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
209f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
20a00 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
20a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
20a20 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b  lse if( zLike ){
20a30 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
20a40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
20a50 67 65 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65  ge: .dump ?--pre
20a60 73 65 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a  serve-rowids? ".
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e             "?--n
20a90 65 77 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50  ewlines? ?LIKE-P
20aa0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
20ab0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
20ac0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
20ad0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
20ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20af0 20 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b    zLike = azArg[
20b00 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
20b10 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
20b20 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e   0);.    /* When
20b30 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20   playing back a 
20b40 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74  "dump", the cont
20b50 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61 72  ent might appear
20b60 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20   in an order.   
20b70 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65 73   ** which causes
20b80 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
20b90 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
20ba0 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65  ts to be violate
20bb0 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73  d..    ** So dis
20bc0 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79  able foreign-key
20bd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f   constraint enfo
20be0 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65  rcement to preve
20bf0 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a  nt problems. */.
20c00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
20c10 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66  ->out, "PRAGMA f
20c20 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b  oreign_keys=OFF;
20c30 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  \n");.    raw_pr
20c40 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45  intf(p->out, "BE
20c50 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b  GIN TRANSACTION;
20c60 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69  \n");.    p->wri
20c70 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
20c80 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
20c90 65 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53  er = 0;.    /* S
20ca0 65 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  et writable_sche
20cb0 6d 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e  ma=ON since doin
20cc0 67 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69  g so forces SQLi
20cd0 74 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  te to initialize
20ce0 0a 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20  .    ** as much 
20cf0 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 61 73  of the schema as
20d00 20 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20   it can even if 
20d10 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
20d20 72 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a  r table is.    *
20d30 2a 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  * corrupt. */.  
20d40 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
20d50 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54  ->db, "SAVEPOINT
20d60 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72   dump; PRAGMA wr
20d70 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
20d80 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
20d90 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20   p->nErr = 0;.  
20da0 20 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29    if( zLike==0 )
20db0 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  {.      run_sche
20dc0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
20dd0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
20de0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
20df0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
20e00 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
20e10 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
20e20 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  L AND type=='tab
20e30 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73  le' AND name!='s
20e40 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
20e50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
20e60 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
20e70 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
20e80 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
20e90 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
20ea0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
20eb0 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61 6d        "WHERE nam
20ec0 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e=='sqlite_seque
20ed0 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
20ee0 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64       run_table_d
20ef0 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
20f00 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
20f10 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
20f20 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
20f30 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
20f40 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27  L AND type IN ('
20f50 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
20f60 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20 20  ,'view')", 0.   
20f70 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
20f80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
20f90 6c 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  l;.      zSql = 
20fa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20fb0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
20fc0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
20fd0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
20fe0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
20ff0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49  HERE tbl_name LI
21000 4b 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d 3d  KE %Q AND type==
21010 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20  'table'".       
21020 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
21030 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20  NULL", zLike);. 
21040 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
21050 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53 71  dump_query(p,zSq
21060 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
21070 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
21080 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
21090 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
210a0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
210b0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
210c0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
210d0 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
210e0 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
210f0 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
21100 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
21110 77 27 29 22 0a 20 20 20 20 20 20 20 20 22 20 20  w')".        "  
21120 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
21130 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20  E %Q", zLike);. 
21140 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64       run_table_d
21150 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 71  ump_query(p, zSq
21160 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 0);.      sql
21170 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
21180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
21190 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
211a0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
211b0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
211c0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
211d0 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  hema=OFF;\n");. 
211e0 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
211f0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
21200 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
21210 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
21220 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
21230 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
21240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
21250 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
21260 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30  ASE dump;", 0, 0
21270 2c 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 0);.    raw_pr
21280 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  intf(p->out, p->
21290 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b  nErr ? "ROLLBACK
212a0 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f  ; -- due to erro
212b0 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b  rs\n" : "COMMIT;
212c0 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f  \n");.    p->sho
212d0 77 48 65 61 64 65 72 20 3d 20 73 61 76 65 64 53  wHeader = savedS
212e0 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 7d 65 6c  howHeader;.  }el
212f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
21300 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
21310 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29  g[0], "echo", n)
21320 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
21330 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
21340 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70  setOrClearFlag(p
21350 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a  , SHFLG_Echo, az
21360 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
21370 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
21380 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
21390 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66  age: .echo on|of
213a0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
213b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
213c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
213d0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
213e0 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d  g[0], "eqp", n)=
213f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
21400 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rg==2 ){.      i
21410 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
21420 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  1],"full")==0 ){
21430 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
21440 45 51 50 20 3d 20 32 3b 0a 20 20 20 20 20 20 7d  EQP = 2;.      }
21450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
21460 3e 61 75 74 6f 45 51 50 20 3d 20 62 6f 6f 6c 65  >autoEQP = boole
21470 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
21480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21490 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
214a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
214b0 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 6e 7c 6f  Usage: .eqp on|o
214c0 66 66 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20  ff|full\n");.   
214d0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
214e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
214f0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
21500 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69  p(azArg[0], "exi
21510 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
21520 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28   if( nArg>1 && (
21530 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  rc = (int)intege
21540 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
21550 29 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b  )!=0 ) exit(rc);
21560 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d  .    rc = 2;.  }
21570 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22  else..  /* The "
21580 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e  .explain" comman
21590 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e  d is automatic n
215a0 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65  ow.  It is large
215b0 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49  ly pointless.  I
215c0 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20  t.  ** retained 
215d0 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77  purely for backw
215e0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
215f0 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  ty */.  if( c=='
21600 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
21610 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e  Arg[0], "explain
21620 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
21630 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20  int val = 1;.   
21640 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
21650 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
21660 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22  (azArg[1],"auto"
21670 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21680 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20  val = 99;.      
21690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76  }else{.        v
216a0 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c  al =  booleanVal
216b0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
216c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
216d0 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d  if( val==1 && p-
216e0 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c  >mode!=MODE_Expl
216f0 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ain ){.      p->
21700 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e  normalMode = p->
21710 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  mode;.      p->m
21720 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
21730 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  in;.      p->aut
21740 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  oExplain = 0;.  
21750 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d    }else if( val=
21760 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
21770 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
21780 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
21790 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
217a0 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
217b0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
217c0 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39  else if( val==99
217d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
217e0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
217f0 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20  ain ) p->mode = 
21800 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20  p->normalMode;. 
21810 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c       p->autoExpl
21820 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ain = 1;.    }. 
21830 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
21840 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='f' && strncmp(
21850 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73  azArg[0], "fulls
21860 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b  chema", n)==0 ){
21870 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20  .    ShellState 
21880 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
21890 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
218a0 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30   int doStats = 0
218b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
218c0 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
218d0 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
218e0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
218f0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
21900 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
21910 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e  _Semi;.    if( n
21920 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e  Arg==2 && option
21930 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20  Match(azArg[1], 
21940 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20  "indent") ){.   
21950 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
21960 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
21970 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e  _Pretty;.      n
21980 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Arg = 1;.    }. 
21990 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29     if( nArg!=1 )
219a0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
219b0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
219c0 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f  e: .fullschema ?
219d0 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20  --indent?\n");. 
219e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
219f0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
21a00 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
21a10 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
21a20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
21a30 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
21a40 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
21a50 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20  sql FROM".      
21a60 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20   "  (SELECT sql 
21a70 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20  sql, type type, 
21a80 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d  tbl_name tbl_nam
21a90 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f  e, name name, ro
21aa0 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22 20  wid x".       " 
21ab0 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
21ac0 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
21ad0 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45 4c  ".       "   SEL
21ae0 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
21af0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
21b00 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
21b10 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a  _temp_master) ".
21b20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
21b30 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73  pe!='meta' AND s
21b40 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e  ql NOTNULL AND n
21b50 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
21b60 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20  lite_%' ".      
21b70 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
21b80 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ",.       callba
21b90 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
21ba0 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Msg.    );.    i
21bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21bc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21bd0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
21be0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21bf0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
21c00 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
21c10 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64     "SELECT rowid
21c20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
21c30 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
21c40 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
21c50 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74   GLOB 'sqlite_st
21c60 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20  at[134]'",.     
21c70 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
21c80 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
21c90 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65  doStats = sqlite
21ca0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
21cb0 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20  QLITE_ROW;.     
21cc0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
21cd0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
21ce0 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d      if( doStats=
21cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
21d00 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
21d10 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65  /* No STAT table
21d20 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e  s available */\n
21d30 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
21d40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21d50 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
21d60 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
21d70 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
21d80 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
21d90 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20  SELECT 'ANALYZE 
21da0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c  sqlite_master'",
21db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21dc0 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
21dd0 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
21de0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
21df0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
21e00 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
21e10 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
21e20 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
21e30 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  1";.      shell_
21e40 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
21e50 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
21e60 65 5f 73 74 61 74 31 22 2c 0a 20 20 20 20 20 20  e_stat1",.      
21e70 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
21e80 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61  _callback, &data
21e90 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ,&zErrMsg);.    
21ea0 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
21eb0 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
21ec0 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  3";.      shell_
21ed0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
21ee0 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
21ef0 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20 20  e_stat3",.      
21f00 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
21f10 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61  _callback, &data
21f20 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ,&zErrMsg);.    
21f30 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
21f40 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
21f50 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  4";.      shell_
21f60 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
21f70 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
21f80 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20  e_stat4",.      
21f90 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
21fa0 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61  _callback, &data
21fb0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
21fc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
21fd0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
21fe0 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
21ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
22000 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
22010 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
22020 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e  0], "headers", n
22030 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
22040 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
22050 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
22060 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
22070 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
22080 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
22090 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
220a0 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e  age: .headers on
220b0 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
220c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
220d0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
220e0 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
220f0 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c  zArg[0], "help",
22100 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74   n)==0 ){.    ut
22110 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22120 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b 0a  , "%s", zHelp);.
22130 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
22140 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
22150 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
22160 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
22170 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22190 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
221a0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
221b0 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
221e0 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74  to extra content
221f0 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c   from */.    sql
22200 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
22210 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74   = NULL; /* A st
22220 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
22230 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
22240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22250 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
22260 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
22270 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
222a0 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
222b0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
222c0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
222d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
222e0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
222f0 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20  nt needCommit;  
22300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22310 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20  ue to COMMIT or 
22320 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20  ROLLBACK at end 
22330 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22360 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53  bytes in p->colS
22370 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
22380 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
223a0 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
223b0 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43  t */.    ImportC
223c0 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20 20  tx sCtx;        
223d0 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63       /* Reader c
223e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68  ontext */.    ch
223f0 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43  ar *(SQLITE_CDEC
22400 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74  L *xRead)(Import
22410 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74  Ctx*); /* Func t
22420 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65  o read one value
22430 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c   */.    int (SQL
22440 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73  ITE_CDECL *xClos
22450 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20  er)(FILE*);     
22460 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73   /* Func to clos
22470 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  e file */..    i
22480 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
22490 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
224a0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
224b0 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
224c0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  E\n");.      got
224d0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
224e0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
224f0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
22500 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  .    zTable = az
22510 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e  Arg[2];.    seen
22520 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
22530 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c     memset(&sCtx,
22540 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29   0, sizeof(sCtx)
22550 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
22560 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
22570 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
22580 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
22590 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
225a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
225b0 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
225c0 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
225d0 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e   non-null column
225e0 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
225f0 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
22600 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
22610 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
22620 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
22630 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
22640 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
22650 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c  ti-character col
22660 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e  umn separators n
22670 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
226a0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
226b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53   1;.    }.    nS
226c0 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
226d0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
226e0 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
226f0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
22700 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
22710 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77  or: non-null row
22720 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
22730 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
22740 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
22750 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
22760 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e  ( nSep==2 && p->
22770 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26  mode==MODE_Csv &
22780 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53  & strcmp(p->rowS
22790 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
227a0 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Lf)==0 ){.      
227b0 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e  /* When importin
227c0 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66  g CSV (only), if
227d0 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
227e0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  or is set to the
227f0 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  .      ** defaul
22800 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  t output row sep
22810 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69  arator, change i
22820 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
22830 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20   input.      ** 
22840 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
22850 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69  This avoids havi
22860 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64  ng to maintain d
22870 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20  ifferent input. 
22880 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70       ** and outp
22890 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
228a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
228b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
228c0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
228d0 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
228e0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
228f0 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74  .      nSep = st
22900 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
22910 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  arator);.    }. 
22920 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
22930 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
22940 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
22950 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
22960 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  r row separators
22970 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
229a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
229b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
229c0 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69  sCtx.zFile = zFi
229d0 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69  le;.    sCtx.nLi
229e0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
229f0 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27  sCtx.zFile[0]=='
22a00 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  |' ){.#ifdef SQL
22a10 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
22a20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
22a30 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
22a40 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75  pipes are not su
22a50 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20  pported in this 
22a60 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  OS\n");.      re
22a70 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
22a80 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f      sCtx.in = po
22a90 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31  pen(sCtx.zFile+1
22aa0 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43  , "r");.      sC
22ab0 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70  tx.zFile = "<pip
22ac0 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  e>";.      xClos
22ad0 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e  er = pclose;.#en
22ae0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
22af0 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66       sCtx.in = f
22b00 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c  open(sCtx.zFile,
22b10 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43   "rb");.      xC
22b20 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a  loser = fclose;.
22b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
22b40 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69  >mode==MODE_Asci
22b50 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64  i ){.      xRead
22b60 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e   = ascii_read_on
22b70 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c  e_field;.    }el
22b80 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20  se{.      xRead 
22b90 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  = csv_read_one_f
22ba0 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ield;.    }.    
22bb0 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29  if( sCtx.in==0 )
22bc0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
22bd0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
22be0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
22bf0 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
22c00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22c10 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
22c20 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63  x.cColSep = p->c
22c30 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  olSeparator[0];.
22c40 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70      sCtx.cRowSep
22c50 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
22c60 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20  or[0];.    zSql 
22c70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22c80 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
22c90 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
22ca0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
22cb0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
22cc0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
22cd0 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
22ce0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  \n");.      xClo
22cf0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
22d00 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22d10 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
22d20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
22d30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22d40 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
22d50 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
22d60 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70  tmt, 0);.    imp
22d70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
22d80 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a  &sCtx, 0);    /*
22d90 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e   To ensure sCtx.
22da0 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a  z is allocated *
22db0 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20  /.    if( rc && 
22dc0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
22dd0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
22de0 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  *", sqlite3_errm
22df0 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b  sg(p->db))==0 ){
22e00 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72  .      char *zCr
22e10 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
22e20 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54  printf("CREATE T
22e30 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65  ABLE %s", zTable
22e40 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53  );.      char cS
22e50 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20  ep = '(';.      
22e60 77 68 69 6c 65 28 20 78 52 65 61 64 28 26 73 43  while( xRead(&sC
22e70 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tx) ){.        z
22e80 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
22e90 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e  _mprintf("%z%c\n
22ea0 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20    \"%w\" TEXT", 
22eb0 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73  zCreate, cSep, s
22ec0 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
22ed0 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20  cSep = ',';.    
22ee0 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
22ef0 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
22f00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
22f10 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70  }.      if( cSep
22f20 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
22f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22f40 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  reate);.        
22f50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
22f60 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  x.z);.        xC
22f70 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
22f80 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
22f90 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
22fa0 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73  empty file\n", s
22fb0 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  Ctx.zFile);.    
22fc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65      }.      zCre
22fe0 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
22ff0 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a  rintf("%z\n)", z
23000 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72  Create);.      r
23010 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
23020 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c  (p->db, zCreate,
23030 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
23040 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
23050 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66  reate);.      if
23060 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
23070 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
23080 72 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  rr, "CREATE TABL
23090 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64  E %s(...) failed
230a0 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c  : %s\n", zTable,
230b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
230c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
230d0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
230e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
230f0 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78  tx.z);.        x
23100 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
23110 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23120 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
23130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
23140 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
23150 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
23160 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
23170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
23180 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
23190 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  {.      if (pStm
231a0 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
231b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
231c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
231d0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
231e0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
231f0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
23200 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
23210 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
23220 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   1;.    }.    nC
23230 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
23240 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
23250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
23260 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
23270 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
23280 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
23290 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
232a0 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f  columns, no erro
232b0 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20  r */.    zSql = 
232c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
232d0 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b  ( nByte*2 + 20 +
232e0 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69   nCol*2 );.    i
232f0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
23300 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
23310 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
23320 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
23330 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
23340 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
23350 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23360 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23370 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a  intf(nByte+20, z
23380 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54  Sql, "INSERT INT
23390 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28  O \"%w\" VALUES(
233a0 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
233b0 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
233c0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
233d0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
233e0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
233f0 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
23400 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
23410 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
23420 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
23430 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
23440 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
23450 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
23460 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
23470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23480 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
23490 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
234a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
234b0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
234c0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
234d0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
234e0 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
234f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
23500 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  t);.      xClose
23510 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
23520 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
23530 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74  }.    needCommit
23540 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61   = sqlite3_get_a
23550 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29  utocommit(p->db)
23560 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f  ;.    if( needCo
23570 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65  mmit ) sqlite3_e
23580 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49  xec(p->db, "BEGI
23590 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
235a0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20    do{.      int 
235b0 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78  startLine = sCtx
235c0 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f  .nLine;.      fo
235d0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
235e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
235f0 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43  r *z = xRead(&sC
23600 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  tx);.        /*.
23610 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
23620 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
23630 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69  ile before findi
23640 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a  ng any columns?.
23650 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f          ** If so
23660 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f  , stop instead o
23670 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74  f NULL filling t
23680 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
23690 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
236a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
236b0 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61  0 && i==0 ) brea
236c0 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  k;.        /*.  
236d0 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20        ** Did we 
236e0 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
236f0 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  e OR end-of-line
23700 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20   before finding 
23710 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  any.        ** c
23720 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20  olumns in ASCII 
23730 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74  mode?  If so, st
23740 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  op instead of NU
23750 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  LL filling.     
23760 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e     ** the remain
23770 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
23780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23790 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
237a0 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30  E_Ascii && (z==0
237b0 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20   || z[0]==0) && 
237c0 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
237d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
237e0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
237f0 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  +1, z, -1, SQLIT
23800 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
23810 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
23820 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d  -1 && sCtx.cTerm
23830 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
23840 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
23850 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23860 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
23870 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
23880 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20         "filling 
238b0 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55  the rest with NU
238c0 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
238f0 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b  rtLine, nCol, i+
23900 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
23910 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
23920 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29  while( i<=nCol )
23930 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  { sqlite3_bind_n
23940 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69  ull(pStmt, i); i
23950 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++; }.        }.
23960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23970 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43  ( sCtx.cTerm==sC
23980 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20  tx.cColSep ){.  
23990 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
239a0 20 20 20 20 78 52 65 61 64 28 26 73 43 74 78 29      xRead(&sCtx)
239b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
239c0 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28  .        }while(
239d0 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74   sCtx.cTerm==sCt
239e0 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20  x.cColSep );.   
239f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23a00 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
23a10 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
23a20 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
23a30 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
23a50 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22  xtras ignored\n"
23a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23a70 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
23a80 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
23a90 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20   nCol, i);.     
23aa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
23ab0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
23ac0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
23ad0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
23ae0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
23af0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
23b00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23b10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
23b20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
23b30 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52  r, "%s:%d: INSER
23b40 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  T failed: %s\n",
23b50 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20   sCtx.zFile,.   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71     startLine, sq
23b80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
23b90 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
23ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
23bb0 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  le( sCtx.cTerm!=
23bc0 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f  EOF );..    xClo
23bd0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
23be0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
23bf0 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69  Ctx.z);.    sqli
23c00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
23c10 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  mt);.    if( nee
23c20 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65  dCommit ) sqlite
23c30 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43  3_exec(p->db, "C
23c40 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
23c50 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
23c60 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ef SQLITE_UNTEST
23c70 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69  ABLE.  if( c=='i
23c80 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
23c90 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72  rg[0], "imposter
23ca0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
23cb0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
23cc0 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d  char *zCollist =
23cd0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
23ce0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
23cf0 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20   int tnum = 0;. 
23d00 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
23d10 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20  ( nArg!=3 ){.   
23d20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
23d30 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
23d40 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49  imposter INDEX I
23d50 4d 50 4f 53 54 45 52 5c 6e 22 29 3b 0a 20 20 20  MPOSTER\n");.   
23d60 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
23d70 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
23d80 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
23d90 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
23da0 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
23db0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
23dc0 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
23dd0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
23de0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
23e00 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41  HERE name='%q' A
23e10 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
23e20 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
23e30 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23e40 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
23e50 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
23e60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23e70 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
23e80 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
23e90 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
23ea0 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d   ){.      tnum =
23eb0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23ec0 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
23ed0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23ee0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
23ef0 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d  ;.    if( tnum==
23f00 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
23f10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23f20 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c  no such index: \
23f30 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
23f40 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
23f50 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
23f60 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
23f70 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
23f80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23f90 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  f("PRAGMA index_
23fa0 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41  xinfo='%q'", azA
23fb0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d  rg[1]);.    rc =
23fc0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23fd0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
23fe0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
23ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24000 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d  e(zSql);.    i =
24010 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   0;.    while( s
24020 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
24030 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
24040 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61  {.      char zLa
24050 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63  bel[20];.      c
24060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
24070 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
24080 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
24090 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20  xt(pStmt,2);.   
240a0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
240b0 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zCol==0 ){.   
240c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
240d0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
240e0 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  t,1)==-1 ){.    
240f0 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52        zCol = "_R
24100 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20  OWID_";.        
24110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24120 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24130 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  f(sizeof(zLabel)
24140 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22  ,zLabel,"expr%d"
24150 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ,i);.          z
24160 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20  Col = zLabel;.  
24170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24180 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69        if( zColli
24190 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
241a0 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69   zCollist = sqli
241b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
241c0 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  w\"", zCol);.   
241d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
241e0 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
241f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
24200 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69  ,\"%w\"", zColli
24210 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  st, zCol);.     
24220 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
24230 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
24240 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  tmt);.    zSql =
24250 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
24260 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  (.          "CRE
24270 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22  ATE TABLE \"%w\"
24280 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  (%s,PRIMARY KEY(
24290 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49  %s))WITHOUT ROWI
242a0 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a  D",.          az
242b0 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74  Arg[2], zCollist
242c0 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20  , zCollist);.   
242d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
242e0 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20  ollist);.    rc 
242f0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
24300 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
24310 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
24320 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20   p->db, "main", 
24330 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66  1, tnum);.    if
24340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24350 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
24370 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
24380 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24390 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
243a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
243b0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
243c0 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ain", 0, 0);.   
243d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
243e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
243f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
24400 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20  in [%s]: %s\n", 
24410 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72  zSql, sqlite3_er
24420 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
24430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24440 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24450 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  tdout, "%s;\n", 
24460 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  zSql);.        r
24470 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  aw_printf(stdout
24480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57 41  ,.           "WA
24490 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74  RNING: writing t
244a0 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  o an imposter ta
244b0 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74  ble will corrupt
244c0 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20   the index!\n". 
244d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
244e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
244f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
24500 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45  derr, "SQLITE_TE
24510 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20  STCTRL_IMPOSTER 
24520 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
24530 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  c);.      rc = 1
24540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24550 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
24560 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
24570 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
24580 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
24590 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ROL) */..#ifdef 
245a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
245b0 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27  TRACE.  if( c=='
245c0 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
245d0 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65  Arg[0], "iotrace
245e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
245f0 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72  SQLITE_API exter
24600 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43  n void (SQLITE_C
24610 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54  DECL *sqlite3IoT
24620 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
24630 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28  *, ...);.    if(
24640 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72   iotrace && iotr
24650 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63  ace!=stdout ) fc
24660 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20  lose(iotrace);. 
24670 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a     iotrace = 0;.
24680 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
24690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
246a0 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
246b0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
246c0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d  (azArg[1], "-")=
246d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
246e0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74  te3IoTrace = iot
246f0 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20  racePrintf;.    
24700 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f    iotrace = stdo
24710 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
24720 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66       iotrace = f
24730 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
24740 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  w");.      if( i
24750 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20  otrace==0 ){.   
24760 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24770 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
24780 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
24790 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
247a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
247b0 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20  e3IoTrace = 0;. 
247c0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
247d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
247e0 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
247f0 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e  ce = iotracePrin
24800 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tf;.      }.    
24810 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
24820 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
24830 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d  & n>=5 && strncm
24840 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d  p(azArg[0], "lim
24850 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  its", n)==0 ){. 
24860 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
24870 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
24880 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d  const char *zLim
24890 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  itName;   /* Nam
248a0 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a  e of a limit */.
248b0 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
248c0 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
248d0 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65   /* Integer code
248e0 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20   for that limit 
248f0 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b  */.    } aLimit[
24900 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c  ] = {.      { "l
24910 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
24920 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
24930 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  MIT_LENGTH      
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
24950 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65  .      { "sql_le
24960 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
24970 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53    SQLITE_LIMIT_S
24980 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  QL_LENGTH       
24990 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
249a0 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20    { "column",   
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
249c0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
249f0 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20  expr_depth",    
24a00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
24a10 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20  IMIT_EXPR_DEPTH 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
24a30 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f  ,.      { "compo
24a40 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20  und_select",    
24a50 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24a60 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
24a70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24a80 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20     { "vdbe_op", 
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
24aa0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
24ab0 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OP              
24ac0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
24ad0 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20  "function_arg", 
24ae0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24af0 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
24b00 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RG              
24b10 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61  },.      { "atta
24b20 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ched",          
24b30 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
24b40 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20  _ATTACHED       
24b50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
24b60 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74      { "like_patt
24b70 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53  ern_length",   S
24b80 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
24b90 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
24ba0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
24bb0 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65   "variable_numbe
24bc0 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  r",       SQLITE
24bd0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
24be0 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20 20  NUMBER          
24bf0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69   },.      { "tri
24c00 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20  gger_depth",    
24c10 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
24c20 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
24c30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
24c40 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74       { "worker_t
24c50 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20 20  hreads",        
24c60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
24c70 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20  KER_THREADS     
24c80 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b         },.    };
24c90 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a  .    int i, n2;.
24ca0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
24cb0 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  );.    if( nArg=
24cc0 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =1 ){.      for(
24cd0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
24ce0 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a  (aLimit); i++){.
24cf0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
24d00 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d  %20s %d\n", aLim
24d10 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  it[i].zLimitName
24d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24d30 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
24d40 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e  ->db, aLimit[i].
24d50 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b  limitCode, -1));
24d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
24d70 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b  se if( nArg>3 ){
24d80 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
24d90 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
24da0 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e  : .limit NAME ?N
24db0 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20  EW-VALUE?\n");. 
24dc0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
24dd0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
24de0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
24df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24e00 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
24e10 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30     n2 = strlen30
24e20 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
24e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
24e40 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20  aySize(aLimit); 
24e50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
24e60 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
24e70 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69  mp(aLimit[i].zLi
24e80 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31  mitName, azArg[1
24e90 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  ], n2)==0 ){.   
24ea0 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69         if( iLimi
24eb0 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t<0 ){.         
24ec0 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20     iLimit = i;. 
24ed0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
24ef0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24f00 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74  "ambiguous limit
24f10 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  : \"%s\"\n", azA
24f20 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
24f30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
24f40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
24f50 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
24f60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24f80 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30      if( iLimit<0
24f90 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
24fa0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24fb0 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20  "unknown limit: 
24fc0 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"%s\"\n".      
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69    "enter \".limi
24ff0 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67  ts\" with no arg
25000 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73  uments for a lis
25010 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  t.\n",.         
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
25040 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
25050 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
25060 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
25070 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72   }.      if( nAr
25080 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
25090 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
250a0 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d  >db, aLimit[iLim
250b0 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20  it].limitCode,. 
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65       (int)intege
250e0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  rValue(azArg[2])
250f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25100 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64   printf("%20s %d
25110 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d  \n", aLimit[iLim
25120 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a  it].zLimitName,.
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25140 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
25150 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
25160 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
25170 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
25180 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
25190 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28   n>2 && strncmp(
251a0 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22  azArg[0], "lint"
251b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
251c0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
251d0 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64    lintDotCommand
251e0 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  (p, azArg, nArg)
251f0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
25200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
25210 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
25220 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74  if( c=='l' && st
25230 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
25240 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b  "load", n)==0 ){
25250 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
25260 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a  *zFile, *zProc;.
25270 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
25280 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  g = 0;.    if( n
25290 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  Arg<2 ){.      r
252a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
252b0 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20  , "Usage: .load 
252c0 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54  FILE ?ENTRYPOINT
252d0 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
252e0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
252f0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
25300 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  t;.    }.    zFi
25310 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
25320 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e     zProc = nArg>
25330 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
25340 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
25350 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
25360 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
25370 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69  nsion(p->db, zFi
25380 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
25390 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
253a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
253b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
253c0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
253d0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
253e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
253f0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
25400 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
25410 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
25420 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
25430 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25440 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d  [0], "log", n)==
25450 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
25460 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
25470 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25480 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49   "Usage: .log FI
25490 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
254a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
254b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
254c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61   char *zFile = a
254d0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f  zArg[1];.      o
254e0 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
254f0 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20  (p->pLog);.     
25500 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75   p->pLog = outpu
25510 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c  t_file_open(zFil
25520 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
25530 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
25540 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25550 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
25560 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
25570 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41  char *zMode = nA
25580 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
25590 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e   : "";.    int n
255a0 32 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  2 = (int)strlen(
255b0 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20  zMode);.    int 
255c0 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20  c2 = zMode[0];. 
255d0 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26     if( c2=='l' &
255e0 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d  & n2>2 && strncm
255f0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65  p(azArg[1],"line
25600 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
25610 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
25620 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71  E_Line;.      sq
25630 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
25640 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
25650 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
25660 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
25670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
25680 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
25690 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f  cmp(azArg[1],"co
256a0 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lumns",n2)==0 ){
256b0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
256c0 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   MODE_Column;.  
256d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
256e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
256f0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
25700 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
25710 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
25720 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26  se if( c2=='l' &
25730 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d  & n2>2 && strncm
25740 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74  p(azArg[1],"list
25750 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
25760 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
25770 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
25780 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
25790 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
257a0 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
257b0 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75  arator, SEP_Colu
257c0 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mn);.      sqlit
257d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
257e0 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
257f0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
25800 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
25810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
25820 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
25830 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22  (azArg[1],"html"
25840 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
25850 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
25860 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Html;.    }else 
25870 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73  if( c2=='t' && s
25880 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
25890 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "tcl",n2)==0 ){.
258a0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
258b0 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20  MODE_Tcl;.      
258c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
258d0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
258e0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
258f0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53  Separator, SEP_S
25900 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  pace);.      sql
25910 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
25920 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
25930 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
25940 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
25950 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25960 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
25970 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76  mp(azArg[1],"csv
25980 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
25990 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
259a0 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Csv;.      sqli
259b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
259c0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
259d0 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
259e0 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
259f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25a00 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
25a10 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
25a20 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
25a30 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20  or, SEP_CrLf);. 
25a40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
25a50 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
25a60 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c  azArg[1],"tabs",
25a70 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
25a80 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
25a90 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
25aa0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
25ab0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
25ac0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
25ad0 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a  ator, SEP_Tab);.
25ae0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
25af0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
25b00 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72  (azArg[1],"inser
25b10 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
25b20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
25b30 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
25b40 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
25b50 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  , nArg>=3 ? azAr
25b60 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b  g[2] : "table");
25b70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
25b80 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d  2=='q' && strncm
25b90 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74  p(azArg[1],"quot
25ba0 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  e",n2)==0 ){.   
25bb0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
25bc0 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c  E_Quote;.    }el
25bd0 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26  se if( c2=='a' &
25be0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
25bf0 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d  1],"ascii",n2)==
25c00 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
25c10 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b  de = MODE_Ascii;
25c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25c30 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
25c40 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
25c50 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
25c60 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20  , SEP_Unit);.   
25c70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
25c80 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
25c90 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
25ca0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
25cb0 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d  P_Record);.    }
25cc0 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31  else if( nArg==1
25cd0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
25ce0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75  intf(p->out, "cu
25cf0 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64  rrent output mod
25d00 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65  e: %s\n", modeDe
25d10 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20  scr[p->mode]);. 
25d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25d30 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
25d40 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20  r, "Error: mode 
25d50 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
25d60 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 61 73  : ".         "as
25d70 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68  cii column csv h
25d80 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20  tml insert line 
25d90 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62 73 20  list quote tabs 
25da0 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  tcl\n");.      r
25db0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
25dc0 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
25dd0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ode;.  }else..  
25de0 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74  if( c=='n' && st
25df0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
25e00 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d  "nullvalue", n)=
25e10 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
25e20 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
25e30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
25e40 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61  sizeof(p->nullVa
25e50 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c  lue), p->nullVal
25e60 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
25e70 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73             "%.*s
25e80 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a  ", (int)ArraySiz
25e90 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d  e(p->nullValue)-
25ea0 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  1, azArg[1]);.  
25eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25ec0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
25ed0 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76  , "Usage: .nullv
25ee0 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b  alue STRING\n");
25ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
25f00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
25f10 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74  if( c=='o' && st
25f20 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
25f30 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26  "open", n)==0 &&
25f40 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61   n>=2 ){.    cha
25f50 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b  r *zNewFilename;
25f60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
25f80 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
25f90 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20  t iName = 1;    
25fa0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
25fb0 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69  zArg[] of the fi
25fc0 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e  lename */.    in
25fd0 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20  t newFlag = 0;  
25fe0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
25ff0 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65  lete file before
26000 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20   opening */.    
26010 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69  /* Close the exi
26020 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a  sting database *
26030 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c  /.    session_cl
26040 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20  ose_all(p);.    
26050 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
26060 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  >db);.    p->db 
26070 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46  = 0;.    p->zDbF
26080 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
26090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
260a0 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a  >zFreeOnClose);.
260b0 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c      p->zFreeOnCl
260c0 6f 73 65 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  ose = 0;.    /* 
260d0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e  Check for comman
260e0 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d-line arguments
260f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d   */.    for(iNam
26100 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20  e=1; iName<nArg 
26110 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b  && azArg[iName][
26120 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b  0]=='-'; iName++
26130 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
26140 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
26150 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  Name];.      if(
26160 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22   optionMatch(z,"
26170 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20  new") ){.       
26180 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a 20 20   newFlag = 1;.  
26190 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
261a0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
261b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
261c0 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
261d0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
261e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
261f0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
26200 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
26210 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
26220 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c  .    /* If a fil
26230 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  ename is specifi
26240 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ed, try to open 
26250 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  it first */.    
26260 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e  zNewFilename = n
26270 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69  Arg>iName ? sqli
26280 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
26290 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20  , azArg[iName]) 
262a0 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  : 0;.    if( zNe
262b0 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  wFilename ){.   
262c0 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
262d0 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
262e0 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a  (zNewFilename);.
262f0 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65        p->zDbFile
26300 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e  name = zNewFilen
26310 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  ame;.      open_
26320 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  db(p, 1);.      
26330 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
26340 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
26350 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
26360 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
26370 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c  '%s'\n", zNewFil
26380 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
26390 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
263a0 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
263b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
263c0 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
263d0 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b   = zNewFilename;
263e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
263f0 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
26400 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61  ){.      /* As a
26410 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20   fall-back open 
26420 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  a TEMP database 
26430 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46  */.      p->zDbF
26440 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
26450 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
26460 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
26470 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 0a 20 20  .  if( c=='o'.  
26480 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41   && (strncmp(azA
26490 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c  rg[0], "output",
264a0 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d   n)==0 || strncm
264b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63  p(azArg[0], "onc
264c0 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a  e", n)==0).  ){.
264d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
264e0 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zFile = nArg>=2 
264f0 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74  ? azArg[1] : "st
26500 64 6f 75 74 22 3b 0a 20 20 20 20 69 66 28 20 6e  dout";.    if( n
26510 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20 75  Arg>2 ){.      u
26520 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26530 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20 46  r, "Usage: .%s F
26540 49 4c 45 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  ILE\n", azArg[0]
26550 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
26560 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
26570 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
26580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31     }.    if( n>1
26590 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
265a0 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
265b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
265c0 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
265d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
265e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f  derr, "Usage: .o
265f0 6e 63 65 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  nce FILE\n");.  
26600 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
26610 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
26620 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
26630 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6f      }.      p->o
26640 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20 20  utCount = 2;.   
26650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
26660 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  >outCount = 0;. 
26670 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f     }.    output_
26680 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
26690 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  ( zFile[0]=='|' 
266a0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
266b0 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
266c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
266d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70  err, "Error: pip
266e0 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
266f0 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c  rted in this OS\
26700 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
26710 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  1;.      p->out 
26720 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a  = stdout;.#else.
26730 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70        p->out = p
26740 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20  open(zFile + 1, 
26750 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
26760 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
26770 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
26780 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
26790 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65  cannot open pipe
267a0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
267b0 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20  e + 1);.        
267c0 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
267d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
267e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
267f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26800 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
26810 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75  >outfile), p->ou
26820 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69  tfile, "%s", zFi
26830 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  le);.      }.#en
26840 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
26850 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75       p->out = ou
26860 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a  tput_file_open(z
26870 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
26880 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
26890 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
268a0 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30  (zFile,"off")!=0
268b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
268c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
268d0 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
268e0 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c  write to \"%s\"\
268f0 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
26900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
26910 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
26920 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
26930 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
26940 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26950 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
26960 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75  >outfile), p->ou
26970 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69  tfile, "%s", zFi
26980 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
26990 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
269a0 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33  ( c=='p' && n>=3
269b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
269c0 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e  g[0], "print", n
269d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
269e0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
269f0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
26a00 20 20 20 20 69 66 28 20 69 3e 31 20 29 20 72 61      if( i>1 ) ra
26a10 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
26a20 20 22 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66   " ");.      utf
26a30 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26a40 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29   "%s", azArg[i])
26a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
26a60 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26a70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  \n");.  }else.. 
26a80 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73   if( c=='p' && s
26a90 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
26aa0 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30   "prompt", n)==0
26ab0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
26ac0 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73   >= 2) {.      s
26ad0 74 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70  trncpy(mainPromp
26ae0 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29  t,azArg[1],(int)
26af0 41 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72  ArraySize(mainPr
26b00 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a  ompt)-1);.    }.
26b10 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20      if( nArg >= 
26b20 33 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63  3) {.      strnc
26b30 70 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  py(continuePromp
26b40 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29  t,azArg[2],(int)
26b50 41 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e  ArraySize(contin
26b60 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20  uePrompt)-1);.  
26b70 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
26b80 66 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72  f( c=='q' && str
26b90 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26ba0 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  quit", n)==0 ){.
26bb0 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
26bc0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72  lse..  if( c=='r
26bd0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
26be0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26bf0 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  read", n)==0 ){.
26c00 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20      FILE *alt;. 
26c10 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
26c20 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
26c30 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
26c40 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22  e: .read FILE\n"
26c50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
26c60 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
26c70 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
26c80 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66     }.    alt = f
26c90 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
26ca0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c  rb");.    if( al
26cb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  t==0 ){.      ut
26cc0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26cd0 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
26ce0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
26cf0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
26d00 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
26d10 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
26d20 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20  rocess_input(p, 
26d30 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  alt);.      fclo
26d40 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20  se(alt);.    }. 
26d50 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
26d60 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='r' && n>=3 && 
26d70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
26d80 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d  , "restore", n)=
26d90 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
26da0 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a  char *zSrcFile;.
26db0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26dc0 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  zDb;.    sqlite3
26dd0 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69   *pSrc;.    sqli
26de0 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
26df0 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69  kup;.    int nTi
26e00 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20  meout = 0;..    
26e10 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
26e20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
26e30 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
26e40 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
26e50 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
26e60 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==3 ){.      zSr
26e70 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d  cFile = azArg[2]
26e80 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a  ;.      zDb = az
26e90 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73  Arg[1];.    }els
26ea0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
26eb0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
26ec0 67 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42  ge: .restore ?DB
26ed0 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  ? FILE\n");.    
26ee0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
26ef0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
26f00 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
26f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
26f20 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70  pen(zSrcFile, &p
26f30 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Src);.    if( rc
26f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26f50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
26f60 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
26f70 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
26f80 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65  s\"\n", zSrcFile
26f90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26fa0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
26fb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26fc0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
26fd0 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
26fe0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
26ff0 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  kup_init(p->db, 
27000 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  zDb, pSrc, "main
27010 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
27020 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
27030 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27040 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
27050 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
27060 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
27070 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
27080 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
27090 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
270a0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
270b0 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
270c0 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
270d0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
270e0 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54      || rc==SQLIT
270f0 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20  E_BUSY  ){.     
27100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27110 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
27120 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e  if( nTimeout++ >
27130 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  = 3 ) break;.   
27140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
27150 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  ep(100);.      }
27160 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27170 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
27180 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
27190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
271a0 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
271b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
271c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
271d0 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Y || rc==SQLITE_
271e0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
271f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
27200 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63  r, "Error: sourc
27210 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75  e database is bu
27220 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  sy\n");.      rc
27230 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
27240 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
27250 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
27260 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
27270 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
27280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
27290 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
272a0 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
272b0 20 7d 65 6c 73 65 0a 0a 0a 20 20 69 66 28 20 63   }else...  if( c
272c0 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
272d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e  (azArg[0], "scan
272e0 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  stats", n)==0 ){
272f0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
27300 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61   ){.      p->sca
27310 6e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65  nstatsOn = boole
27320 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
27330 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
27340 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
27350 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20 20 72  ANSTATUS.      r
27360 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27370 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73 63 61  , "Warning: .sca
27380 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61 69 6c  nstats not avail
27390 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
273a0 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ld.\n");.#endif.
273b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
273c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
273d0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 61  rr, "Usage: .sca
273e0 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22  nstats on|off\n"
273f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
27400 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
27410 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
27420 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
27430 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d  , "schema", n)==
27440 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65  0 ){.    ShellTe
27450 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20  xt sSelect;.    
27460 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
27470 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
27480 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  sg = 0;.    cons
27490 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d 20 30  t char *zDiv = 0
274a0 3b 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d  ;.    int iSchem
274b0 61 20 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e  a = 0;..    open
274c0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
274d0 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
274e0 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
274f0 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
27500 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
27510 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
27520 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
27530 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53      initText(&sS
27540 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
27550 6e 41 72 67 3e 3d 32 20 26 26 20 6f 70 74 69 6f  nArg>=2 && optio
27560 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c  nMatch(azArg[1],
27570 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20   "indent") ){.  
27580 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
27590 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
275a0 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
275b0 6e 41 72 67 2d 2d 3b 0a 20 20 20 20 20 20 69 66  nArg--;.      if
275c0 28 20 6e 41 72 67 3d 3d 32 20 29 20 61 7a 41 72  ( nArg==2 ) azAr
275d0 67 5b 31 5d 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  g[1] = azArg[2];
275e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
275f0 41 72 67 3d 3d 32 20 26 26 20 61 7a 41 72 67 5b  Arg==2 && azArg[
27600 31 5d 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  1][0]!='-' ){.  
27610 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
27620 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b   for(i=0; azArg[
27630 31 5d 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72  1][i]; i++) azAr
27640 67 5b 31 5d 5b 69 5d 20 3d 20 54 6f 4c 6f 77 65  g[1][i] = ToLowe
27650 72 28 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a  r(azArg[1][i]);.
27660 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
27670 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74  (azArg[1],"sqlit
27680 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
27690 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
276a0 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
276b0 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
276c0 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
276d0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71  "CREATE TABLE sq
276e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22  lite_master (\n"
276f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27700 20 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74         "  type t
27710 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
27730 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20   name text,\n". 
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65       "  tbl_name
27760 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65  "  rootpage inte
27790 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ger,\n".        
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
277b0 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20   sql text\n".   
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20     ")";.        
277e0 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b  new_argv[1] = 0;
277f0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
27800 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20  v[0] = "sql";.  
27810 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31        new_colv[1
27820 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  ] = 0;.        c
27830 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31  allback(&data, 1
27840 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f  , new_argv, new_
27850 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 72  colv);.        r
27860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27870 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
27880 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
27890 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
278a0 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
278b0 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
278c0 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
278d0 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
278e0 61 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54  argv[0] = "CREAT
278f0 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c  E TEMP TABLE sql
27900 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
27910 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
27920 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
27930 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
27960 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
27970 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
27980 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
279b0 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
279e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279f0 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20         ")";.    
27a00 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
27a10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
27a20 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
27a30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
27a40 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
27a50 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
27a60 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
27a70 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
27a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27a90 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
27aa0 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
27ab0 28 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  (";.      }.    
27ac0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
27ad0 31 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 76 20  1 ){.      zDiv 
27ae0 3d 20 22 28 22 3b 0a 20 20 20 20 7d 65 6c 73 65  = "(";.    }else
27af0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27b00 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
27b10 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  e: .schema ?--in
27b20 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54  dent? ?LIKE-PATT
27b30 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ERN?\n");.      
27b40 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
27b50 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
27b60 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
27b70 69 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20  if( zDiv ){.    
27b80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
27b90 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
27ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
27bb0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
27bc0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
27bd0 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
27be0 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
27c10 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
27c20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
27c30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
27c40 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
27c50 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
27c60 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
27c70 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
27c80 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
27c90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
27ca0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
27cb0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
27cc0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
27cd0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
27ce0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c  ELECT sql FROM",
27cf0 20 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65   0);.      iSche
27d00 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  ma = 0;.      wh
27d10 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
27d20 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
27d30 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
27d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
27d50 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
27d60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27d70 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
27d80 20 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75        char zScNu
27d90 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  m[30];.        s
27da0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27db0 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20  sizeof(zScNum), 
27dc0 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b  zScNum, "%d", ++
27dd0 69 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  iSchema);.      
27de0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
27df0 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b  elect, zDiv, 0);
27e00 0a 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20  .        zDiv = 
27e10 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20  " UNION ALL ";. 
27e20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
27e30 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
27e40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
27e50 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
27e60 63 74 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c  ct, "SELECT shel
27e70 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c  l_add_schema(sql
27e80 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
27e90 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
27ea0 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29  elect, zDb, '"')
27eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  ;.          appe
27ec0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
27ed0 20 22 29 20 41 53 20 73 71 6c 2c 20 74 79 70 65   ") AS sql, type
27ee0 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
27ef0 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20  , rowid,", 0);. 
27f00 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
27f10 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53  ext(&sSelect, zS
27f20 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  cNum, 0);.      
27f30 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
27f40 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
27f50 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
27f60 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
27f70 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27  &sSelect, zDb, '
27f80 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \'');.          
27f90 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
27fa0 65 63 74 2c 20 22 20 41 53 20 73 6e 61 6d 65 20  ect, " AS sname 
27fb0 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
27fc0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
27fd0 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20  (&sSelect, zDb, 
27fe0 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '"');.          
27ff0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
28000 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61  ect, ".sqlite_ma
28010 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  ster", 0);.     
28020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28030 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
28040 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  sSelect, "SELECT
28050 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f   sql, type, tbl_
28060 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69  name, name, rowi
28070 64 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, ", 0);.      
28080 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
28090 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
280a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61   0);.          a
280b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
280c0 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 27  ct, " AS snum, '
280d0 6d 61 69 6e 27 20 41 53 20 73 6e 61 6d 65 20 46  main' AS sname F
280e0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
280f0 72 22 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r",0);.        }
28100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
28110 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28120 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 61 70  pStmt);.      ap
28130 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
28140 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30  t, ") WHERE ", 0
28150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  );.      if( nAr
28160 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  g>1 ){.        c
28170 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c  har *zQarg = sql
28180 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51  ite3_mprintf("%Q
28190 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
281a0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72        if( strchr
281b0 28 61 7a 41 72 67 5b 31 5d 2c 20 27 2e 27 29 20  (azArg[1], '.') 
281c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  ){.          app
281d0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
281e0 2c 20 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28  , "lower(printf(
281f0 27 25 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62  '%s.%s',sname,tb
28200 6c 5f 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20  l_name))", 0);. 
28210 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28220 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
28230 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f  xt(&sSelect, "lo
28240 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20  wer(tbl_name)", 
28250 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
28260 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
28270 28 26 73 53 65 6c 65 63 74 2c 20 73 74 72 63 68  (&sSelect, strch
28280 72 28 61 7a 41 72 67 5b 31 5d 2c 20 27 2a 27 29  r(azArg[1], '*')
28290 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20 22 20   ? " GLOB " : " 
282a0 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20 20 20  LIKE ", 0);.    
282b0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
282c0 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20  sSelect, zQarg, 
282d0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
282e0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
282f0 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20 20   " AND ", 0);.  
28300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28310 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20 20 20  ee(zQarg);.     
28320 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
28330 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 74  ext(&sSelect, "t
28340 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
28350 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  sql IS NOT NULL"
28360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28370 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
28380 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f 77  DER BY snum, row
28390 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  id", 0);.      r
283a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
283b0 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
283c0 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
283d0 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
283e0 20 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73       freeText(&s
283f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Select);.    }. 
28400 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
28410 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
28420 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
28430 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
28440 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
28450 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
28460 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
28470 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
28480 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
28490 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
284a0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
284b0 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61 20  querying schema 
284c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
284d0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
284e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
284f0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
28500 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e  }else..#if defin
28510 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
28520 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
28530 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
28540 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d 3d  TRACE).  if( c==
28550 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26 20  's' && n==11 && 
28560 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
28570 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65 22 2c  , "selecttrace",
28580 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   n)==0 ){.    sq
28590 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
285a0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
285b0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
285c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
285d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
285e0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
285f0 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  N).  if( c=='s' 
28600 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28610 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c 6e 29  [0],"session",n)
28620 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b 0a 20  ==0 && n>=3 ){. 
28630 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a     OpenSession *
28640 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
28650 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20  Session[0];.    
28660 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 26  char **azCmd = &
28670 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e  azArg[1];.    in
28680 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20  t iSes = 0;.    
28690 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72 67 20  int nCmd = nArg 
286a0 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  - 1;.    int i;.
286b0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20      if( nArg<=1 
286c0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
286d0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
286e0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
286f0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20      if( nArg>=3 
28700 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
28710 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e 53 65  s=0; iSes<p->nSe
28720 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a  ssion; iSes++){.
28730 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
28740 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  mp(p->aSession[i
28750 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72  Ses].zName, azAr
28760 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  g[1])==0 ) break
28770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28780 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73  if( iSes<p->nSes
28790 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
287a0 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
287b0 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20  Session[iSes];. 
287c0 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a         azCmd++;.
287d0 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a          nCmd--;.
287e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
287f0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20       pSession = 
28800 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b  &p->aSession[0];
28810 0a 20 20 20 20 20 20 20 20 69 53 65 73 20 3d 20  .        iSes = 
28820 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
28830 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
28840 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a 20  n attach TABLE. 
28850 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65     ** Invoke the
28860 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
28870 61 74 74 61 63 68 28 29 20 69 6e 74 65 72 66 61  attach() interfa
28880 63 65 20 74 6f 20 61 74 74 61 63 68 20 61 20 70  ce to attach a p
28890 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a  articular.    **
288a0 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69   table so that i
288b0 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c 74 65  t is never filte
288c0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
288d0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
288e0 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d 3d 30  [0],"attach")==0
288f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43   ){.      if( nC
28900 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73  md!=2 ) goto ses
28910 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
28920 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
28930 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20  ssion->p==0 ){. 
28940 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 6e         session_n
28950 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20 20 20  ot_open:.       
28960 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28970 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 20 73  rr, "ERROR: No s
28980 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e  essions are open
28990 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  \n");.      }els
289a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
289b0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61  sqlite3session_a
289c0 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e 2d 3e  ttach(pSession->
289d0 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  p, azCmd[1]);.  
289e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
289f0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
28a00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
28a10 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65 73 73  ROR: sqlite3sess
28a20 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72 65 74  ion_attach() ret
28a30 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
28a40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28a50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
28a60 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
28a70 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
28a80 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 0a 20  changeset FILE. 
28a90 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e 20 70     ** .session p
28aa0 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20 20 20  atchset FILE.   
28ab0 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61 6e   ** Write a chan
28ac0 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65  geset or patchse
28ad0 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  t into a file.  
28ae0 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76 65 72  The file is over
28af0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
28b00 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
28b10 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67 65 73  zCmd[0],"changes
28b20 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  et")==0 || strcm
28b30 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61 74 63  p(azCmd[0],"patc
28b40 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  hset")==0 ){.   
28b50 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 30     FILE *out = 0
28b60 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
28b70 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=2 ) goto sessi
28b80 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
28b90 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73  .      if( pSess
28ba0 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f 74 6f  ion->p==0 ) goto
28bb0 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65   session_not_ope
28bc0 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20 66  n;.      out = f
28bd0 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20 22  open(azCmd[1], "
28be0 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wb");.      if( 
28bf0 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
28c00 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
28c10 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 63 61  derr, "ERROR: ca
28c20 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
28c30 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c   for writing\n",
28c40 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20   azCmd[1]);.    
28c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28c60 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20 20 20   int szChng;.   
28c70 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68 6e 67       void *pChng
28c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
28c90 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20 29  Cmd[0][0]=='c' )
28ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28cb0 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
28cc0 63 68 61 6e 67 65 73 65 74 28 70 53 65 73 73 69  changeset(pSessi
28cd0 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20  on->p, &szChng, 
28ce0 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20  &pChng);.       
28cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
28d10 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 70  ssion_patchset(p
28d20 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43  Session->p, &szC
28d30 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20  hng, &pChng);.  
28d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28d50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28d60 20 20 20 20 70 72 69 6e 74 66 28 22 45 72 72 6f      printf("Erro
28d70 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  r: error code %d
28d80 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
28d90 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
28da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
28db0 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20 20 20  ( pChng.        
28dc0 20 20 26 26 20 66 77 72 69 74 65 28 70 43 68 6e    && fwrite(pChn
28dd0 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f 75  g, szChng, 1, ou
28de0 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  t)!=1 ){.       
28df0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28e00 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 46 61  derr, "ERROR: Fa
28e10 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20 65 6e  iled to write en
28e20 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f 75 74  tire %d-byte out
28e30 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  put\n",.        
28e40 20 20 20 20 20 20 20 20 20 20 73 7a 43 68 6e 67            szChng
28e50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28e70 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20  e(pChng);.      
28e80 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
28e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28ea0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
28eb0 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 43  n close.    ** C
28ec0 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74 69 66  lose the identif
28ed0 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20 20 20  ied session.    
28ee0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
28ef0 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f  p(azCmd[0], "clo
28f00 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  se")==0 ){.     
28f10 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67   if( nCmd!=1 ) g
28f20 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
28f30 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
28f40 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
28f50 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  ){.        sessi
28f60 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73 69 6f  on_close(pSessio
28f70 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  n);.        p->a
28f80 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20 3d 20  Session[iSes] = 
28f90 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d  p->aSession[--p-
28fa0 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20  >nSession];.    
28fb0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
28fc0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 65     /* .session e
28fd0 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  nable ?BOOLEAN?.
28fe0 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20      ** Query or 
28ff0 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65 20 66  set the enable f
29000 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  lag.    */.    i
29010 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
29020 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d 3d 30  0], "enable")==0
29030 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
29040 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
29050 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  >2 ) goto sessio
29060 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
29070 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d        ii = nCmd=
29080 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61  =1 ? -1 : boolea
29090 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29  nValue(azCmd[1])
290a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
290b0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
290c0 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
290d0 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28 70 53  ession_enable(pS
290e0 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a  ession->p, ii);.
290f0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
29100 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73  ntf(p->out, "ses
29110 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65 20 66  sion %s enable f
29120 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20  lag = %d\n",.   
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
29150 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , ii);.      }. 
29160 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
29170 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72   .session filter
29180 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a   GLOB .....    *
29190 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f 66 20  * Set a list of 
291a0 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 6f 66  GLOB patterns of
291b0 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 6f 20   table names to 
291c0 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20 20 20  be excluded..   
291d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
291e0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 66 69  mp(azCmd[0], "fi
291f0 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lter")==0 ){.   
29200 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79 74 65     int ii, nByte
29210 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
29220 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  <2 ) goto sessio
29230 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
29240 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
29250 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
29260 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 53   for(ii=0; ii<pS
29270 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b  ession->nFilter;
29280 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
29290 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
292a0 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
292b0 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  r[ii]);.        
292c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
292d0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
292e0 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  >azFilter);.    
292f0 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
29300 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  of(pSession->azF
29310 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d  ilter[0])*(nCmd-
29320 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 73  1);.        pSes
29330 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 20 3d  sion->azFilter =
29340 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
29350 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20 20   nByte );.      
29360 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
29370 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b 0a 20  azFilter==0 ){. 
29380 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
29390 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
293a0 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d 6f 72  or: out or memor
293b0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  y\n");.         
293c0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
293d0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
293e0 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b 20 69  ii=1; ii<nCmd; i
293f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29400 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
29410 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c 69 74  er[ii-1] = sqlit
29420 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
29430 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20 20 20   azCmd[ii]);.   
29440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
29450 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
29460 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20 20 7d   = ii-1;.      }
29470 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
29480 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e 64 69  /* .session indi
29490 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20  rect ?BOOLEAN?. 
294a0 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20 73     ** Query or s
294b0 65 74 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  et the indirect 
294c0 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20  flag.    */.    
294d0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
294e0 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74 22 29  [0], "indirect")
294f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
29500 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
29510 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
29520 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
29530 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
29540 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
29550 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
29560 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
29570 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
29580 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
29590 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65  e3session_indire
295a0 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  ct(pSession->p, 
295b0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ii);.        utf
295c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
295d0 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 6e 64   "session %s ind
295e0 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25 64 5c  irect flag = %d\
295f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29600 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
29610 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
29620 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
29630 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
29640 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20   isempty.    ** 
29650 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  Determine if the
29660 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74   session is empt
29670 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  y.    */.    if(
29680 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
29690 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d 30 20  , "isempty")==0 
296a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
296b0 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
296c0 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
296d0 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
296e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
296f0 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
29700 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73   ii = sqlite3ses
29710 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70 53 65  sion_isempty(pSe
29720 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20  ssion->p);.     
29730 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
29740 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20  ->out, "session 
29750 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61 67 20  %s isempty flag 
29760 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
29780 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69  ssion->zName, ii
29790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
297a0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
297b0 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20 20 2a  ssion list.    *
297c0 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72 72 65  * List all curre
297d0 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
297e0 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ns.    */.    if
297f0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
29800 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ],"list")==0 ){.
29810 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29820 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
29830 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  +){.        utf8
29840 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
29850 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20 70 2d  "%d %s\n", i, p-
29860 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61  >aSession[i].zNa
29870 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
29880 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
29890 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44 42 20  session open DB 
298a0 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70 65 6e  NAME.    ** Open
298b0 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 63   a new session c
298c0 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20 74 68  alled NAME on th
298d0 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  e attached datab
298e0 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a 20 44  ase DB..    ** D
298f0 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d  B is normally "m
29900 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ain"..    */.   
29910 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
29920 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30 20  d[0],"open")==0 
29930 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
29940 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
29950 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f 20 73  nCmd!=3 ) goto s
29960 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
29970 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  ror;.      zName
29980 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20   = azCmd[2];.   
29990 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d     if( zName[0]=
299a0 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =0 ) goto sessio
299b0 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
299c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
299d0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
299e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
299f0 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69  strcmp(p->aSessi
29a00 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d  on[i].zName,zNam
29a10 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
29a20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29a30 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f 6e 20  tderr, "Session 
29a40 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65  \"%s\" already e
29a50 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  xists\n", zName)
29a60 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
29a70 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
29a80 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
29a90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29aa0 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41 72 72  p->nSession>=Arr
29ab0 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73 69  aySize(p->aSessi
29ac0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  on) ){.        r
29ad0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29ae0 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20 25 64  , "Maximum of %d
29af0 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20 41 72   sessions\n", Ar
29b00 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73  raySize(p->aSess
29b10 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 67  ion));.        g
29b20 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
29b30 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
29b40 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20       pSession = 
29b50 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70 2d 3e  &p->aSession[p->
29b60 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20  nSession];.     
29b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73   rc = sqlite3ses
29b80 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d 3e 64  sion_create(p->d
29b90 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26 70 53  b, azCmd[1], &pS
29ba0 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20  ession->p);.    
29bb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29bc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29bd0 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f  tderr, "Cannot o
29be0 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65 72 72  pen session: err
29bf0 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c 20 72  or code=%d\n", r
29c00 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c);.        rc =
29c10 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
29c20 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
29c30 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
29c40 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
29c50 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ter = 0;.      s
29c60 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 74 61  qlite3session_ta
29c70 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65 73 73  ble_filter(pSess
29c80 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f 6e 5f  ion->p, session_
29c90 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69 6f 6e  filter, pSession
29ca0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 73  );.      p->nSes
29cb0 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 70 53  sion++;.      pS
29cc0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20  ession->zName = 
29cd0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29ce0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
29cf0 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49    }else.    /* I
29d00 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  f no command nam
29d10 65 20 6d 61 74 63 68 65 73 2c 20 73 68 6f 77 20  e matches, show 
29d20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a  a syntax error *
29d30 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 73 79  /.    session_sy
29d40 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 20 20  ntax_error:.    
29d50 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 70 29 3b  session_help(p);
29d60 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
29d70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29d80 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75  EBUG.  /* Undocu
29d90 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  mented commands 
29da0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  for internal tes
29db0 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74  ting.  Subject t
29dc0 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69  o change.  ** wi
29dd0 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f  thout notice. */
29de0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
29df0 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d   n>=10 && strncm
29e00 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
29e10 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29  ftest-", 9)==0 )
29e20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
29e30 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62  p(azArg[0]+9, "b
29e40 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30  oolean", n-9)==0
29e50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
29e60 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
29e70 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
29e80 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f  .        v = boo
29e90 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
29ea0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  i]);.        utf
29eb0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
29ec0 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22   "%s: %d 0x%x\n"
29ed0 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76  , azArg[i], v, v
29ee0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29ef0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
29f00 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e  (azArg[0]+9, "in
29f10 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20  teger", n-9)==0 
29f20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
29f30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
29f40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
29f50 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
29f60 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
29f70 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20  200];.        v 
29f80 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
29f90 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
29fa0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
29fb0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
29fc0 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30  zBuf,"%s: %lld 0
29fd0 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b  x%llx\n", azArg[
29fe0 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20 20  i],v,v);.       
29ff0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2a000 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  out, "%s", zBuf)
2a010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a020 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2a030 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2a040 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=4 && strncmp(
2a050 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74 65  azArg[0],"selfte
2a060 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  st",n)==0 ){.   
2a070 20 69 6e 74 20 62 49 73 49 6e 69 74 20 3d 20 30   int bIsInit = 0
2a080 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2a090 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2a0a0 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
2a0b0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 56  le */.    int bV
2a0c0 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20  erbose = 0;     
2a0d0 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f 75     /* Verbose ou
2a0e0 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tput */.    int 
2a0f0 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b  bSelftestExists;
2a100 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a110 53 45 4c 46 54 45 53 54 20 61 6c 72 65 61 64 79  SELFTEST already
2a120 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
2a130 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt i, k;        
2a140 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2a150 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
2a160 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b 20 20  int nTest = 0;  
2a170 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a180 65 72 20 6f 66 20 74 65 73 74 73 20 72 75 6e 73  er of tests runs
2a190 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 72 72   */.    int nErr
2a1a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a1b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
2a1c0 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  rors seen */.   
2a1d0 20 53 68 65 6c 6c 54 65 78 74 20 73 74 72 3b 20   ShellText str; 
2a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 73            /* Ans
2a1f0 77 65 72 20 66 6f 72 20 61 20 71 75 65 72 79 20  wer for a query 
2a200 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
2a210 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20  tmt *pStmt = 0; 
2a220 2f 2a 20 51 75 65 72 79 20 61 67 61 69 6e 73 74  /* Query against
2a230 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
2a240 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e  ble */..    open
2a250 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 66 6f  _db(p,0);.    fo
2a260 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2a270 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
2a280 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
2a290 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
2a2a0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
2a2b0 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
2a2c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2a2d0 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20  "-init")==0 ){. 
2a2e0 20 20 20 20 20 20 20 62 49 73 49 6e 69 74 20 3d         bIsInit =
2a2f0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
2a300 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2a310 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a 20  (z,"-v")==0 ){. 
2a320 20 20 20 20 20 20 20 62 56 65 72 62 6f 73 65 2b         bVerbose+
2a330 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  +;.      }else. 
2a340 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
2a350 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2a360 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
2a370 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25  on \"%s\" on \"%
2a380 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
2a390 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
2a3a0 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  g[i], azArg[0]);
2a3b0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2a3c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f  ntf(stderr, "Sho
2a3d0 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d  uld be one of: -
2a3e0 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20 20  -init -v\n");.  
2a3f0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2a400 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2a410 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2a420 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2a430 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
2a440 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2a450 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c 22  a(p->db,"main","
2a460 73 65 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30 2c  selftest",0,0,0,
2a470 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 20 20 20  0,0,0).         
2a480 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29    != SQLITE_OK )
2a490 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  {.      bSelftes
2a4a0 74 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20  tExists = 0;.   
2a4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 53   }else{.      bS
2a4c0 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20  elftestExists = 
2a4d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
2a4e0 20 62 49 73 49 6e 69 74 20 29 7b 0a 20 20 20 20   bIsInit ){.    
2a4f0 20 20 63 72 65 61 74 65 53 65 6c 66 74 65 73 74    createSelftest
2a500 54 61 62 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  Table(p);.      
2a510 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20  bSelftestExists 
2a520 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
2a530 6e 69 74 54 65 78 74 28 26 73 74 72 29 3b 0a 20  nitText(&str);. 
2a540 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2a550 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a 20 20 20  tr, "x", 0);.   
2a560 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74 65 73 74   for(k=bSelftest
2a570 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d  Exists; k>=0; k-
2a580 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  -){.      if( k=
2a590 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =1 ){.        rc
2a5a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2a5b0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
2a5c0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2a5d0 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20   tno,op,cmd,ans 
2a5e0 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 20 4f 52  FROM selftest OR
2a5f0 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a 20 20 20  DER BY tno",.   
2a600 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
2a610 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
2a620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2a630 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2a640 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
2a650 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 30         "VALUES(0
2a660 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73 69 6e 67  ,'memo','Missing
2a670 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
2a680 2d 20 64 65 66 61 75 6c 74 20 63 68 65 63 6b 73  - default checks
2a690 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a 20 20 20   only',''),".   
2a6a0 20 20 20 20 20 20 20 22 20 20 20 20 20 20 28 31         "      (1
2a6b0 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69  ,'run','PRAGMA i
2a6c0 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c  ntegrity_check',
2a6d0 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20 20 20 20  'ok')",.        
2a6e0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
2a6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a700 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2a710 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2a720 65 72 72 2c 20 22 45 72 72 6f 72 20 71 75 65 72  err, "Error quer
2a730 79 69 6e 67 20 74 68 65 20 73 65 6c 66 74 65 73  ying the selftes
2a740 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  t table\n");.   
2a750 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
2a770 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2a780 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2a790 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2a7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2a7b0 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f 73 74 65  i=1; sqlite3_ste
2a7c0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
2a7d0 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  _ROW; i++){.    
2a7e0 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d 20 73 71      int tno = sq
2a7f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2a800 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2a810 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a820 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
2a830 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
2a840 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
2a850 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
2a860 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f  char *zSql = (co
2a870 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2a880 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2a890 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  tmt, 2);.       
2a8a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e   const char *zAn
2a8b0 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  s = (const char*
2a8c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2a8d0 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  text(pStmt, 3);.
2a8e0 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
2a8f0 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72          if( bVer
2a900 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  bose>0 ){.      
2a910 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65      char *zQuote
2a920 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2a930 74 66 28 22 25 71 22 2c 20 7a 53 71 6c 29 3b 0a  tf("%q", zSql);.
2a940 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
2a950 28 22 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c 20  ("%d: %s %s\n", 
2a960 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b  tno, zOp, zSql);
2a970 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2a980 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 29 3b  e3_free(zQuote);
2a990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a9a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
2a9b0 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a  p,"memo")==0 ){.
2a9c0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2a9d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2a9e0 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
2a9f0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2aa00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
2aa10 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29 7b 0a 20  p,"run")==0 ){. 
2aa20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2aa30 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
2aa40 20 20 20 20 20 20 73 74 72 2e 6e 20 3d 20 30 3b        str.n = 0;
2aa50 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 2e 7a  .          str.z
2aa60 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
2aa70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2aa80 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  exec(p->db, zSql
2aa90 2c 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  , captureOutputC
2aaa0 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72 2c 20 26  allback, &str, &
2aab0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2aac0 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20 20      nTest++;.   
2aad0 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
2aae0 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
2aaf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2ab00 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c 74 3a 20  ->out, "Result: 
2ab10 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29 3b 0a 20  %s\n", str.z);. 
2ab20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ab30 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 7a       if( rc || z
2ab40 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
2ab50 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
2ab60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2ab70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
2ab80 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2ab90 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d 63 6f 64  , "%d: error-cod
2aba0 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20 74 6e 6f  e-%d: %s\n", tno
2abb0 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  , rc, zErrMsg);.
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2abd0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
2abe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2abf0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
2ac00 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20 29 7b 0a  ns,str.z)!=0 ){.
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 72              nErr
2ac20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2ac30 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2ac40 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ac50 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 45 78 70  p->out, "%d: Exp
2ac60 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ected: [%s]\n", 
2ac70 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20 20 20 20  tno, zAns);.    
2ac80 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ac90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a  ntf(p->out, "%d:
2aca0 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c        Got: [%s]\
2acb0 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e 7a 29 3b  n", tno, str.z);
2acc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2acd0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2ace0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
2acf0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2ad00 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  r,.            "
2ad10 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  Unknown operatio
2ad20 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73 65 6c 66  n \"%s\" on self
2ad30 74 65 73 74 20 6c 69 6e 65 20 25 64 5c 6e 22 2c  test line %d\n",
2ad40 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20 20 20 20   zOp, tno);.    
2ad50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2ad60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2ad70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ad80 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
2ad90 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e  r rows of conten
2ada0 74 20 66 72 6f 6d 20 53 45 4c 46 54 45 53 54 20  t from SELFTEST 
2adb0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2adc0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2add0 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  ;.    } /* End l
2ade0 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f 0a 20 20  oop over k */.  
2adf0 20 20 66 72 65 65 54 65 78 74 28 26 73 74 72 29    freeText(&str)
2ae00 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
2ae10 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 65 72  f(p->out, "%d er
2ae20 72 6f 72 73 20 6f 75 74 20 6f 66 20 25 64 20 74  rors out of %d t
2ae30 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72 2c 20 6e  ests\n", nErr, n
2ae40 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Test);.  }else..
2ae50 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2ae60 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ae70 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20 6e  , "separator", n
2ae80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2ae90 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72 67 3e 33  nArg<2 || nArg>3
2aea0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2aeb0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2aec0 61 67 65 3a 20 2e 73 65 70 61 72 61 74 6f 72 20  age: .separator 
2aed0 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29 3b 0a 20  COL ?ROW?\n");. 
2aee0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2aef0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
2af00 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
2af10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2af20 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
2af30 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
2af40 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  rator,.         
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
2af60 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79  .*s", (int)Array
2af70 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65 70 61 72  Size(p->colSepar
2af80 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31  ator)-1, azArg[1
2af90 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
2afa0 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20  ( nArg>=3 ){.   
2afb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2afc0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2afd0 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2afe0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  rowSeparator,.  
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
2b010 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 72  t)ArraySize(p->r
2b020 6f 77 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20  owSeparator)-1, 
2b030 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 7d  azArg[2]);.    }
2b040 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2b050 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26  c=='s' && n>=4 &
2b060 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2b070 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c 6e 29 3d  0],"sha3sum",n)=
2b080 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2b090 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b  char *zLike = 0;
2b0a0 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
2b0b0 65 20 74 6f 20 63 68 65 63 6b 73 75 6d 2e 20 30  e to checksum. 0
2b0c0 20 6d 65 61 6e 73 20 65 76 65 72 79 74 68 69 6e   means everythin
2b0d0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  g */.    int i; 
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2b100 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 63  r */.    int bSc
2b110 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20  hema = 0;       
2b120 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73 68 20 74    /* Also hash t
2b130 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  he schema */.   
2b140 20 69 6e 74 20 62 53 65 70 61 72 61 74 65 20 3d   int bSeparate =
2b150 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 48 61 73   0;       /* Has
2b160 68 20 65 61 63 68 20 74 61 62 6c 65 20 73 65 70  h each table sep
2b170 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 69  arately */.    i
2b180 6e 74 20 69 53 69 7a 65 20 3d 20 32 32 34 3b 20  nt iSize = 224; 
2b190 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
2b1a0 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
2b1b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 44 65 62   */.    int bDeb
2b1c0 75 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ug = 0;         
2b1d0 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77 20 74 68   /* Only show th
2b1e0 65 20 71 75 65 72 79 20 74 68 61 74 20 77 6f 75  e query that wou
2b1f0 6c 64 20 68 61 76 65 20 72 75 6e 20 2a 2f 0a 20  ld have run */. 
2b200 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2b210 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 46  *pStmt;     /* F
2b220 6f 72 20 71 75 65 72 79 69 6e 67 20 74 61 62 6c  or querying tabl
2b230 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  es names */.    
2b240 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
2b250 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
2b260 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 20  to be run */.   
2b270 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20   char *zSep;    
2b280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70            /* Sep
2b290 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 53 68  arator */.    Sh
2b2a0 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b 20 20 20  ellText sSql;   
2b2b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
2b2c0 74 65 20 53 51 4c 20 66 6f 72 20 74 68 65 20 71  te SQL for the q
2b2d0 75 65 72 79 20 74 6f 20 72 75 6e 20 74 68 65 20  uery to run the 
2b2e0 68 61 73 68 20 2a 2f 0a 20 20 20 20 53 68 65 6c  hash */.    Shel
2b2f0 6c 54 65 78 74 20 73 51 75 65 72 79 3b 20 20 20  lText sQuery;   
2b300 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 71       /* Set of q
2b310 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20 72  ueries used to r
2b320 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  ead all content 
2b330 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  */.    open_db(p
2b340 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 0);.    for(i=
2b350 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
2b360 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2b370 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
2b380 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
2b390 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
2b3a0 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
2b3b0 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[0]=='-' ) z++
2b3c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
2b3d0 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d 61 22 29  rcmp(z,"schema")
2b3e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b3f0 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20   bSchema = 1;.  
2b400 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
2b410 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2b420 2c 22 73 68 61 33 2d 32 32 34 22 29 3d 3d 30 20  ,"sha3-224")==0 
2b430 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  || strcmp(z,"sha
2b440 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20 20 20 20  3-256")==0.     
2b450 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c      || strcmp(z,
2b460 22 73 68 61 33 2d 33 38 34 22 29 3d 3d 30 20 7c  "sha3-384")==0 |
2b470 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33  | strcmp(z,"sha3
2b480 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20 20 20 20  -512")==0.      
2b490 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2b4a0 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 5b 35  Size = atoi(&z[5
2b4b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
2b4c0 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  e.        if( st
2b4d0 72 63 6d 70 28 7a 2c 22 64 65 62 75 67 22 29 3d  rcmp(z,"debug")=
2b4e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b4f0 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20  bDebug = 1;.    
2b500 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
2b510 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74    {.          ut
2b520 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b530 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
2b540 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73  n \"%s\" on \"%s
2b550 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
2b570 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29  rg[i], azArg[0])
2b580 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
2b590 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b5a0 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
2b5b0 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20 20 20 20  : --schema".    
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5d0 20 20 20 20 20 20 20 20 20 22 20 2d 2d 73 68 61           " --sha
2b5e0 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d 32 35 35  3-224 --sha3-255
2b5f0 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d 2d 73 68   --sha3-384 --sh
2b600 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20 20 20 20  a3-512\n");.    
2b610 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2b620 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2b630 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2b640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b650 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65 20  }else if( zLike 
2b660 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2b670 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2b680 73 61 67 65 3a 20 2e 73 68 61 33 73 75 6d 20 3f  sage: .sha3sum ?
2b690 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b 45 2d 50  OPTIONS? ?LIKE-P
2b6a0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
2b6b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2b6c0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2b6d0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2b6e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b6f0 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a 20 20 20    zLike = z;.   
2b700 20 20 20 20 20 62 53 65 70 61 72 61 74 65 20 3d       bSeparate =
2b710 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
2b720 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
2b730 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a 4c 69 6b  "sqlite_%", zLik
2b740 65 2c 20 30 29 3d 3d 30 20 29 20 62 53 63 68 65  e, 0)==0 ) bSche
2b750 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ma = 1;.      }.
2b760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 53      }.    if( bS
2b770 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 7a  chema ){.      z
2b780 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f  Sql = "SELECT lo
2b790 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73  wer(name) FROM s
2b7a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
2b7b0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
2b7c0 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
2b7d0 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
2b7e0 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20 20  tpage,0)>1".    
2b7f0 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
2b800 20 41 4c 4c 20 53 45 4c 45 43 54 20 27 73 71 6c   ALL SELECT 'sql
2b810 69 74 65 5f 6d 61 73 74 65 72 27 22 0a 20 20 20  ite_master'".   
2b820 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
2b830 52 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e  R BY 1 collate n
2b840 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d 65 6c 73  ocase";.    }els
2b850 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  e{.      zSql = 
2b860 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61  "SELECT lower(na
2b870 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  me) FROM sqlite_
2b880 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
2b890 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
2b8a0 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f  e='table' AND co
2b8b0 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
2b8c0 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20  0)>1".          
2b8d0 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f     " AND name NO
2b8e0 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25  T LIKE 'sqlite_%
2b8f0 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '".             
2b900 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f 6c  " ORDER BY 1 col
2b910 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20  late nocase";.  
2b920 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2b930 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2b940 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2b950 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 69 74  mt, 0);.    init
2b960 54 65 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20  Text(&sQuery);. 
2b970 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 71     initText(&sSq
2b980 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
2b990 78 74 28 26 73 53 71 6c 2c 20 22 57 49 54 48 20  xt(&sSql, "WITH 
2b9a0 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d 28  [sha3sum$query](
2b9b0 61 2c 62 29 20 41 53 28 22 2c 30 29 3b 0a 20 20  a,b) AS(",0);.  
2b9c0 20 20 7a 53 65 70 20 3d 20 22 56 41 4c 55 45 53    zSep = "VALUES
2b9d0 28 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  (";.    while( S
2b9e0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2b9f0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2ba00 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2ba10 61 72 20 2a 7a 54 61 62 20 3d 20 28 63 6f 6e 73  ar *zTab = (cons
2ba20 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2ba30 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2ba40 74 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t,0);.      if( 
2ba50 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69 74 65 33  zLike && sqlite3
2ba60 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b 65 2c 20  _strlike(zLike, 
2ba70 7a 54 61 62 2c 20 30 29 21 3d 30 20 29 20 63 6f  zTab, 0)!=0 ) co
2ba80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2ba90 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 2c 20  ( strncmp(zTab, 
2baa0 22 73 71 6c 69 74 65 5f 22 2c 37 29 21 3d 30 20  "sqlite_",7)!=0 
2bab0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
2bac0 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53  dText(&sQuery,"S
2bad0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20  ELECT * FROM ", 
2bae0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
2baf0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 7a  ndText(&sQuery,z
2bb00 54 61 62 2c 27 22 27 29 3b 0a 20 20 20 20 20 20  Tab,'"');.      
2bb10 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
2bb20 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e 44 45 58  uery," NOT INDEX
2bb30 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ED;", 0);.      
2bb40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2bb50 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 6d  (zTab, "sqlite_m
2bb60 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  aster")==0 ){.  
2bb70 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2bb80 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
2bb90 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
2bba0 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ame,sql FROM sql
2bbb0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbd0 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
2bbe0 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20  Y name;", 0);.  
2bbf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2bc00 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  rcmp(zTab, "sqli
2bc10 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
2bc20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
2bc30 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
2bc40 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73 65 71 20  SELECT name,seq 
2bc50 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75  FROM sqlite_sequ
2bc60 65 6e 63 65 22 0a 20 20 20 20 20 20 20 20 20 20  ence".          
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc80 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
2bc90 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ;", 0);.      }e
2bca0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
2bcb0 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  Tab, "sqlite_sta
2bcc0 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t1")==0 ){.     
2bcd0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2bce0 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74 62  Query,"SELECT tb
2bcf0 6c 2c 69 64 78 2c 73 74 61 74 20 46 52 4f 4d 20  l,idx,stat FROM 
2bd00 73 71 6c 69 74 65 5f 73 74 61 74 31 22 0a 20 20  sqlite_stat1".  
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
2bd30 20 42 59 20 74 62 6c 2c 69 64 78 3b 22 2c 20 30   BY tbl,idx;", 0
2bd40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2bd50 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20  f( strcmp(zTab, 
2bd60 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 29 3d  "sqlite_stat3")=
2bd70 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2bd80 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20  || strcmp(zTab, 
2bd90 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 29 3d  "sqlite_stat4")=
2bda0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
2bdb0 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
2bdc0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
2bdd0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
2bde0 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65  appendText(&sQue
2bdf0 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b 0a 20 20  ry, zTab, 0);.  
2be00 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2be10 28 26 73 51 75 65 72 79 2c 20 22 20 4f 52 44 45  (&sQuery, " ORDE
2be20 52 20 42 59 20 74 62 6c 2c 20 69 64 78 2c 20 72  R BY tbl, idx, r
2be30 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b 0a 20 20  owid;\n", 0);.  
2be40 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
2be50 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20 7a 53  ndText(&sSql, zS
2be60 65 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  ep, 0);.      ap
2be70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
2be80 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27 27 29 3b  sQuery.z, '\'');
2be90 0a 20 20 20 20 20 20 73 51 75 65 72 79 2e 6e 20  .      sQuery.n 
2bea0 3d 20 30 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  = 0;.      appen
2beb0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 2c 22  dText(&sSql, ","
2bec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65  , 0);.      appe
2bed0 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20 7a 54  ndText(&sSql, zT
2bee0 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20  ab, '\'');.     
2bef0 20 7a 53 65 70 20 3d 20 22 29 2c 28 22 3b 0a 20   zSep = "),(";. 
2bf00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2bf10 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2bf20 3b 0a 20 20 20 20 69 66 28 20 62 53 65 70 61 72  ;.    if( bSepar
2bf30 61 74 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  ate ){.      zSq
2bf40 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2bf50 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
2bf60 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20 20  %s))".          
2bf70 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 68  " SELECT lower(h
2bf80 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 61 2c  ex(sha3_query(a,
2bf90 25 64 29 29 29 20 41 53 20 68 61 73 68 2c 20 62  %d))) AS hash, b
2bfa0 20 41 53 20 6c 61 62 65 6c 22 0a 20 20 20 20 20   AS label".     
2bfb0 20 20 20 20 20 22 20 20 20 46 52 4f 4d 20 5b 73       "   FROM [s
2bfc0 68 61 33 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a  ha3sum$query]",.
2bfd0 20 20 20 20 20 20 20 20 20 20 73 53 71 6c 2e 7a            sSql.z
2bfe0 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  , iSize);.    }e
2bff0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  lse{.      zSql 
2c000 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c010 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 73  f(.          "%s
2c020 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ))".          " 
2c030 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78  SELECT lower(hex
2c040 28 73 68 61 33 5f 71 75 65 72 79 28 67 72 6f 75  (sha3_query(grou
2c050 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27 29 2c 25  p_concat(a,''),%
2c060 64 29 29 29 20 41 53 20 68 61 73 68 22 0a 20 20  d))) AS hash".  
2c070 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
2c080 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
2c090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
2c0a0 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
2c0b0 20 7d 0a 20 20 20 20 66 72 65 65 54 65 78 74 28   }.    freeText(
2c0c0 26 73 51 75 65 72 79 29 3b 0a 20 20 20 20 66 72  &sQuery);.    fr
2c0d0 65 65 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20  eeText(&sSql);. 
2c0e0 20 20 20 69 66 28 20 62 44 65 62 75 67 20 29 7b     if( bDebug ){
2c0f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2c100 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
2c110 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65  ", zSql);.    }e
2c120 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c  lse{.      shell
2c130 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
2c140 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  l, shell_callbac
2c150 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  k, p, 0);.    }.
2c160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c170 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a  (zSql);.  }else.
2c180 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20  .  if( c=='s'.  
2c190 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41   && (strncmp(azA
2c1a0 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20  rg[0], "shell", 
2c1b0 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70  n)==0 || strncmp
2c1c0 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65  (azArg[0],"syste
2c1d0 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  m",n)==0).  ){. 
2c1e0 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20     char *zCmd;. 
2c1f0 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
2c200 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
2c210 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2c220 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2c230 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c  .system COMMAND\
2c240 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2c250 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2c260 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2c270 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20  .    }.    zCmd 
2c280 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c290 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31  f(strchr(azArg[1
2c2a0 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22  ],' ')==0?"%s":"
2c2b0 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31  \"%s\"", azArg[1
2c2c0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b  ]);.    for(i=2;
2c2d0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
2c2e0 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69       zCmd = sqli
2c2f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63  te3_mprintf(strc
2c300 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29  hr(azArg[i],' ')
2c310 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20  ==0?"%z %s":"%z 
2c320 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 20 20 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72        zCmd, azAr
2c350 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
2c360 20 78 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64   x = system(zCmd
2c370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2c380 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69  ree(zCmd);.    i
2c390 66 28 20 78 20 29 20 72 61 77 5f 70 72 69 6e 74  f( x ) raw_print
2c3a0 66 28 73 74 64 65 72 72 2c 20 22 53 79 73 74 65  f(stderr, "Syste
2c3b0 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  m command return
2c3c0 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d  s %d\n", x);.  }
2c3d0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2c3e0 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
2c3f0 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20  Arg[0], "show", 
2c400 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
2c410 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c420 61 7a 42 6f 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66  azBool[] = { "of
2c430 66 22 2c 20 22 6f 6e 22 2c 20 22 66 75 6c 6c 22  f", "on", "full"
2c440 2c 20 22 75 6e 6b 22 20 7d 3b 0a 20 20 20 20 69  , "unk" };.    i
2c450 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  nt i;.    if( nA
2c460 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
2c470 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2c480 2c 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c  , "Usage: .show\
2c490 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2c4a0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2c4b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2c4c0 0a 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f  .    }.    utf8_
2c4d0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2c4e0 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
2c4f0 65 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20  echo",.         
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b           azBool[
2c520 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
2c530 53 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20  SHFLG_Echo)]);. 
2c540 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2c550 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
2c560 20 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a   %s\n","eqp", az
2c570 42 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26  Bool[p->autoEQP&
2c580 33 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  3]);.    utf8_pr
2c590 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
2c5a0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78  2.12s: %s\n","ex
2c5b0 70 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20  plain",.        
2c5c0 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45   p->mode==MODE_E
2c5d0 78 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20  xplain ? "on" : 
2c5e0 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f  p->autoExplain ?
2c5f0 20 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29   "auto" : "off")
2c600 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
2c610 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
2c620 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72  s: %s\n","header
2c630 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68  s", azBool[p->sh
2c640 6f 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20  owHeader!=0]);. 
2c650 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2c660 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
2c670 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
2c680 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
2c690 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
2c6a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
2c6b0 2e 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61  .12s: ", "nullva
2c6c0 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74  lue");.      out
2c6d0 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
2c6e0 6f 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  out, p->nullValu
2c6f0 65 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  e);.      raw_pr
2c700 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
2c710 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
2c720 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
2c730 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  12s: %s\n","outp
2c740 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
2c750 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74   strlen30(p->out
2c760 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69  file) ? p->outfi
2c770 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a  le : "stdout");.
2c780 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c790 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a  p->out,"%12.12s:
2c7a0 20 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f   ", "colseparato
2c7b0 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  r");.      outpu
2c7c0 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
2c7d0 74 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  t, p->colSeparat
2c7e0 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  or);.      raw_p
2c7f0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
2c800 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  n");.    utf8_pr
2c810 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32  intf(p->out,"%12
2c820 2e 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70  .12s: ", "rowsep
2c830 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20  arator");.      
2c840 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
2c850 70 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65  p->out, p->rowSe
2c860 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
2c870 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2c880 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
2c890 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2c8a0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
2c8b0 22 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f  ","stats", azBoo
2c8c0 6c 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d  l[p->statsOn!=0]
2c8d0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
2c8e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
2c8f0 31 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29  12s: ", "width")
2c900 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69  ;.    for (i=0;i
2c910 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  <(int)ArraySize(
2c920 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20  p->colWidth) && 
2c930 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21  p->colWidth[i] !
2c940 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20  = 0;i++) {.     
2c950 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2c960 75 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f  ut, "%d ", p->co
2c970 6c 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20  lWidth[i]);.    
2c980 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
2c990 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
2c9a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c9b0 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
2c9c0 3a 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61  : %s\n", "filena
2c9d0 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me",.           
2c9e0 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
2c9f0 61 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65  ame ? p->zDbFile
2ca00 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65  name : "");.  }e
2ca10 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
2ca20 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2ca30 72 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20  rg[0], "stats", 
2ca40 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2ca50 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2ca60 20 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62    p->statsOn = b
2ca70 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2ca80 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2ca90 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
2caa0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
2cab0 61 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29  ats(p->db, p, 0)
2cac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cad0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2cae0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
2caf0 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22  tats ?on|off?\n"
2cb00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2cb10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2cb20 20 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26    if( (c=='t' &&
2cb30 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28   n>1 && strncmp(
2cb40 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65  azArg[0], "table
2cb50 73 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  s", n)==0).   ||
2cb60 20 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72   (c=='i' && (str
2cb70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2cb80 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a  indices", n)==0.
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cba0 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   || strncmp(azAr
2cbb0 67 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c  g[0], "indexes",
2cbc0 20 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20   n)==0) ).  ){. 
2cbd0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2cbe0 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  *pStmt;.    char
2cbf0 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20   **azResult;.   
2cc00 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f   int nRow, nAllo
2cc10 63 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  c;.    int ii;. 
2cc20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a     ShellText s;.
2cc30 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 29      initText(&s)
2cc40 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2cc50 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2cc60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2cc70 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
2cc80 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20  database_list", 
2cc90 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2cca0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ccb0 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73  urn shellDatabas
2ccc0 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a  eError(p->db);..
2ccd0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 26      if( nArg>2 &
2cce0 26 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  & c=='i' ){.    
2ccf0 20 20 2f 2a 20 49 74 20 69 73 20 61 6e 20 68 69    /* It is an hi
2cd00 73 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e  storical acciden
2cd10 74 20 74 68 61 74 20 74 68 65 20 2e 69 6e 64 65  t that the .inde
2cd20 78 65 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77  xes command show
2cd30 73 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20  s an error.     
2cd40 20 2a 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64 20   ** when called 
2cd50 77 69 74 68 20 74 68 65 20 77 72 6f 6e 67 20 6e  with the wrong n
2cd60 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2cd70 74 73 20 77 68 65 72 65 61 73 20 74 68 65 20 2e  ts whereas the .
2cd80 74 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  tables.      ** 
2cd90 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74  command does not
2cda0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 61 77 5f 70  . */.      raw_p
2cdb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2cdc0 73 61 67 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f  sage: .indexes ?
2cdd0 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
2cde0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2cdf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2ce00 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2ce10 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
2ce20 30 3b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  0; sqlite3_step(
2ce30 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
2ce40 4f 57 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OW; ii++){.     
2ce50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2ce60 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
2ce70 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
2ce80 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
2ce90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62  );.      if( zDb
2cea0 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2ceb0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2e  ue;.      if( s.
2cec0 7a 20 26 26 20 73 2e 7a 5b 30 5d 20 29 20 61 70  z && s.z[0] ) ap
2ced0 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 20 55  pendText(&s, " U
2cee0 4e 49 4f 4e 20 41 4c 4c 20 22 2c 20 30 29 3b 0a  NION ALL ", 0);.
2cef0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2cf00 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 4e 61 6d  3_stricmp(zDbNam
2cf10 65 2c 20 22 6d 61 69 6e 22 29 3d 3d 30 20 29 7b  e, "main")==0 ){
2cf20 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2cf30 65 78 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20  ext(&s, "SELECT 
2cf40 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
2cf50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cf60 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2cf70 28 26 73 2c 20 22 53 45 4c 45 43 54 20 22 2c 20  (&s, "SELECT ", 
2cf80 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
2cf90 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61  ndText(&s, zDbNa
2cfa0 6d 65 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20  me, '\'');.     
2cfb0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2cfc0 2c 20 22 7c 7c 27 2e 27 7c 7c 6e 61 6d 65 20 46  , "||'.'||name F
2cfd0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
2cfe0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
2cff0 65 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c  ext(&s, zDbName,
2d000 20 27 22 27 29 3b 0a 20 20 20 20 20 20 61 70 70   '"');.      app
2d010 65 6e 64 54 65 78 74 28 26 73 2c 20 22 2e 73 71  endText(&s, ".sq
2d020 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 2c 20 30  lite_master ", 0
2d030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
2d040 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61  't' ){.        a
2d050 70 70 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57  ppendText(&s," W
2d060 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
2d070 61 62 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20  able','view')". 
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d       "   AND nam
2d0a0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
2d0b0 74 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20  te_%'".         
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2d0d0 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f   AND name LIKE ?
2d0e0 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  1", 0);.      }e
2d0f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70  lse{.        app
2d100 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48 45  endText(&s," WHE
2d110 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  RE type='index'"
2d120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d130 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74         "   AND t
2d140 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  bl_name LIKE ?1"
2d150 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2d160 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2d170 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2d180 74 6d 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  tmt);.    append
2d190 54 65 78 74 28 26 73 2c 20 22 20 4f 52 44 45 52  Text(&s, " ORDER
2d1a0 20 42 59 20 31 22 2c 20 30 29 3b 0a 20 20 20 20   BY 1", 0);.    
2d1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2d1c0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 73  pare_v2(p->db, s
2d1d0 2e 7a 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  .z, -1, &pStmt, 
2d1e0 30 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  0);.    freeText
2d1f0 28 26 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (&s);.    if( rc
2d200 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
2d210 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
2d220 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  db);..    /* Run
2d230 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2d240 6e 74 20 70 72 65 70 61 72 65 64 20 62 79 20 74  nt prepared by t
2d250 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
2d260 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
2d270 73 0a 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 61  s.    ** as an a
2d280 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d  rray of nul-term
2d290 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 20 69  inated strings i
2d2a0 6e 20 61 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a  n azResult[].  *
2d2b0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c  /.    nRow = nAl
2d2c0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52  loc = 0;.    azR
2d2d0 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69  esult = 0;.    i
2d2e0 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  f( nArg>1 ){.   
2d2f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
2d300 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61  text(pStmt, 1, a
2d310 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c  zArg[1], -1, SQL
2d320 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2d330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d340 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
2d350 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22  xt(pStmt, 1, "%"
2d360 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
2d370 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
2d380 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
2d390 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
2d3a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
2d3b0 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63  if( nRow>=nAlloc
2d3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2d3d0 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   **azNew;.      
2d3e0 20 20 69 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f    int n2 = nAllo
2d3f0 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  c*2 + 10;.      
2d400 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65    azNew = sqlite
2d410 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65  3_realloc64(azRe
2d420 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52  sult, sizeof(azR
2d430 65 73 75 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20  esult[0])*n2);. 
2d440 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77         if( azNew
2d450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d460 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d   rc = shellNomem
2d470 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
2d480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d490 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c    }.        nAll
2d4a0 6f 63 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20  oc = n2;.       
2d4b0 20 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65   azResult = azNe
2d4c0 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
2d4d0 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20   azResult[nRow] 
2d4e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2d4f0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
2d500 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2d510 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66  t, 0));.      if
2d520 28 20 30 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52  ( 0==azResult[nR
2d530 6f 77 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ow] ){.        r
2d540 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  c = shellNomemEr
2d550 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
2d560 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2d570 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20      nRow++;.    
2d580 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
2d590 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2d5a0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2d5b0 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
2d5c0 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d  DatabaseError(p-
2d5d0 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >db);.    }..   
2d5e0 20 2f 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74   /* Pretty-print
2d5f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d600 20 61 72 72 61 79 20 61 7a 52 65 73 75 6c 74 5b   array azResult[
2d610 5d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  ] to the output 
2d620 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  */.    if( rc==0
2d630 20 26 26 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20   && nRow>0 ){.  
2d640 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78      int len, max
2d650 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  len = 0;.      i
2d660 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69  nt i, j;.      i
2d670 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50  nt nPrintCol, nP
2d680 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66  rintRow;.      f
2d690 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20  or(i=0; i<nRow; 
2d6a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  i++){.        le
2d6b0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52  n = strlen30(azR
2d6c0 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20  esult[i]);.     
2d6d0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
2d6e0 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
2d6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d700 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28  nPrintCol = 80/(
2d710 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20  maxlen+2);.     
2d720 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31   if( nPrintCol<1
2d730 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31   ) nPrintCol = 1
2d740 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f  ;.      nPrintRo
2d750 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69  w = (nRow + nPri
2d760 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e  ntCol - 1)/nPrin
2d770 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  tCol;.      for(
2d780 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77  i=0; i<nPrintRow
2d790 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2d7a0 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b  for(j=i; j<nRow;
2d7b0 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a   j+=nPrintRow){.
2d7c0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2d7d0 7a 53 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f  zSp = j<nPrintRo
2d7e0 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20  w ? "" : "  ";. 
2d7f0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2d800 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
2d810 25 2d 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c  %-*s", zSp, maxl
2d820 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
2d830 20 20 20 20 20 20 20 20 20 20 61 7a 52 65 73 75            azResu
2d840 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74  lt[j] ? azResult
2d850 5b 6a 5d 3a 22 22 29 3b 0a 20 20 20 20 20 20 20  [j]:"");.       
2d860 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
2d870 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
2d880 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
2d890 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   }..    for(ii=0
2d8a0 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29  ; ii<nRow; ii++)
2d8b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
2d8c0 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20  Result[ii]);.   
2d8d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
2d8e0 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65  Result);.  }else
2d8f0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 64  ..  /* Begin red
2d900 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20  irecting output 
2d910 74 6f 20 74 68 65 20 66 69 6c 65 20 22 74 65 73  to the file "tes
2d920 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 20 2a  tcase-out.txt" *
2d930 2f 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  /.  if( c=='t' &
2d940 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
2d950 5d 2c 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30  ],"testcase")==0
2d960 20 29 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72   ){.    output_r
2d970 65 73 65 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  eset(p);.    p->
2d980 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  out = output_fil
2d990 65 5f 6f 70 65 6e 28 22 74 65 73 74 63 61 73 65  e_open("testcase
2d9a0 2d 6f 75 74 2e 74 78 74 22 29 3b 0a 20 20 20 20  -out.txt");.    
2d9b0 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
2d9c0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2d9d0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2d9e0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 74  : cannot open 't
2d9f0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
2da00 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
2da10 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
2da20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2da30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2da40 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a  zTestcase), p->z
2da50 54 65 73 74 63 61 73 65 2c 20 22 25 73 22 2c 20  Testcase, "%s", 
2da60 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2da70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2da80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2da90 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65  eof(p->zTestcase
2daa0 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c  ), p->zTestcase,
2dab0 20 22 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   "?");.    }.  }
2dac0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2dad0 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
2dae0 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
2daf0 6e 3e 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=8 && strncmp(
2db00 61 7a 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63  azArg[0], "testc
2db10 74 72 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  trl", n)==0 && n
2db20 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 73 74  Arg>=2 ){.    st
2db30 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2db40 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
2db50 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65   char *zCtrlName
2db60 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61  ;   /* Name of a
2db70 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70   test-control op
2db80 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69  tion */.       i
2db90 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20  nt ctrlCode;    
2dba0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
2dbb0 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
2dbc0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d   option */.    }
2dbd0 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20   aCtrl[] = {.   
2dbe0 20 20 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22     { "prng_save"
2dbf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
2dc00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
2dc10 4e 47 5f 53 41 56 45 20 20 20 20 20 20 20 20 20  NG_SAVE         
2dc20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2dc30 22 70 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20  "prng_restore", 
2dc40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2dc50 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
2dc60 53 54 4f 52 45 20 20 20 20 20 20 20 20 20 20 20  STORE           
2dc70 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67  },.      { "prng
2dc80 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20  _reset",        
2dc90 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
2dca0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 20 20  TRL_PRNG_RESET  
2dcb0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2dcc0 20 20 20 20 7b 20 22 62 69 74 76 65 63 5f 74 65      { "bitvec_te
2dcd0 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 53  st",           S
2dce0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
2dcf0 49 54 56 45 43 5f 54 45 53 54 20 20 20 20 20 20  ITVEC_TEST      
2dd00 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2dd10 20 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22   "fault_install"
2dd20 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
2dd30 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
2dd40 49 4e 53 54 41 4c 4c 20 20 20 20 20 20 20 20 20  INSTALL         
2dd50 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 65 6e   },.      { "ben
2dd60 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73  ign_malloc_hooks
2dd70 22 2c 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ",   SQLITE_TEST
2dd80 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
2dd90 4f 43 5f 48 4f 4f 4b 53 20 20 20 20 7d 2c 0a 20  OC_HOOKS    },. 
2dda0 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f       { "pending_
2ddb0 62 79 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  byte",          
2ddc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2ddd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
2dde0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ddf0 7b 20 22 61 73 73 65 72 74 22 2c 20 20 20 20 20  { "assert",     
2de00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2de10 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
2de20 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
2de30 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 6c    },.      { "al
2de40 77 61 79 73 22 2c 20 20 20 20 20 20 20 20 20 20  ways",          
2de50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
2de60 54 43 54 52 4c 5f 41 4c 57 41 59 53 20 20 20 20  TCTRL_ALWAYS    
2de70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2de80 20 20 20 20 20 20 7b 20 22 72 65 73 65 72 76 65        { "reserve
2de90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2dea0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2deb0 5f 52 45 53 45 52 56 45 20 20 20 20 20 20 20 20  _RESERVE        
2dec0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2ded0 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   { "optimization
2dee0 73 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  s",         SQLI
2def0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2df00 4d 49 5a 41 54 49 4f 4e 53 20 20 20 20 20 20 20  MIZATIONS       
2df10 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 69     },.      { "i
2df20 73 6b 65 79 77 6f 72 64 22 2c 20 20 20 20 20 20  skeyword",      
2df30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
2df40 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2df60 0a 20 20 20 20 20 20 7b 20 22 62 79 74 65 6f 72  .      { "byteor
2df70 64 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  der",           
2df80 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2df90 4c 5f 42 59 54 45 4f 52 44 45 52 20 20 20 20 20  L_BYTEORDER     
2dfa0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2dfb0 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72 72 75    { "never_corru
2dfc0 70 74 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c  pt",         SQL
2dfd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
2dfe0 45 52 5f 43 4f 52 52 55 50 54 20 20 20 20 20 20  ER_CORRUPT      
2dff0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2e000 69 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20  imposter",      
2e010 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
2e020 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2e040 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
2e050 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a   testctrl = -1;.
2e060 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 30 3b      int rc2 = 0;
2e070 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a  .    int i, n2;.
2e080 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2e090 29 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76 65  );..    /* conve
2e0a0 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78 74  rt testctrl text
2e0b0 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65   option to value
2e0c0 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69 71  . allow any uniq
2e0d0 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a 2a  ue prefix.    **
2e0e0 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 6e   of the option n
2e0f0 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72 69  ame, or a numeri
2e100 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  cal value. */.  
2e110 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28    n2 = strlen30(
2e120 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
2e130 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
2e140 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29  ize(aCtrl); i++)
2e150 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
2e160 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43  cmp(azArg[1], aC
2e170 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
2e180 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
2e190 20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c      if( testctrl
2e1a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2e1b0 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c  testctrl = aCtrl
2e1c0 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20  [i].ctrlCode;.  
2e1d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e1e0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2e1f0 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69  tf(stderr, "ambi
2e200 67 75 6f 75 73 20 6f 70 74 69 6f 6e 20 6e 61 6d  guous option nam
2e210 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  e: \"%s\"\n", az
2e220 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2e230 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31     testctrl = -1
2e240 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2e250 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2e260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e270 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29 20  f( testctrl<0 ) 
2e280 74 65 73 74 63 74 72 6c 20 3d 20 28 69 6e 74 29  testctrl = (int)
2e290 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
2e2a0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
2e2b0 28 74 65 73 74 63 74 72 6c 3c 53 51 4c 49 54 45  (testctrl<SQLITE
2e2c0 5f 54 45 53 54 43 54 52 4c 5f 46 49 52 53 54 29  _TESTCTRL_FIRST)
2e2d0 20 7c 7c 20 28 74 65 73 74 63 74 72 6c 3e 53 51   || (testctrl>SQ
2e2e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 41  LITE_TESTCTRL_LA
2e2f0 53 54 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ST) ){.      utf
2e300 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e310 22 45 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64 20  "Error: invalid 
2e320 74 65 73 74 63 74 72 6c 20 6f 70 74 69 6f 6e 3a  testctrl option:
2e330 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d   %s\n", azArg[1]
2e340 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e350 20 20 20 20 73 77 69 74 63 68 28 74 65 73 74 63      switch(testc
2e360 74 72 6c 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f  trl){..        /
2e370 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2e380 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 64 62 2c 20  ontrol(int, db, 
2e390 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  int) */.        
2e3a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2e3b0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
2e3c0 4e 53 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  NS:.        case
2e3d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2e3e0 5f 52 45 53 45 52 56 45 3a 0a 20 20 20 20 20 20  _RESERVE:.      
2e3f0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
2e400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e410 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74 29 73 74  nt opt = (int)st
2e420 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d 2c 20 30  rtol(azArg[2], 0
2e430 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2e440 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2e450 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
2e460 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70  tctrl, p->db, op
2e470 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2e480 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2e490 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29 5c  t, "%d (0x%08x)\
2e4a0 6e 22 2c 20 72 63 32 2c 20 72 63 32 29 3b 0a 20  n", rc2, rc2);. 
2e4b0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2e4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
2e4d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2e4e0 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72  ,"Error: testctr
2e4f0 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e  l %s takes a sin
2e500 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f 6e 5c 6e  gle int option\n
2e510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e520 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
2e530 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e540 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2e550 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2e560 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2e570 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  int) */.        
2e580 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2e590 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 0a  CTRL_PRNG_SAVE:.
2e5a0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
2e5b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
2e5c0 47 5f 52 45 53 54 4f 52 45 3a 0a 20 20 20 20 20  G_RESTORE:.     
2e5d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
2e5e0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
2e5f0 45 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  ET:.        case
2e600 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2e610 5f 42 59 54 45 4f 52 44 45 52 3a 0a 20 20 20 20  _BYTEORDER:.    
2e620 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
2e630 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2e640 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74   rc2 = sqlite3_t
2e650 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74  est_control(test
2e660 63 74 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  ctrl);.         
2e670 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2e680 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38  >out, "%d (0x%08
2e690 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29  x)\n", rc2, rc2)
2e6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
2e6b0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2e6c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e6d0 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74  err,"Error: test
2e6e0 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20 6e 6f  ctrl %s takes no
2e6f0 20 6f 70 74 69 6f 6e 73 5c 6e 22 2c 0a 20 20 20   options\n",.   
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a       azArg[1]);.
2e720 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2e740 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2e750 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
2e760 74 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20 20  t, uint) */.    
2e770 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2e780 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
2e790 5f 42 59 54 45 3a 0a 20 20 20 20 20 20 20 20 20  _BYTE:.         
2e7a0 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
2e7c0 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20 28  gned int opt = (
2e7d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e 74  unsigned int)int
2e7e0 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
2e7f0 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2]);.           
2e800 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74   rc2 = sqlite3_t
2e810 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74  est_control(test
2e820 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20  ctrl, opt);.    
2e830 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2e840 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28  tf(p->out, "%d (
2e850 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c  0x%08x)\n", rc2,
2e860 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20   rc2);.         
2e870 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2e880 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2e890 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2e8a0 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b   testctrl %s tak
2e8b0 65 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 73 69  es a single unsi
2e8c0 67 6e 65 64 22 0a 20 20 20 20 20 20 20 20 20 20  gned".          
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8e0 20 22 20 69 6e 74 20 6f 70 74 69 6f 6e 5c 6e 22   " int option\n"
2e8f0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2e900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e910 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2e920 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
2e930 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
2e940 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  int) */.        
2e950 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2e960 43 54 52 4c 5f 41 53 53 45 52 54 3a 0a 20 20 20  CTRL_ASSERT:.   
2e970 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2e980 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
2e990 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
2e9a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
2e9b0 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 0a 20 20  EVER_CORRUPT:.  
2e9c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
2e9d0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==3 ){.         
2e9e0 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f     int opt = boo
2e9f0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2ea00 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2]);.           
2ea10 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74   rc2 = sqlite3_t
2ea20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74  est_control(test
2ea30 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20  ctrl, opt);.    
2ea40 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2ea50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28  tf(p->out, "%d (
2ea60 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c  0x%08x)\n", rc2,
2ea70 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20   rc2);.         
2ea80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2ea90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2eaa0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2eab0 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b   testctrl %s tak
2eac0 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 20  es a single int 
2ead0 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20  option\n",.     
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaf0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
2eb00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2eb10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2eb20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2eb30 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2eb40 69 6e 74 2c 20 63 68 61 72 20 2a 29 20 2a 2f 0a  int, char *) */.
2eb50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
2eb60 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20 20 20  KEYWORD.        
2eb70 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2eb80 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 0a  CTRL_ISKEYWORD:.
2eb90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
2eba0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
2ebb0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ebc0 2a 6f 70 74 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  *opt = azArg[2];
2ebd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32  .            rc2
2ebe0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
2ebf0 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
2ec00 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20  , opt);.        
2ec10 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2ec20 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30  ->out, "%d (0x%0
2ec30 38 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32  8x)\n", rc2, rc2
2ec40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  );.          } e
2ec50 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2ec60 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2ec70 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
2ec90 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25  rror: testctrl %
2eca0 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  s takes a single
2ecb0 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e 5c 6e   char * option\n
2ecc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ecd0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
2ece0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
2ecf0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2ed00 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  k;.#endif..     
2ed10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
2ed20 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2ed30 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
2ed40 6e 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20 20 20  nArg==5 ){.     
2ed50 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
2ed60 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2ed70 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64  l(testctrl, p->d
2ed80 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
2eda0 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20  rg[2],.         
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edc0 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a   integerValue(az
2edd0 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20  Arg[3]),.       
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edf0 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28     integerValue(
2ee00 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20  azArg[4]));.    
2ee10 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2ee20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28  tf(p->out, "%d (
2ee30 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c  0x%08x)\n", rc2,
2ee40 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20   rc2);.         
2ee50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ee60 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ee70 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20 2e 74  tderr,"Usage: .t
2ee80 65 73 74 63 74 72 6c 20 69 6d 70 6f 73 74 65 72  estctrl imposter
2ee90 20 64 62 4e 61 6d 65 20 6f 6e 6f 66 66 20 74 6e   dbName onoff tn
2eea0 75 6d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  um\n");.        
2eeb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2eec0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63 61  eak;..        ca
2eed0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
2eee0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 0a  RL_BITVEC_TEST:.
2eef0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
2ef00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
2ef10 4c 54 5f 49 4e 53 54 41 4c 4c 3a 0a 20 20 20 20  LT_INSTALL:.    
2ef20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2ef30 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
2ef40 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 0a 20 20  MALLOC_HOOKS:.  
2ef50 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
2ef60 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2ef70 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 20 20 20 22 45 72 72 6f 72 3a 20 43 4c 49 20 73     "Error: CLI s
2efa0 75 70 70 6f 72 74 20 66 6f 72 20 74 65 73 74 63  upport for testc
2efb0 74 72 6c 20 25 73 20 6e 6f 74 20 69 6d 70 6c 65  trl %s not imple
2efc0 6d 65 6e 74 65 64 5c 6e 22 2c 0a 20 20 20 20 20  mented\n",.     
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efe0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2eff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2f010 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
2f020 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
2f030 45 53 54 41 42 4c 45 29 20 2a 2f 0a 0a 20 20 69  ESTABLE) */..  i
2f040 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34  f( c=='t' && n>4
2f050 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2f060 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c  g[0], "timeout",
2f070 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
2f080 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2f090 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
2f0a0 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72  meout(p->db, nAr
2f0b0 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e 74 65  g>=2 ? (int)inte
2f0c0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
2f0d0 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ]) : 0);.  }else
2f0e0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
2f0f0 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d  & n>=5 && strncm
2f100 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d  p(azArg[0], "tim
2f110 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
2f120 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2f130 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69 6d  .      enableTim
2f140 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
2f150 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2f160 20 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d     if( enableTim
2f170 65 72 20 26 26 20 21 48 41 53 5f 54 49 4d 45 52  er && !HAS_TIMER
2f180 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
2f190 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f1a0 45 72 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f 74  Error: timer not
2f1b0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
2f1c0 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b 0a  is system.\n");.
2f1d0 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69          enableTi
2f1e0 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mer = 0;.      }
2f1f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f200 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f210 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 69  err, "Usage: .ti
2f220 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  mer on|off\n");.
2f230 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2f240 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2f250 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72  f( c=='t' && str
2f260 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f270 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
2f280 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2f290 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
2f2a0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
2f2b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f2c0 22 55 73 61 67 65 3a 20 2e 74 72 61 63 65 20 46  "Usage: .trace F
2f2d0 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20  ILE|off\n");.   
2f2e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f2f0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f300 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2f310 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
2f320 6c 6f 73 65 28 70 2d 3e 74 72 61 63 65 4f 75 74  lose(p->traceOut
2f330 29 3b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 4f  );.    p->traceO
2f340 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  ut = output_file
2f350 5f 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b  _open(azArg[1]);
2f360 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2f370 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
2f380 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
2f390 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2f3a0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 69 66 28  G_POINT).    if(
2f3b0 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20   p->traceOut==0 
2f3c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f3d0 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64 62 2c  _trace_v2(p->db,
2f3e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
2f3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2f400 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e  te3_trace_v2(p->
2f410 64 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 43 45  db, SQLITE_TRACE
2f420 5f 53 54 4d 54 2c 20 73 71 6c 5f 74 72 61 63 65  _STMT, sql_trace
2f430 5f 63 61 6c 6c 62 61 63 6b 2c 70 2d 3e 74 72 61  _callback,p->tra
2f440 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65  ceOut);.    }.#e
2f450 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  ndif.  }else..#i
2f460 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
2f470 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 69  THENTICATION.  i
2f480 66 28 20 63 3d 3d 27 75 27 20 26 26 20 73 74 72  f( c=='u' && str
2f490 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f4a0 75 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  user", n)==0 ){.
2f4b0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
2f4c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2f4d0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2f4e0 65 3a 20 2e 75 73 65 72 20 53 55 42 43 4f 4d 4d  e: .user SUBCOMM
2f4f0 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20  AND ...\n");.   
2f500 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f510 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f520 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2f530 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2f540 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
2f550 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67 69 6e  (azArg[1],"login
2f560 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
2f570 66 28 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20  f( nArg!=4 ){.  
2f580 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f590 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f5a0 20 2e 75 73 65 72 20 6c 6f 67 69 6e 20 55 53 45   .user login USE
2f5b0 52 20 50 41 53 53 57 4f 52 44 5c 6e 22 29 3b 0a  R PASSWORD\n");.
2f5c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2f5d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2f5e0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2f5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2f600 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
2f610 61 75 74 68 65 6e 74 69 63 61 74 65 28 70 2d 3e  authenticate(p->
2f620 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 61 7a  db, azArg[2], az
2f630 41 72 67 5b 33 5d 2c 0a 20 20 20 20 20 20 20 20  Arg[3],.        
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
2f660 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d  )strlen(azArg[3]
2f670 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2f680 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2f690 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f6a0 22 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20  "Authentication 
2f6b0 66 61 69 6c 65 64 20 66 6f 72 20 75 73 65 72 20  failed for user 
2f6c0 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 32 5d 29  %s\n", azArg[2])
2f6d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2f6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2f6f0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2f700 7a 41 72 67 5b 31 5d 2c 22 61 64 64 22 29 3d 3d  zArg[1],"add")==
2f710 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
2f720 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg!=5 ){.      
2f730 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f740 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73  err, "Usage: .us
2f750 65 72 20 61 64 64 20 55 53 45 52 20 50 41 53 53  er add USER PASS
2f760 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22 29  WORD ISADMIN\n")
2f770 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2f780 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2f790 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
2f7c0 72 5f 61 64 64 28 70 2d 3e 64 62 2c 20 61 7a 41  r_add(p->db, azA
2f7d0 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20  rg[2],.         
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7f0 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e     azArg[3], (in
2f800 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33  t)strlen(azArg[3
2f810 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f830 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2f840 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 69  rg[4]));.      i
2f850 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f860 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f870 72 72 2c 20 22 55 73 65 72 2d 41 64 64 20 66 61  rr, "User-Add fa
2f880 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29  iled: %d\n", rc)
2f890 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2f8a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2f8b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2f8c0 7a 41 72 67 5b 31 5d 2c 22 65 64 69 74 22 29 3d  zArg[1],"edit")=
2f8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2f8e0 6e 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20  nArg!=5 ){.     
2f8f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f900 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75  derr, "Usage: .u
2f910 73 65 72 20 65 64 69 74 20 55 53 45 52 20 50 41  ser edit USER PA
2f920 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e  SSWORD ISADMIN\n
2f930 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2f940 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2f950 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2f960 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2f970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
2f980 73 65 72 5f 63 68 61 6e 67 65 28 70 2d 3e 64 62  ser_change(p->db
2f990 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20  , azArg[2],.    
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9b0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2f9c0 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  3], (int)strlen(
2f9d0 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9f0 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e           boolean
2fa00 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29  Value(azArg[4]))
2fa10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2fa20 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2fa30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2fa40 65 72 2d 45 64 69 74 20 66 61 69 6c 65 64 3a 20  er-Edit failed: 
2fa50 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
2fa60 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2fa70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2fa80 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2fa90 5d 2c 22 64 65 6c 65 74 65 22 29 3d 3d 30 20 29  ],"delete")==0 )
2faa0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2fab0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=3 ){.        r
2fac0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2fad0 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
2fae0 64 65 6c 65 74 65 20 55 53 45 52 5c 6e 22 29 3b  delete USER\n");
2faf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2fb00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
2fb10 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2fb20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2fb30 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
2fb40 5f 64 65 6c 65 74 65 28 70 2d 3e 64 62 2c 20 61  _delete(p->db, a
2fb50 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20  zArg[2]);.      
2fb60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fb70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2fb80 65 72 72 2c 20 22 55 73 65 72 2d 44 65 6c 65 74  err, "User-Delet
2fb90 65 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c  e failed: %d\n",
2fba0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63   rc);.        rc
2fbb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2fbc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2fbd0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2fbe0 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
2fbf0 6c 6f 67 69 6e 7c 61 64 64 7c 65 64 69 74 7c 64  login|add|edit|d
2fc00 65 6c 65 74 65 20 2e 2e 2e 5c 6e 22 29 3b 0a 20  elete ...\n");. 
2fc10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2fc20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2fc30 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2fc40 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
2fc50 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
2fc60 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
2fc70 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26  ..  if( c=='v' &
2fc80 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2fc90 30 5d 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 6e  0], "version", n
2fca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
2fcb0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2fcc0 22 53 51 4c 69 74 65 20 25 73 20 25 73 5c 6e 22  "SQLite %s %s\n"
2fcd0 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69 6f 6e   /*extra-version
2fce0 2d 69 6e 66 6f 2a 2f 2c 0a 20 20 20 20 20 20 20  -info*/,.       
2fcf0 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
2fd00 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73  ion(), sqlite3_s
2fd10 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 7d 65  ourceid());.  }e
2fd20 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76  lse..  if( c=='v
2fd30 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2fd40 72 67 5b 30 5d 2c 20 22 76 66 73 69 6e 66 6f 22  rg[0], "vfsinfo"
2fd50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2fd60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
2fd70 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61  me = nArg==2 ? a
2fd80 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
2fd90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
2fda0 73 20 2a 70 56 66 73 20 3d 20 30 3b 0a 20 20 20  s *pVfs = 0;.   
2fdb0 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
2fdc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
2fdd0 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
2fde0 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  zDbName, SQLITE_
2fdf0 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45  FCNTL_VFS_POINTE
2fe00 52 2c 20 26 70 56 66 73 29 3b 0a 20 20 20 20 20  R, &pVfs);.     
2fe10 20 69 66 28 20 70 56 66 73 20 29 7b 0a 20 20 20   if( pVfs ){.   
2fe20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2fe30 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a 4e  (p->out, "vfs.zN
2fe40 61 6d 65 20 20 20 20 20 20 3d 20 5c 22 25 73 5c  ame      = \"%s\
2fe50 22 5c 6e 22 2c 20 70 56 66 73 2d 3e 7a 4e 61 6d  "\n", pVfs->zNam
2fe60 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
2fe70 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2fe80 76 66 73 2e 69 56 65 72 73 69 6f 6e 20 20 20 3d  vfs.iVersion   =
2fe90 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 69 56   %d\n", pVfs->iV
2fea0 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ersion);.       
2feb0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2fec0 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73 46 69 6c  ut, "vfs.szOsFil
2fed0 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66  e   = %d\n", pVf
2fee0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
2fef0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ff00 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d 78  (p->out, "vfs.mx
2ff10 50 61 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e 22  Pathname = %d\n"
2ff20 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
2ff30 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
2ff40 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2ff50 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e  ( c=='v' && strn
2ff60 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76  cmp(azArg[0], "v
2ff70 66 73 6c 69 73 74 22 2c 20 6e 29 3d 3d 30 20 29  fslist", n)==0 )
2ff80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
2ff90 73 20 2a 70 56 66 73 3b 0a 20 20 20 20 73 71 6c  s *pVfs;.    sql
2ffa0 69 74 65 33 5f 76 66 73 20 2a 70 43 75 72 72 65  ite3_vfs *pCurre
2ffb0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nt = 0;.    if( 
2ffc0 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20 20 73  p->db ){.      s
2ffd0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2ffe0 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
2fff0 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
30000 56 46 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70 43  VFS_POINTER, &pC
30010 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  urrent);.    }. 
30020 20 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69     for(pVfs=sqli
30030 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
30040 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73   pVfs; pVfs=pVfs
30050 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
30060 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30070 75 74 2c 20 22 76 66 73 2e 7a 4e 61 6d 65 20 20  ut, "vfs.zName  
30080 20 20 20 20 3d 20 5c 22 25 73 5c 22 25 73 5c 6e      = \"%s\"%s\n
30090 22 2c 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 0a  ", pVfs->zName,.
300a0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 3d             pVfs=
300b0 3d 70 43 75 72 72 65 6e 74 20 3f 20 22 20 20 3c  =pCurrent ? "  <
300c0 2d 2d 2d 20 43 55 52 52 45 4e 54 22 20 3a 20 22  --- CURRENT" : "
300d0 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ");.      raw_pr
300e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
300f0 73 2e 69 56 65 72 73 69 6f 6e 20 20 20 3d 20 25  s.iVersion   = %
30100 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 69 56 65 72  d\n", pVfs->iVer
30110 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 72 61 77  sion);.      raw
30120 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
30130 22 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 20 20  "vfs.szOsFile   
30140 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 73  = %d\n", pVfs->s
30150 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  zOsFile);.      
30160 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
30170 74 2c 20 22 76 66 73 2e 6d 78 50 61 74 68 6e 61  t, "vfs.mxPathna
30180 6d 65 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73  me = %d\n", pVfs
30190 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ->mxPathname);. 
301a0 20 20 20 20 20 69 66 28 20 70 56 66 73 2d 3e 70       if( pVfs->p
301b0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
301c0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
301d0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
301e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
301f0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
30200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
30210 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27  se..  if( c=='v'
30220 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30230 67 5b 30 5d 2c 20 22 76 66 73 6e 61 6d 65 22 2c  g[0], "vfsname",
30240 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
30250 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
30260 65 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61 7a  e = nArg==2 ? az
30270 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b  Arg[1] : "main";
30280 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73 4e  .    char *zVfsN
30290 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ame = 0;.    if(
302a0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20 20   p->db ){.      
302b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
302c0 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 4e  trol(p->db, zDbN
302d0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
302e0 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 56 66 73  L_VFSNAME, &zVfs
302f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
30300 20 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20 20   zVfsName ){.   
30310 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30320 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
30330 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20   zVfsName);.    
30340 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30350 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20  (zVfsName);.    
30360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
30370 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e..#if defined(S
30380 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
30390 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
303a0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
303b0 29 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26  ).  if( c=='w' &
303c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
303d0 30 5d 2c 20 22 77 68 65 72 65 74 72 61 63 65 22  0], "wheretrace"
303e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
303f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30400 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f   = nArg>=2 ? boo
30410 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
30420 31 5d 29 20 3a 20 30 78 66 66 3b 0a 20 20 7d 65  1]) : 0xff;.  }e
30430 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
30440 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e  ( c=='w' && strn
30450 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77  cmp(azArg[0], "w
30460 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  idth", n)==0 ){.
30470 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61      int j;.    a
30480 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72  ssert( nArg<=Arr
30490 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b  aySize(azArg) );
304a0 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
304b0 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53  nArg && j<ArrayS
304c0 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
304d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; j++){.      p-
304e0 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d  >colWidth[j-1] =
304f0 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
30500 75 65 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ue(azArg[j]);.  
30510 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b    }.  }else..  {
30520 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
30530 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
30540 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64   unknown command
30550 20 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75   or invalid argu
30560 6d 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22  ments: ".      "
30570 20 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c   \"%s\". Enter \
30580 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c  ".help\" for hel
30590 70 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  p\n", azArg[0]);
305a0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
305b0 0a 0a 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  ..meta_command_e
305c0 78 69 74 3a 0a 20 20 69 66 28 20 70 2d 3e 6f 75  xit:.  if( p->ou
305d0 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 70 2d  tCount ){.    p-
305e0 3e 6f 75 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20 20  >outCount--;.   
305f0 20 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74   if( p->outCount
30600 3d 3d 30 20 29 20 6f 75 74 70 75 74 5f 72 65 73  ==0 ) output_res
30610 65 74 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  et(p);.  }.  ret
30620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30630 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
30640 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75  a semicolon occu
30650 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  rs anywhere in t
30660 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61  he first N chara
30670 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69  cters.** of stri
30680 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69  ng z[]..*/.stati
30690 63 20 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74 61  c int line_conta
306a0 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f  ins_semicolon(co
306b0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
306c0 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   N){.  int i;.  
306d0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
306e0 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  +){  if( z[i]=='
306f0 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20 7d  ;' ) return 1; }
30700 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
30710 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
30720 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73  e if a line cons
30730 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
30740 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a   whitespace..*/.
30750 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f  static int _all_
30760 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74  whitespace(const
30770 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72   char *z){.  for
30780 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  (; *z; z++){.   
30790 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 30   if( IsSpace(z[0
307a0 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
307b0 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
307c0 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[1]=='*' ){. 
307d0 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
307e0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
307f0 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d  (*z!='*' || z[1]
30800 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d  !='/') ){ z++; }
30810 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
30820 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
30830 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f     z++;.      co
30840 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
30850 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26    if( *z=='-' &&
30860 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[1]=='-' ){.  
30870 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
30880 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
30890 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\n' ){ z++; 
308a0 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
308b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
308c0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
308d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
308e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
308f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30900 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  n TRUE if the li
30910 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61  ne typed in is a
30920 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65  n SQL command te
30930 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a  rminator other.*
30940 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f  * than a semi-co
30950 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65  lon.  The SQL Se
30960 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20  rver style "go" 
30970 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72  command is under
30980 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74  stood.** as is t
30990 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a  he Oracle "/"..*
309a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
309b0 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72  e_is_command_ter
309c0 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63 68  minator(const ch
309d0 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68  ar *zLine){.  wh
309e0 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
309f0 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65 2b  ne[0]) ){ zLine+
30a00 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  +; };.  if( zLin
30a10 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c  e[0]=='/' && _al
30a20 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c  l_whitespace(&zL
30a30 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72  ine[1]) ){.    r
30a40 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
30a50 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  cle */.  }.  if(
30a60 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30   ToLower(zLine[0
30a70 5d 29 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f 77  ])=='g' && ToLow
30a80 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f  er(zLine[1])=='o
30a90 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f 61  '.         && _a
30aa0 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
30ab0 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20  Line[2]) ){.    
30ac0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51  return 1;  /* SQ
30ad0 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a  L Server */.  }.
30ae0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
30af0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
30b00 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f   if zSql is a co
30b10 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
30b20 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61  ment.  Return fa
30b30 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64  lse if it.** end
30b40 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
30b50 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  of a string lite
30b60 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63  ral or C-style c
30b70 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  omment..*/.stati
30b80 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f  c int line_is_co
30b90 6d 70 6c 65 74 65 28 63 68 61 72 20 2a 7a 53 71  mplete(char *zSq
30ba0 6c 2c 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20 20  l, int nSql){.  
30bb0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 7a 53  int rc;.  if( zS
30bc0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ql==0 ) return 1
30bd0 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d  ;.  zSql[nSql] =
30be0 20 27 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71   ';';.  zSql[nSq
30bf0 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l+1] = 0;.  rc =
30c00 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
30c10 65 28 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b  e(zSql);.  zSql[
30c20 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65 74  nSql] = 0;.  ret
30c30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30c40 20 52 75 6e 20 61 20 73 69 6e 67 6c 65 20 6c 69   Run a single li
30c50 6e 65 20 6f 66 20 53 51 4c 0a 2a 2f 0a 73 74 61  ne of SQL.*/.sta
30c60 74 69 63 20 69 6e 74 20 72 75 6e 4f 6e 65 53 71  tic int runOneSq
30c70 6c 4c 69 6e 65 28 53 68 65 6c 6c 53 74 61 74 65  lLine(ShellState
30c80 20 2a 70 2c 20 63 68 61 72 20 2a 7a 53 71 6c 2c   *p, char *zSql,
30c90 20 46 49 4c 45 20 2a 69 6e 2c 20 69 6e 74 20 73   FILE *in, int s
30ca0 74 61 72 74 6c 69 6e 65 29 7b 0a 20 20 69 6e 74  tartline){.  int
30cb0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
30cc0 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 6f 70 65  rMsg = 0;..  ope
30cd0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
30ce0 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
30cf0 2c 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68  ,SHFLG_Backslash
30d00 29 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ) ) resolve_back
30d10 73 6c 61 73 68 65 73 28 7a 53 71 6c 29 3b 0a 20  slashes(zSql);. 
30d20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20   BEGIN_TIMER;.  
30d30 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28  rc = shell_exec(
30d40 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65  p->db, zSql, she
30d50 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  ll_callback, p, 
30d60 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 45 4e 44  &zErrMsg);.  END
30d70 5f 54 49 4d 45 52 3b 0a 20 20 69 66 28 20 72 63  _TIMER;.  if( rc
30d80 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20   || zErrMsg ){. 
30d90 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b     char zPrefix[
30da0 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20 69 6e  100];.    if( in
30db0 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73  !=0 || !stdin_is
30dc0 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
30dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30de0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50  printf(sizeof(zP
30df0 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c  refix), zPrefix,
30e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30e10 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
30e20 6e 65 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20  near line %d:", 
30e30 73 74 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20  startline);.    
30e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
30e50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30e60 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
30e70 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22  Prefix, "Error:"
30e80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30e90 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20   zErrMsg!=0 ){. 
30ea0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30eb0 28 73 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c  (stderr, "%s %s\
30ec0 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72  n", zPrefix, zEr
30ed0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
30ee0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
30ef0 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73  g);.      zErrMs
30f00 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
30f10 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30f20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 20  ntf(stderr, "%s 
30f30 25 73 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20  %s\n", zPrefix, 
30f40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
30f50 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ->db));.    }.  
30f60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
30f70 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73  lse if( ShellHas
30f80 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
30f90 75 6e 74 43 68 61 6e 67 65 73 29 20 29 7b 0a 20  untChanges) ){. 
30fa0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
30fb0 3e 6f 75 74 2c 20 22 63 68 61 6e 67 65 73 3a 20  >out, "changes: 
30fc0 25 33 64 20 20 20 74 6f 74 61 6c 5f 63 68 61 6e  %3d   total_chan
30fd0 67 65 73 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ges: %d\n",.    
30fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30ff0 63 68 61 6e 67 65 73 28 70 2d 3e 64 62 29 2c 20  changes(p->db), 
31000 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
31010 61 6e 67 65 73 28 70 2d 3e 64 62 29 29 3b 0a 20  anges(p->db));. 
31020 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
31030 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e  .../*.** Read in
31040 70 75 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64  put from *in and
31050 20 70 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66   process it.  If
31060 20 2a 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70   *in==0 then inp
31070 75 74 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63  ut.** is interac
31080 74 69 76 65 20 2d 20 74 68 65 20 75 73 65 72 20  tive - the user 
31090 69 73 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e  is typing it it.
310a0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70    Otherwise, inp
310b0 75 74 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20  ut.** is coming 
310c0 66 72 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64  from a file or d
310d0 65 76 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74  evice.  A prompt
310e0 20 69 73 20 69 73 73 75 65 64 20 61 6e 64 20 68   is issued and h
310f0 69 73 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76  istory.** is sav
31100 65 64 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74  ed only if input
31110 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
31120 20 20 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73    An interrupt s
31130 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61  ignal will.** ca
31140 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
31150 20 74 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61   to exit immedia
31160 74 65 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70  tely, unless inp
31170 75 74 20 69 73 20 69 6e 74 65 72 61 63 74 69 76  ut is interactiv
31180 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
31190 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
311a0 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
311b0 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  int process_inpu
311c0 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  t(ShellState *p,
311d0 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
311e0 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b 20 20  ar *zLine = 0;  
311f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
31200 67 6c 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 2a  gle input line *
31210 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  /.  char *zSql =
31220 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
31230 20 41 63 63 75 6d 75 6c 61 74 65 64 20 53 51 4c   Accumulated SQL
31240 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   text */.  int n
31250 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
31260 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
31270 66 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 2a  f current line *
31280 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20 30  /.  int nSql = 0
31290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
312a0 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b 5d   Bytes of zSql[]
312b0 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   used */.  int n
312c0 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
312d0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
312e0 64 20 7a 53 71 6c 5b 5d 20 73 70 61 63 65 20 2a  d zSql[] space *
312f0 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 50 72 69 6f  /.  int nSqlPrio
31300 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
31310 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b 5d   Bytes of zSql[]
31320 20 75 73 65 64 20 62 79 20 70 72 69 6f 72 20 6c   used by prior l
31330 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ine */.  int rc;
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31350 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
31360 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e 74   */.  int errCnt
31370 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
31390 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e  ors seen */.  in
313a0 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
313b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
313c0 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
313d0 2f 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  /.  int startlin
313e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
313f0 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
31400 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e   start of curren
31410 74 20 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77 68  t input */..  wh
31420 69 6c 65 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c  ile( errCnt==0 |
31430 7c 20 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72  | !bail_on_error
31440 20 7c 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73 74   || (in==0 && st
31450 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
31460 76 65 29 20 29 7b 0a 20 20 20 20 66 66 6c 75 73  ve) ){.    fflus
31470 68 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7a  h(p->out);.    z
31480 4c 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74  Line = one_input
31490 5f 6c 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c  _line(in, zLine,
314a0 20 6e 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69 66   nSql>0);.    if
314b0 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  ( zLine==0 ){.  
314c0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e      /* End of in
314d0 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  put */.      if(
314e0 20 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f   in==0 && stdin_
314f0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29  is_interactive )
31500 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
31510 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31520 7d 0a 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e  }.    if( seenIn
31530 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20  terrupt ){.     
31540 20 69 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65   if( in!=0 ) bre
31550 61 6b 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e  ak;.      seenIn
31560 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  terrupt = 0;.   
31570 20 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b   }.    lineno++;
31580 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30  .    if( nSql==0
31590 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70   && _all_whitesp
315a0 61 63 65 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20  ace(zLine) ){.  
315b0 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73      if( ShellHas
315c0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63  Flag(p, SHFLG_Ec
315d0 68 6f 29 20 29 20 70 72 69 6e 74 66 28 22 25 73  ho) ) printf("%s
315e0 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20  \n", zLine);.   
315f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
31600 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
31610 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e   && zLine[0]=='.
31620 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a  ' && nSql==0 ){.
31630 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
31640 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
31650 45 63 68 6f 29 20 29 20 70 72 69 6e 74 66 28 22  Echo) ) printf("
31660 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20  %s\n", zLine);. 
31670 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74       rc = do_met
31680 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c  a_command(zLine,
31690 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   p);.      if( r
316a0 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20  c==2 ){ /* exit 
316b0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20  requested */.   
316c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
316d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
316e0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e 74  {.        errCnt
316f0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
31700 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
31710 7d 0a 20 20 20 20 69 66 28 20 6c 69 6e 65 5f 69  }.    if( line_i
31720 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e  s_command_termin
31730 61 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 6c  ator(zLine) && l
31740 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28  ine_is_complete(
31750 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a 20  zSql, nSql) ){. 
31760 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e       memcpy(zLin
31770 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d 0a  e,";",2);.    }.
31780 20 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c      nLine = strl
31790 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  en30(zLine);.   
317a0 20 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b   if( nSql+nLine+
317b0 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  2>=nAlloc ){.   
317c0 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71 6c     nAlloc = nSql
317d0 2b 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20 20  +nLine+100;.    
317e0 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63    zSql = realloc
317f0 28 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b 0a  (zSql, nAlloc);.
31800 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d        if( zSql==
31810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
31820 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31830 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
31840 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
31850 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
31860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53    }.    }.    nS
31870 71 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a  qlPrior = nSql;.
31880 20 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30 20      if( nSql==0 
31890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
318a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
318b0 4c 69 6e 65 5b 69 5d 20 26 26 20 49 73 53 70 61  Line[i] && IsSpa
318c0 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
318d0 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
318e0 74 28 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20 7a  t( nAlloc>0 && z
318f0 53 71 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sql!=0 );.      
31900 6d 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69  memcpy(zSql, zLi
31910 6e 65 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29  ne+i, nLine+1-i)
31920 3b 0a 20 20 20 20 20 20 73 74 61 72 74 6c 69 6e  ;.      startlin
31930 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  e = lineno;.    
31940 20 20 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69    nSql = nLine-i
31950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31960 20 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20     zSql[nSql++] 
31970 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d 65  = '\n';.      me
31980 6d 63 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20  mcpy(zSql+nSql, 
31990 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b  zLine, nLine+1);
319a0 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20 6e  .      nSql += n
319b0 4c 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Line;.    }.    
319c0 69 66 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e 65  if( nSql && line
319d0 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f  _contains_semico
319e0 6c 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72  lon(&zSql[nSqlPr
319f0 69 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50  ior], nSql-nSqlP
31a00 72 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20  rior).          
31a10 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
31a20 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20  _complete(zSql) 
31a30 29 7b 0a 20 20 20 20 20 20 65 72 72 43 6e 74 20  ){.      errCnt 
31a40 2b 3d 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65  += runOneSqlLine
31a50 28 70 2c 20 7a 53 71 6c 2c 20 69 6e 2c 20 73 74  (p, zSql, in, st
31a60 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20  artline);.      
31a70 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nSql = 0;.      
31a80 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20  if( p->outCount 
31a90 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  ){.        outpu
31aa0 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20  t_reset(p);.    
31ab0 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
31ac0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
31ad0 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 71 6c 20   }else if( nSql 
31ae0 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  && _all_whitespa
31af0 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20  ce(zSql) ){.    
31b00 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c    if( ShellHasFl
31b10 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
31b20 29 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e  ) ) printf("%s\n
31b30 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
31b40 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nSql = 0;.    }.
31b50 20 20 7d 0a 20 20 69 66 28 20 6e 53 71 6c 20 26    }.  if( nSql &
31b60 26 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  & !_all_whitespa
31b70 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20  ce(zSql) ){.    
31b80 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 70 2c  runOneSqlLine(p,
31b90 20 7a 53 71 6c 2c 20 69 6e 2c 20 73 74 61 72 74   zSql, in, start
31ba0 6c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20 66 72 65  line);.  }.  fre
31bb0 65 28 7a 53 71 6c 29 3b 0a 20 20 66 72 65 65 28  e(zSql);.  free(
31bc0 7a 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e  zLine);.  return
31bd0 20 65 72 72 43 6e 74 3e 30 3b 0a 7d 0a 0a 2f 2a   errCnt>0;.}../*
31be0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 61 74  .** Return a pat
31bf0 68 6e 61 6d 65 20 77 68 69 63 68 20 69 73 20 74  hname which is t
31c00 68 65 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64  he user's home d
31c10 69 72 65 63 74 6f 72 79 2e 20 20 41 0a 2a 2a 20  irectory.  A.** 
31c20 30 20 72 65 74 75 72 6e 20 69 6e 64 69 63 61 74  0 return indicat
31c30 65 73 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73  es an error of s
31c40 6f 6d 65 20 6b 69 6e 64 2e 0a 2a 2f 0a 73 74 61  ome kind..*/.sta
31c50 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 68  tic char *find_h
31c60 6f 6d 65 5f 64 69 72 28 69 6e 74 20 63 6c 65 61  ome_dir(int clea
31c70 72 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63  rFlag){.  static
31c80 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20   char *home_dir 
31c90 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 63 6c  = NULL;.  if( cl
31ca0 65 61 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 66  earFlag ){.    f
31cb0 72 65 65 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20  ree(home_dir);. 
31cc0 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 30 3b     home_dir = 0;
31cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31ce0 20 7d 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64 69   }.  if( home_di
31cf0 72 20 29 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f  r ) return home_
31d00 64 69 72 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  dir;..#if !defin
31d10 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
31d20 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
31d30 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
31d40 5f 57 43 45 29 20 5c 0a 20 20 20 20 20 26 26 20  _WCE) \.     && 
31d50 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
31d60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
31d70 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 7b 0a 20  RS_KERNEL).  {. 
31d80 20 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64     struct passwd
31d90 20 2a 70 77 65 6e 74 3b 0a 20 20 20 20 75 69 64   *pwent;.    uid
31da0 5f 74 20 75 69 64 20 3d 20 67 65 74 75 69 64 28  _t uid = getuid(
31db0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 77 65 6e  );.    if( (pwen
31dc0 74 3d 67 65 74 70 77 75 69 64 28 75 69 64 29 29  t=getpwuid(uid))
31dd0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
31de0 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 70 77 65    home_dir = pwe
31df0 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20 20 20 20  nt->pw_dir;.    
31e00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
31e10 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
31e20 5f 57 43 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f  _WCE).  /* Windo
31e30 77 73 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65  ws CE (arm-wince
31e40 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20  -mingw32ce-gcc) 
31e50 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65  does not provide
31e60 20 67 65 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a   getenv().   */.
31e70 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 2f 22    home_dir = "/"
31e80 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 64 65 66  ;.#else..#if def
31e90 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
31ea0 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
31eb0 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20   if (!home_dir) 
31ec0 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  {.    home_dir =
31ed0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
31ee0 46 49 4c 45 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  FILE");.  }.#end
31ef0 69 66 0a 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f  if..  if (!home_
31f00 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  dir) {.    home_
31f10 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  dir = getenv("HO
31f20 4d 45 22 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 64  ME");.  }..#if d
31f30 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
31f40 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
31f50 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72  .  if (!home_dir
31f60 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  ) {.    char *zD
31f70 72 69 76 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20  rive, *zPath;.  
31f80 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72    int n;.    zDr
31f90 69 76 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  ive = getenv("HO
31fa0 4d 45 44 52 49 56 45 22 29 3b 0a 20 20 20 20 7a  MEDRIVE");.    z
31fb0 50 61 74 68 20 3d 20 67 65 74 65 6e 76 28 22 48  Path = getenv("H
31fc0 4f 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20 69  OMEPATH");.    i
31fd0 66 28 20 7a 44 72 69 76 65 20 26 26 20 7a 50 61  f( zDrive && zPa
31fe0 74 68 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  th ){.      n = 
31ff0 73 74 72 6c 65 6e 33 30 28 7a 44 72 69 76 65 29  strlen30(zDrive)
32000 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 50 61 74   + strlen30(zPat
32010 68 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f  h) + 1;.      ho
32020 6d 65 5f 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28  me_dir = malloc(
32030 20 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20   n );.      if( 
32040 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 20 72 65  home_dir==0 ) re
32050 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71  turn 0;.      sq
32060 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
32070 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25  , home_dir, "%s%
32080 73 22 2c 20 7a 44 72 69 76 65 2c 20 7a 50 61 74  s", zDrive, zPat
32090 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  h);.      return
320a0 20 68 6f 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d   home_dir;.    }
320b0 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
320c0 22 63 3a 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64  "c:\\";.  }.#end
320d0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f  if..#endif /* !_
320e0 57 49 4e 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20  WIN32_WCE */..  
320f0 69 66 28 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a  if( home_dir ){.
32100 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
32110 65 6e 33 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b  en30(home_dir) +
32120 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   1;.    char *z 
32130 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  = malloc( n );. 
32140 20 20 20 69 66 28 20 7a 20 29 20 6d 65 6d 63 70     if( z ) memcp
32150 79 28 7a 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e  y(z, home_dir, n
32160 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  );.    home_dir 
32170 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = z;.  }..  retu
32180 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a  rn home_dir;.}..
32190 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
321a0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67   from the file g
321b0 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63  iven by sqliterc
321c0 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69  _override.  Or i
321d0 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65  f that.** parame
321e0 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b  ter is NULL, tak
321f0 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e  e input from ~/.
32200 73 71 6c 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52  sqliterc.**.** R
32210 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
32220 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
32230 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63  static void proc
32240 65 73 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20  ess_sqliterc(.  
32250 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20  ShellState *p,  
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32270 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
32280 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74   data */.  const
32290 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f   char *sqliterc_
322a0 6f 76 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61  override   /* Na
322b0 6d 65 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c  me of config fil
322c0 65 2e 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64  e. NULL to use d
322d0 65 66 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63  efault */.){.  c
322e0 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20  har *home_dir = 
322f0 4e 55 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  NULL;.  const ch
32300 61 72 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73  ar *sqliterc = s
32310 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65  qliterc_override
32320 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d  ;.  char *zBuf =
32330 20 30 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d   0;.  FILE *in =
32340 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 73 71   NULL;..  if (sq
32350 6c 69 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29 20  literc == NULL) 
32360 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  {.    home_dir =
32370 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 30   find_home_dir(0
32380 29 3b 0a 20 20 20 20 69 66 28 20 68 6f 6d 65 5f  );.    if( home_
32390 64 69 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dir==0 ){.      
323a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
323b0 72 2c 20 22 2d 2d 20 77 61 72 6e 69 6e 67 3a 20  r, "-- warning: 
323c0 63 61 6e 6e 6f 74 20 66 69 6e 64 20 68 6f 6d 65  cannot find home
323d0 20 64 69 72 65 63 74 6f 72 79 3b 22 0a 20 20 20   directory;".   
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323f0 20 20 20 22 20 63 61 6e 6e 6f 74 20 72 65 61 64     " cannot read
32400 20 7e 2f 2e 73 71 6c 69 74 65 72 63 5c 6e 22 29   ~/.sqliterc\n")
32410 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
32420 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32430 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
32440 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74      zBuf = sqlit
32450 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e  e3_mprintf("%s/.
32460 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f 64  sqliterc",home_d
32470 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 72  ir);.    sqliter
32480 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  c = zBuf;.  }.  
32490 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69 74  in = fopen(sqlit
324a0 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  erc,"rb");.  if(
324b0 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 73   in ){.    if( s
324c0 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
324d0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ive ){.      utf
324e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
324f0 22 2d 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f  "-- Loading reso
32500 75 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22  urces from %s\n"
32510 2c 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20  ,sqliterc);.    
32520 7d 0a 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e  }.    process_in
32530 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20 20 66  put(p,in);.    f
32540 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20  close(in);.  }. 
32550 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
32560 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  uf);.}../*.** Sh
32570 6f 77 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d  ow available com
32580 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
32590 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  s.*/.static cons
325a0 74 20 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b  t char zOptions[
325b0 5d 20 3d 0a 20 20 22 20 20 20 2d 61 73 63 69 69  ] =.  "   -ascii
325c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
325d0 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74  et output mode t
325e0 6f 20 27 61 73 63 69 69 27 5c 6e 22 0a 20 20 22  o 'ascii'\n".  "
325f0 20 20 20 2d 62 61 69 6c 20 20 20 20 20 20 20 20     -bail        
32600 20 20 20 20 20 20 20 20 73 74 6f 70 20 61 66 74          stop aft
32610 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72  er hitting an er
32620 72 6f 72 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61  ror\n".  "   -ba
32630 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
32640 20 20 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f    force batch I/
32650 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75  O\n".  "   -colu
32660 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mn              
32670 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
32680 74 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20  to 'column'\n". 
32690 20 22 20 20 20 2d 63 6d 64 20 43 4f 4d 4d 41 4e   "   -cmd COMMAN
326a0 44 20 20 20 20 20 20 20 20 20 72 75 6e 20 5c 22  D         run \"
326b0 43 4f 4d 4d 41 4e 44 5c 22 20 62 65 66 6f 72 65  COMMAND\" before
326c0 20 72 65 61 64 69 6e 67 20 73 74 64 69 6e 5c 6e   reading stdin\n
326d0 22 0a 20 20 22 20 20 20 2d 63 73 76 20 20 20 20  ".  "   -csv    
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
326f0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
32700 27 63 73 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d  'csv'\n".  "   -
32710 65 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 20  echo            
32720 20 20 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e      print comman
32730 64 73 20 62 65 66 6f 72 65 20 65 78 65 63 75 74  ds before execut
32740 69 6f 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e  ion\n".  "   -in
32750 69 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20  it FILENAME     
32760 20 20 72 65 61 64 2f 70 72 6f 63 65 73 73 20 6e    read/process n
32770 61 6d 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20 22  amed file\n".  "
32780 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20     -[no]header  
32790 20 20 20 20 20 20 20 20 74 75 72 6e 20 68 65 61          turn hea
327a0 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  ders on or off\n
327b0 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ".#if defined(SQ
327c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
327d0 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  YS3) || defined(
327e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
327f0 4d 53 59 53 35 29 0a 20 20 22 20 20 20 2d 68 65  MSYS5).  "   -he
32800 61 70 20 53 49 5a 45 20 20 20 20 20 20 20 20 20  ap SIZE         
32810 20 20 53 69 7a 65 20 6f 66 20 68 65 61 70 20 66    Size of heap f
32820 6f 72 20 6d 65 6d 73 79 73 33 20 6f 72 20 6d 65  or memsys3 or me
32830 6d 73 79 73 35 5c 6e 22 0a 23 65 6e 64 69 66 0a  msys5\n".#endif.
32840 20 20 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20    "   -help     
32850 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20             show 
32860 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a  this message\n".
32870 20 20 22 20 20 20 2d 68 74 6d 6c 20 20 20 20 20    "   -html     
32880 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
32890 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 48 54  utput mode to HT
328a0 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74  ML\n".  "   -int
328b0 65 72 61 63 74 69 76 65 20 20 20 20 20 20 20 20  eractive        
328c0 20 66 6f 72 63 65 20 69 6e 74 65 72 61 63 74 69   force interacti
328d0 76 65 20 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20  ve I/O\n".  "   
328e0 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  -line           
328f0 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
32900 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e  mode to 'line'\n
32910 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20  ".  "   -list   
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
32930 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
32940 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20  'list'\n".  "   
32950 2d 6c 6f 6f 6b 61 73 69 64 65 20 53 49 5a 45 20  -lookaside SIZE 
32960 4e 20 20 20 20 75 73 65 20 4e 20 65 6e 74 72 69  N    use N entri
32970 65 73 20 6f 66 20 53 5a 20 62 79 74 65 73 20 66  es of SZ bytes f
32980 6f 72 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  or lookaside mem
32990 6f 72 79 5c 6e 22 0a 20 20 22 20 20 20 2d 6d 6d  ory\n".  "   -mm
329a0 61 70 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  ap N            
329b0 20 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73    default mmap s
329c0 69 7a 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22 0a  ize set to N\n".
329d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
329e0 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20  ABLE_MULTIPLEX. 
329f0 20 22 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78 20   "   -multiplex 
32a00 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65            enable
32a10 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f 72   the multiplexor
32a20 20 56 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a 20   VFS\n".#endif. 
32a30 20 22 20 20 20 2d 6e 65 77 6c 69 6e 65 20 53 45   "   -newline SE
32a40 50 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75  P         set ou
32a50 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
32a60 6f 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 5c 5c  or. Default: '\\
32a70 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c  n'\n".  "   -nul
32a80 6c 76 61 6c 75 65 20 54 45 58 54 20 20 20 20 20  lvalue TEXT     
32a90 20 73 65 74 20 74 65 78 74 20 73 74 72 69 6e 67   set text string
32aa0 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73   for NULL values
32ab0 2e 20 44 65 66 61 75 6c 74 20 27 27 5c 6e 22 0a  . Default ''\n".
32ac0 20 20 22 20 20 20 2d 70 61 67 65 63 61 63 68 65    "   -pagecache
32ad0 20 53 49 5a 45 20 4e 20 20 20 20 75 73 65 20 4e   SIZE N    use N
32ae0 20 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74   slots of SZ byt
32af0 65 73 20 65 61 63 68 20 66 6f 72 20 70 61 67 65  es each for page
32b00 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 5c 6e 22   cache memory\n"
32b10 0a 20 20 22 20 20 20 2d 71 75 6f 74 65 20 20 20  .  "   -quote   
32b20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
32b30 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
32b40 71 75 6f 74 65 27 5c 6e 22 0a 20 20 22 20 20 20  quote'\n".  "   
32b50 2d 73 65 70 61 72 61 74 6f 72 20 53 45 50 20 20  -separator SEP  
32b60 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
32b70 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
32b80 2e 20 44 65 66 61 75 6c 74 3a 20 27 7c 27 5c 6e  . Default: '|'\n
32b90 22 0a 20 20 22 20 20 20 2d 73 74 61 74 73 20 20  ".  "   -stats  
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
32bb0 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20  nt memory stats 
32bc0 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61  before each fina
32bd0 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20 20 2d 76  lize\n".  "   -v
32be0 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
32bf0 20 20 20 73 68 6f 77 20 53 51 4c 69 74 65 20 76     show SQLite v
32c00 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22 20 20 20  ersion\n".  "   
32c10 2d 76 66 73 20 4e 41 4d 45 20 20 20 20 20 20 20  -vfs NAME       
32c20 20 20 20 20 20 75 73 65 20 4e 41 4d 45 20 61 73       use NAME as
32c30 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
32c40 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54  \n".#ifdef SQLIT
32c50 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41 43  E_ENABLE_VFSTRAC
32c60 45 0a 20 20 22 20 20 20 2d 76 66 73 74 72 61 63  E.  "   -vfstrac
32c70 65 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 61  e            ena
32c80 62 6c 65 20 74 72 61 63 69 6e 67 20 6f 66 20 61  ble tracing of a
32c90 6c 6c 20 56 46 53 20 63 61 6c 6c 73 5c 6e 22 0a  ll VFS calls\n".
32ca0 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74 69 63 20  #endif.;.static 
32cb0 76 6f 69 64 20 75 73 61 67 65 28 69 6e 74 20 73  void usage(int s
32cc0 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20 75 74  howDetail){.  ut
32cd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32ce0 2c 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a 20  ,.      "Usage: 
32cf0 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c  %s [OPTIONS] FIL
32d00 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 0a 20  ENAME [SQL]\n". 
32d10 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20 69       "FILENAME i
32d20 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
32d30 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
32d40 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73 65  . A new database
32d50 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a 20   is created\n". 
32d60 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69 6c       "if the fil
32d70 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69  e does not previ
32d80 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22 2c  ously exist.\n",
32d90 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20 73   Argv0);.  if( s
32da0 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20 20  howDetail ){.   
32db0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
32dc0 65 72 72 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e  err, "OPTIONS in
32dd0 63 6c 75 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70  clude:\n%s", zOp
32de0 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  tions);.  }else{
32df0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
32e00 73 74 64 65 72 72 2c 20 22 55 73 65 20 74 68 65  stderr, "Use the
32e10 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66 6f   -help option fo
32e20 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
32e30 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  ormation\n");.  
32e40 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  }.  exit(1);.}..
32e50 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
32e60 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72   the state infor
32e70 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a 2a  mation in data.*
32e80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
32e90 69 6e 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61  in_init(ShellSta
32ea0 74 65 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65  te *data) {.  me
32eb0 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73 69  mset(data, 0, si
32ec0 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20 20  zeof(*data));.  
32ed0 64 61 74 61 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65  data->normalMode
32ee0 20 3d 20 64 61 74 61 2d 3e 63 4d 6f 64 65 20 3d   = data->cMode =
32ef0 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f   data->mode = MO
32f00 44 45 5f 4c 69 73 74 3b 0a 20 20 64 61 74 61 2d  DE_List;.  data-
32f10 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31  >autoExplain = 1
32f20 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d  ;.  memcpy(data-
32f30 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 53 45  >colSeparator,SE
32f40 50 5f 43 6f 6c 75 6d 6e 2c 20 32 29 3b 0a 20 20  P_Column, 2);.  
32f50 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e 72 6f 77  memcpy(data->row
32f60 53 65 70 61 72 61 74 6f 72 2c 53 45 50 5f 52 6f  Separator,SEP_Ro
32f70 77 2c 20 32 29 3b 0a 20 20 64 61 74 61 2d 3e 73  w, 2);.  data->s
32f80 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
32f90 20 64 61 74 61 2d 3e 73 68 65 6c 6c 46 6c 67 73   data->shellFlgs
32fa0 20 3d 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   = SHFLG_Lookasi
32fb0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  de;.  sqlite3_co
32fc0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
32fd0 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20 20 73 71  IG_URI, 1);.  sq
32fe0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
32ff0 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
33000 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74 61 29 3b  shellLog, data);
33010 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
33020 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
33030 4d 55 4c 54 49 54 48 52 45 41 44 29 3b 0a 20 20  MULTITHREAD);.  
33040 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33050 28 73 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d  (sizeof(mainProm
33060 70 74 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c  pt), mainPrompt,
33070 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73  "sqlite> ");.  s
33080 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33090 73 69 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50  sizeof(continueP
330a0 72 6f 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65  rompt), continue
330b0 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20  Prompt,"   ...> 
330c0 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ");.}../*.** Out
330d0 70 75 74 20 74 65 78 74 20 74 6f 20 74 68 65 20  put text to the 
330e0 63 6f 6e 73 6f 6c 65 20 69 6e 20 61 20 66 6f 6e  console in a fon
330f0 74 20 74 68 61 74 20 61 74 74 72 61 63 74 73 20  t that attracts 
33100 65 78 74 72 61 20 61 74 74 65 6e 74 69 6f 6e 2e  extra attention.
33110 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  .*/.#ifdef _WIN3
33120 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  2.static void pr
33130 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
33140 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 48 41  ar *zText){.  HA
33150 4e 44 4c 45 20 6f 75 74 20 3d 20 47 65 74 53 74  NDLE out = GetSt
33160 64 48 61 6e 64 6c 65 28 53 54 44 5f 4f 55 54 50  dHandle(STD_OUTP
33170 55 54 5f 48 41 4e 44 4c 45 29 3b 0a 20 20 43 4f  UT_HANDLE);.  CO
33180 4e 53 4f 4c 45 5f 53 43 52 45 45 4e 5f 42 55 46  NSOLE_SCREEN_BUF
33190 46 45 52 5f 49 4e 46 4f 20 64 65 66 61 75 6c 74  FER_INFO default
331a0 53 63 72 65 65 6e 49 6e 66 6f 3b 0a 20 20 47 65  ScreenInfo;.  Ge
331b0 74 43 6f 6e 73 6f 6c 65 53 63 72 65 65 6e 42 75  tConsoleScreenBu
331c0 66 66 65 72 49 6e 66 6f 28 6f 75 74 2c 20 26 64  fferInfo(out, &d
331d0 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e 66 6f  efaultScreenInfo
331e0 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65 54  );.  SetConsoleT
331f0 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75 74  extAttribute(out
33200 2c 0a 20 20 20 20 20 20 20 20 20 46 4f 52 45 47  ,.         FOREG
33210 52 4f 55 4e 44 5f 52 45 44 7c 46 4f 52 45 47 52  ROUND_RED|FOREGR
33220 4f 55 4e 44 5f 49 4e 54 45 4e 53 49 54 59 0a 20  OUND_INTENSITY. 
33230 20 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73   );.  printf("%s
33240 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 53 65 74  ", zText);.  Set
33250 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72 69  ConsoleTextAttri
33260 62 75 74 65 28 6f 75 74 2c 20 64 65 66 61 75 6c  bute(out, defaul
33270 74 53 63 72 65 65 6e 49 6e 66 6f 2e 77 41 74 74  tScreenInfo.wAtt
33280 72 69 62 75 74 65 73 29 3b 0a 7d 0a 23 65 6c 73  ributes);.}.#els
33290 65 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  e.static void pr
332a0 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
332b0 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 70 72  ar *zText){.  pr
332c0 69 6e 74 66 28 22 5c 30 33 33 5b 31 6d 25 73 5c  intf("\033[1m%s\
332d0 30 33 33 5b 30 6d 22 2c 20 7a 54 65 78 74 29 3b  033[0m", zText);
332e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
332f0 20 47 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e   Get the argumen
33300 74 20 74 6f 20 61 6e 20 2d 2d 6f 70 74 69 6f 6e  t to an --option
33310 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  .  Throw an erro
33320 72 20 61 6e 64 20 64 69 65 20 69 66 20 6e 6f 20  r and die if no 
33330 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
33340 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  vailable..*/.sta
33350 74 69 63 20 63 68 61 72 20 2a 63 6d 64 6c 69 6e  tic char *cmdlin
33360 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 69  e_option_value(i
33370 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
33380 61 72 67 76 2c 20 69 6e 74 20 69 29 7b 0a 20 20  argv, int i){.  
33390 69 66 28 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20  if( i==argc ){. 
333a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
333b0 74 64 65 72 72 2c 20 22 25 73 3a 20 45 72 72 6f  tderr, "%s: Erro
333c0 72 3a 20 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r: missing argum
333d0 65 6e 74 20 74 6f 20 25 73 5c 6e 22 2c 0a 20 20  ent to %s\n",.  
333e0 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b 30            argv[0
333f0 5d 2c 20 61 72 67 76 5b 61 72 67 63 2d 31 5d 29  ], argv[argc-1])
33400 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
33410 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 67 76   }.  return argv
33420 5b 69 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  [i];.}..#ifndef 
33430 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f  SQLITE_SHELL_IS_
33440 55 54 46 38 0a 23 20 20 69 66 20 28 64 65 66 69  UTF8.#  if (defi
33450 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
33460 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
33470 26 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  & defined(_MSC_V
33480 45 52 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  ER).#    define 
33490 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f  SQLITE_SHELL_IS_
334a0 55 54 46 38 20 20 20 20 20 20 20 20 20 20 28 30  UTF8          (0
334b0 29 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  ).#  else.#    d
334c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 48 45  efine SQLITE_SHE
334d0 4c 4c 5f 49 53 5f 55 54 46 38 20 20 20 20 20 20  LL_IS_UTF8      
334e0 20 20 20 20 28 31 29 0a 23 20 20 65 6e 64 69 66      (1).#  endif
334f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
33500 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f 55 54 46  ITE_SHELL_IS_UTF
33510 38 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45  8.int SQLITE_CDE
33520 43 4c 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  CL main(int argc
33530 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
33540 23 65 6c 73 65 0a 69 6e 74 20 53 51 4c 49 54 45  #else.int SQLITE
33550 5f 43 44 45 43 4c 20 77 6d 61 69 6e 28 69 6e 74  _CDECL wmain(int
33560 20 61 72 67 63 2c 20 77 63 68 61 72 5f 74 20 2a   argc, wchar_t *
33570 2a 77 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  *wargv){.  char 
33580 2a 2a 61 72 67 76 3b 0a 23 65 6e 64 69 66 0a 20  **argv;.#endif. 
33590 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
335a0 20 30 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   0;.  ShellState
335b0 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63   data;.  const c
335c0 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c 65 20 3d  har *zInitFile =
335d0 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
335e0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nt rc = 0;.  int
335f0 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62 20   warnInmemoryDb 
33600 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 53  = 0;.  int readS
33610 74 64 69 6e 20 3d 20 31 3b 0a 20 20 69 6e 74 20  tdin = 1;.  int 
33620 6e 43 6d 64 20 3d 20 30 3b 0a 20 20 63 68 61 72  nCmd = 0;.  char
33630 20 2a 2a 61 7a 43 6d 64 20 3d 20 30 3b 0a 0a 20   **azCmd = 0;.. 
33640 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 73   setBinaryMode(s
33650 74 64 69 6e 2c 20 30 29 3b 0a 20 20 73 65 74 76  tdin, 0);.  setv
33660 62 75 66 28 73 74 64 65 72 72 2c 20 30 2c 20 5f  buf(stderr, 0, _
33670 49 4f 4e 42 46 2c 20 30 29 3b 20 2f 2a 20 4d 61  IONBF, 0); /* Ma
33680 6b 65 20 73 75 72 65 20 73 74 64 65 72 72 20 69  ke sure stderr i
33690 73 20 75 6e 62 75 66 66 65 72 65 64 20 2a 2f 0a  s unbuffered */.
336a0 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
336b0 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79 28  active = isatty(
336c0 30 29 3b 0a 20 20 73 74 64 6f 75 74 5f 69 73 5f  0);.  stdout_is_
336d0 63 6f 6e 73 6f 6c 65 20 3d 20 69 73 61 74 74 79  console = isatty
336e0 28 31 29 3b 0a 0a 23 69 66 20 55 53 45 5f 53 59  (1);..#if USE_SY
336f0 53 54 45 4d 5f 53 51 4c 49 54 45 2b 30 21 3d 31  STEM_SQLITE+0!=1
33700 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 73  .  if( strncmp(s
33710 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
33720 29 2c 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f  ),SQLITE_SOURCE_
33730 49 44 2c 36 30 29 21 3d 30 20 29 7b 0a 20 20 20  ID,60)!=0 ){.   
33740 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33750 65 72 72 2c 20 22 53 51 4c 69 74 65 20 68 65 61  err, "SQLite hea
33760 64 65 72 20 61 6e 64 20 73 6f 75 72 63 65 20 76  der and source v
33770 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 5c  ersion mismatch\
33780 6e 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20 20  n%s\n%s\n",.    
33790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
337a0 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c 49  sourceid(), SQLI
337b0 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a 20  TE_SOURCE_ID);. 
337c0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
337d0 23 65 6e 64 69 66 0a 20 20 6d 61 69 6e 5f 69 6e  #endif.  main_in
337e0 69 74 28 26 64 61 74 61 29 3b 0a 23 69 66 20 21  it(&data);.#if !
337f0 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f  SQLITE_SHELL_IS_
33800 55 54 46 38 0a 20 20 73 71 6c 69 74 65 33 5f 69  UTF8.  sqlite3_i
33810 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 61  nitialize();.  a
33820 72 67 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rgv = sqlite3_ma
33830 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 61 72  lloc64(sizeof(ar
33840 67 76 5b 30 5d 29 2a 61 72 67 63 29 3b 0a 20 20  gv[0])*argc);.  
33850 69 66 28 20 61 72 67 76 3d 3d 30 20 29 7b 0a 20  if( argv==0 ){. 
33860 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33870 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65  derr, "out of me
33880 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mory\n");.    ex
33890 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(1);.  }.  for
338a0 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
338b0 2b 29 7b 0a 20 20 20 20 61 72 67 76 5b 69 5d 20  +){.    argv[i] 
338c0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
338d0 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
338e0 77 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  wargv[i]);.    i
338f0 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b  f( argv[i]==0 ){
33900 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33910 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
33920 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
33930 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
33940 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
33950 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31 20  assert( argc>=1 
33960 26 26 20 61 72 67 76 20 26 26 20 61 72 67 76 5b  && argv && argv[
33970 30 5d 20 29 3b 0a 20 20 41 72 67 76 30 20 3d 20  0] );.  Argv0 = 
33980 61 72 67 76 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 4d  argv[0];..  /* M
33990 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
339a0 20 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20   a valid signal 
339b0 68 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62  handler early, b
339c0 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20  efore anything. 
339d0 20 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65   ** else is done
339e0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49  ..  */.#ifdef SI
339f0 47 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49  GINT.  signal(SI
33a00 47 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f  GINT, interrupt_
33a10 68 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66  handler);.#endif
33a20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33a30 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f  SHELL_DBNAME_PRO
33a40 43 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 49 66 20  C.  {.    /* If 
33a50 74 68 65 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c  the SQLITE_SHELL
33a60 5f 44 42 4e 41 4d 45 5f 50 52 4f 43 20 6d 61 63  _DBNAME_PROC mac
33a70 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ro is defined, t
33a80 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61  hen it is the na
33a90 6d 65 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 43  me.    ** of a C
33aa0 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 77  -function that w
33ab0 69 6c 6c 20 70 72 6f 76 69 64 65 20 74 68 65 20  ill provide the 
33ac0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33ad0 62 61 73 65 20 66 69 6c 65 2e 20 20 55 73 65 0a  base file.  Use.
33ae0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6d 70      ** this comp
33af0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
33b00 74 6f 20 65 6d 62 65 64 20 74 68 69 73 20 73 68  to embed this sh
33b10 65 6c 6c 20 70 72 6f 67 72 61 6d 20 69 6e 20 6c  ell program in l
33b20 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 61 70 70  arger.    ** app
33b30 6c 69 63 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  lications. */.  
33b40 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 53 51    extern void SQ
33b50 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d  LITE_SHELL_DBNAM
33b60 45 5f 50 52 4f 43 28 63 6f 6e 73 74 20 63 68 61  E_PROC(const cha
33b70 72 2a 2a 29 3b 0a 20 20 20 20 53 51 4c 49 54 45  r**);.    SQLITE
33b80 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52  _SHELL_DBNAME_PR
33b90 4f 43 28 26 64 61 74 61 2e 7a 44 62 46 69 6c 65  OC(&data.zDbFile
33ba0 6e 61 6d 65 29 3b 0a 20 20 20 20 77 61 72 6e 49  name);.    warnI
33bb0 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b 0a 20  nmemoryDb = 0;. 
33bc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
33bd0 44 6f 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61  Do an initial pa
33be0 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ss through the c
33bf0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
33c00 6d 65 6e 74 20 74 6f 20 6c 6f 63 61 74 65 0a 20  ment to locate. 
33c10 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   ** the name of 
33c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33c30 65 2c 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  e, the name of t
33c40 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
33c50 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 74 68 65  n file,.  ** the
33c60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 74   size of the alt
33c70 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20  ernative malloc 
33c80 68 65 61 70 2c 0a 20 20 2a 2a 20 61 6e 64 20 74  heap,.  ** and t
33c90 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64  he first command
33ca0 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20 2a   to execute..  *
33cb0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  /.  for(i=1; i<a
33cc0 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
33cd0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 7a 20 3d 20  har *z;.    z = 
33ce0 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
33cf0 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[0]!='-' ){.  
33d00 20 20 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62      if( data.zDb
33d10 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
33d20 20 20 20 20 20 20 20 64 61 74 61 2e 7a 44 62 46         data.zDbF
33d30 69 6c 65 6e 61 6d 65 20 3d 20 7a 3b 0a 20 20 20  ilename = z;.   
33d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33d50 20 20 2f 2a 20 45 78 63 65 73 73 73 20 61 72 67    /* Excesss arg
33d60 75 6d 65 6e 74 73 20 61 72 65 20 69 6e 74 65 72  uments are inter
33d70 70 72 65 74 65 64 20 61 73 20 53 51 4c 20 28 6f  preted as SQL (o
33d80 72 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 73 29 20  r dot-commands) 
33d90 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  and.        ** m
33da0 65 61 6e 20 74 68 61 74 20 6e 6f 74 68 69 6e 67  ean that nothing
33db0 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74   is read from st
33dc0 64 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  din */.        r
33dd0 65 61 64 53 74 64 69 6e 20 3d 20 30 3b 0a 20 20  eadStdin = 0;.  
33de0 20 20 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20 20        nCmd++;.  
33df0 20 20 20 20 20 20 61 7a 43 6d 64 20 3d 20 72 65        azCmd = re
33e00 61 6c 6c 6f 63 28 61 7a 43 6d 64 2c 20 73 69 7a  alloc(azCmd, siz
33e10 65 6f 66 28 61 7a 43 6d 64 5b 30 5d 29 2a 6e 43  eof(azCmd[0])*nC
33e20 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  md);.        if(
33e30 20 61 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20   azCmd==0 ){.   
33e40 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
33e50 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
33e60 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
33e70 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
33e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33e90 20 20 20 61 7a 43 6d 64 5b 6e 43 6d 64 2d 31 5d     azCmd[nCmd-1]
33ea0 20 3d 20 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = z;.      }.  
33eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d    }.    if( z[1]
33ec0 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
33ed0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
33ee0 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 0a 20  separator")==0. 
33ef0 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c      || strcmp(z,
33f00 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30  "-nullvalue")==0
33f10 0a 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28  .     || strcmp(
33f20 7a 2c 22 2d 6e 65 77 6c 69 6e 65 22 29 3d 3d 30  z,"-newline")==0
33f30 0a 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28  .     || strcmp(
33f40 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30 0a 20 20 20  z,"-cmd")==0.   
33f50 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64 29   ){.      (void)
33f60 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
33f70 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c  alue(argc, argv,
33f80 20 2b 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ++i);.    }else
33f90 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
33fa0 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  init")==0 ){.   
33fb0 20 20 20 7a 49 6e 69 74 46 69 6c 65 20 3d 20 63     zInitFile = c
33fc0 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
33fd0 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20  lue(argc, argv, 
33fe0 2b 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ++i);.    }else 
33ff0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62  if( strcmp(z,"-b
34000 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
34010 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 68     /* Need to ch
34020 65 63 6b 20 66 6f 72 20 62 61 74 63 68 20 6d 6f  eck for batch mo
34030 64 65 20 68 65 72 65 20 74 6f 20 73 6f 20 77 65  de here to so we
34040 20 63 61 6e 20 61 76 6f 69 64 20 70 72 69 6e 74   can avoid print
34050 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 66  ing.      ** inf
34060 6f 72 6d 61 74 69 6f 6e 61 6c 20 6d 65 73 73 61  ormational messa
34070 67 65 73 20 28 6c 69 6b 65 20 66 72 6f 6d 20 70  ges (like from p
34080 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 29  rocess_sqliterc)
34090 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
340a0 20 77 65 20 64 6f 20 74 68 65 20 61 63 74 75 61   we do the actua
340b0 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  l processing of 
340c0 61 72 67 75 6d 65 6e 74 73 20 6c 61 74 65 72 20  arguments later 
340d0 69 6e 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73  in a second pass
340e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
340f0 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
34100 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ctive = 0;.    }
34110 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
34120 7a 2c 22 2d 68 65 61 70 22 29 3d 3d 30 20 29 7b  z,"-heap")==0 ){
34130 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
34140 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
34150 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
34160 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
34170 53 59 53 35 29 0a 20 20 20 20 20 20 63 6f 6e 73  SYS5).      cons
34180 74 20 63 68 61 72 20 2a 7a 53 69 7a 65 3b 0a 20  t char *zSize;. 
34190 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
341a0 36 34 20 73 7a 48 65 61 70 3b 0a 0a 20 20 20 20  64 szHeap;..    
341b0 20 20 7a 53 69 7a 65 20 3d 20 63 6d 64 6c 69 6e    zSize = cmdlin
341c0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
341d0 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b  rgc, argv, ++i);
341e0 0a 20 20 20 20 20 20 73 7a 48 65 61 70 20 3d 20  .      szHeap = 
341f0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 53 69  integerValue(zSi
34200 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ze);.      if( s
34210 7a 48 65 61 70 3e 30 78 37 66 66 66 30 30 30 30  zHeap>0x7fff0000
34220 20 29 20 73 7a 48 65 61 70 20 3d 20 30 78 37 66   ) szHeap = 0x7f
34230 66 66 30 30 30 30 3b 0a 20 20 20 20 20 20 73 71  ff0000;.      sq
34240 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
34250 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 2c  ITE_CONFIG_HEAP,
34260 20 6d 61 6c 6c 6f 63 28 28 69 6e 74 29 73 7a 48   malloc((int)szH
34270 65 61 70 29 2c 20 28 69 6e 74 29 73 7a 48 65 61  eap), (int)szHea
34280 70 2c 20 36 34 29 3b 0a 23 65 6c 73 65 0a 20 20  p, 64);.#else.  
34290 20 20 20 20 28 76 6f 69 64 29 63 6d 64 6c 69 6e      (void)cmdlin
342a0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
342b0 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b  rgc, argv, ++i);
342c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
342d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
342e0 2d 70 61 67 65 63 61 63 68 65 22 29 3d 3d 30 20  -pagecache")==0 
342f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c 20  ){.      int n, 
34300 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 28  sz;.      sz = (
34310 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
34320 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  (cmdline_option_
34330 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
34340 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ++i));.      if(
34350 20 73 7a 3e 37 30 30 30 30 20 29 20 73 7a 20 3d   sz>70000 ) sz =
34360 20 37 30 30 30 30 3b 0a 20 20 20 20 20 20 69 66   70000;.      if
34370 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d 20 30 3b  ( sz<0 ) sz = 0;
34380 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  .      n = (int)
34390 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64  integerValue(cmd
343a0 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
343b0 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29  e(argc,argv,++i)
343c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
343d0 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
343e0 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2c  ONFIG_PAGECACHE,
343f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34400 20 20 20 20 20 28 6e 3e 30 20 26 26 20 73 7a 3e       (n>0 && sz>
34410 30 29 20 3f 20 6d 61 6c 6c 6f 63 28 6e 2a 73 7a  0) ? malloc(n*sz
34420 29 20 3a 20 30 2c 20 73 7a 2c 20 6e 29 3b 0a 20  ) : 0, sz, n);. 
34430 20 20 20 20 20 64 61 74 61 2e 73 68 65 6c 6c 46       data.shellF
34440 6c 67 73 20 7c 3d 20 53 48 46 4c 47 5f 50 61 67  lgs |= SHFLG_Pag
34450 65 63 61 63 68 65 3b 0a 20 20 20 20 7d 65 6c 73  ecache;.    }els
34460 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
34470 2d 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d 30 20  -lookaside")==0 
34480 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c 20  ){.      int n, 
34490 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 28  sz;.      sz = (
344a0 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
344b0 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  (cmdline_option_
344c0 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
344d0 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ++i));.      if(
344e0 20 73 7a 3c 30 20 29 20 73 7a 20 3d 20 30 3b 0a   sz<0 ) sz = 0;.
344f0 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 69        n = (int)i
34500 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c  ntegerValue(cmdl
34510 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65  ine_option_value
34520 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29  (argc,argv,++i))
34530 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20  ;.      if( n<0 
34540 29 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ) n = 0;.      s
34550 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
34560 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  LITE_CONFIG_LOOK
34570 41 53 49 44 45 2c 20 73 7a 2c 20 6e 29 3b 0a 20  ASIDE, sz, n);. 
34580 20 20 20 20 20 69 66 28 20 73 7a 2a 6e 3d 3d 30       if( sz*n==0
34590 20 29 20 64 61 74 61 2e 73 68 65 6c 6c 46 6c 67   ) data.shellFlg
345a0 73 20 26 3d 20 7e 53 48 46 4c 47 5f 4c 6f 6f 6b  s &= ~SHFLG_Look
345b0 61 73 69 64 65 3b 0a 23 69 66 64 65 66 20 53 51  aside;.#ifdef SQ
345c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54  LITE_ENABLE_VFST
345d0 52 41 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  RACE.    }else i
345e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66  f( strcmp(z,"-vf
345f0 73 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20  strace")==0 ){. 
34600 20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20       extern int 
34610 76 66 73 74 72 61 63 65 5f 72 65 67 69 73 74 65  vfstrace_registe
34620 72 28 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 73  r(.         cons
34630 74 20 63 68 61 72 20 2a 7a 54 72 61 63 65 4e 61  t char *zTraceNa
34640 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 63 6f 6e  me,.         con
34650 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 56 66 73  st char *zOldVfs
34660 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 69  Name,.         i
34670 6e 74 20 28 2a 78 4f 75 74 29 28 63 6f 6e 73 74  nt (*xOut)(const
34680 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29 2c 0a 20   char*,void*),. 
34690 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4f          void *pO
346a0 75 74 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20  utArg,.         
346b0 69 6e 74 20 6d 61 6b 65 44 65 66 61 75 6c 74 0a  int makeDefault.
346c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 76        );.      v
346d0 66 73 74 72 61 63 65 5f 72 65 67 69 73 74 65 72  fstrace_register
346e0 28 22 74 72 61 63 65 22 2c 30 2c 28 69 6e 74 28  ("trace",0,(int(
346f0 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76  *)(const char*,v
34700 6f 69 64 2a 29 29 66 70 75 74 73 2c 73 74 64 65  oid*))fputs,stde
34710 72 72 2c 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  rr,1);.#endif.#i
34720 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
34730 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20  LE_MULTIPLEX.   
34740 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
34750 70 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22  p(z,"-multiplex"
34760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78  )==0 ){.      ex
34770 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
34780 5f 6d 75 6c 74 69 70 6c 65 5f 69 6e 69 74 69 61  _multiple_initia
34790 6c 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  lize(const char*
347a0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
347b0 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69  ite3_multiplex_i
347c0 6e 69 74 69 61 6c 69 7a 65 28 30 2c 20 31 29 3b  nitialize(0, 1);
347d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
347e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
347f0 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20  -mmap")==0 ){.  
34800 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
34810 34 20 73 7a 20 3d 20 69 6e 74 65 67 65 72 56 61  4 sz = integerVa
34820 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  lue(cmdline_opti
34830 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
34840 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20  gv,++i));.      
34850 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
34860 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
34870 50 5f 53 49 5a 45 2c 20 73 7a 2c 20 73 7a 29 3b  P_SIZE, sz, sz);
34880 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
34890 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22 29 3d  trcmp(z,"-vfs")=
348a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
348b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
348c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
348d0 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  (cmdline_option_
348e0 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
348f0 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ++i));.      if(
34900 20 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20   pVfs ){.       
34910 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
34920 69 73 74 65 72 28 70 56 66 73 2c 20 31 29 3b 0a  ister(pVfs, 1);.
34930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34940 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34950 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63  (stderr, "no suc
34960 68 20 56 46 53 3a 20 5c 22 25 73 5c 22 5c 6e 22  h VFS: \"%s\"\n"
34970 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
34980 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
34990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
349a0 20 69 66 28 20 64 61 74 61 2e 7a 44 62 46 69 6c   if( data.zDbFil
349b0 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  ename==0 ){.#ifn
349c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
349d0 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 64 61 74  MEMORYDB.    dat
349e0 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  a.zDbFilename = 
349f0 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 20 20 20 20  ":memory:";.    
34a00 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d  warnInmemoryDb =
34a10 20 61 72 67 63 3d 3d 31 3b 0a 23 65 6c 73 65 0a   argc==1;.#else.
34a20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34a30 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f  stderr,"%s: Erro
34a40 72 3a 20 6e 6f 20 64 61 74 61 62 61 73 65 20 66  r: no database f
34a50 69 6c 65 6e 61 6d 65 20 73 70 65 63 69 66 69 65  ilename specifie
34a60 64 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20  d\n", Argv0);.  
34a70 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
34a80 69 66 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75  if.  }.  data.ou
34a90 74 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 20 20 2f  t = stdout;..  /
34aa0 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20 6f  * Go ahead and o
34ab0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
34ac0 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c 72 65   file if it alre
34ad0 61 64 79 20 65 78 69 73 74 73 2e 20 20 49 66 20  ady exists.  If 
34ae0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f  the.  ** file do
34af0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 64 65  es not exist, de
34b00 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20  lay opening it. 
34b10 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 65   This prevents e
34b20 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a 20 20  mpty database.  
34b30 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20 62 65  ** files from be
34b40 69 6e 67 20 63 72 65 61 74 65 64 20 69 66 20 61  ing created if a
34b50 20 75 73 65 72 20 6d 69 73 74 79 70 65 73 20 74   user mistypes t
34b60 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
34b70 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74   argument.  ** t
34b80 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6d  o the sqlite com
34b90 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a  mand-line tool..
34ba0 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63 65 73    */.  if( acces
34bb0 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61  s(data.zDbFilena
34bc0 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  me, 0)==0 ){.   
34bd0 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 2c 20   open_db(&data, 
34be0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72  0);.  }..  /* Pr
34bf0 6f 63 65 73 73 20 74 68 65 20 69 6e 69 74 69 61  ocess the initia
34c00 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69 66  lization file if
34c10 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
34c20 49 66 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69  If no -init opti
34c30 6f 6e 0a 20 20 2a 2a 20 69 73 20 67 69 76 65 6e  on.  ** is given
34c40 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
34c50 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61  line, look for a
34c60 20 66 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73   file named ~/.s
34c70 71 6c 69 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a  qliterc and.  **
34c80 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20   try to process 
34c90 69 74 2e 0a 20 20 2a 2f 0a 20 20 70 72 6f 63 65  it..  */.  proce
34ca0 73 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74  ss_sqliterc(&dat
34cb0 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 0a 20  a,zInitFile);.. 
34cc0 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e   /* Make a secon
34cd0 64 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74  d pass through t
34ce0 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  he command-line 
34cf0 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74  argument and set
34d00 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20  .  ** options.  
34d10 54 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73  This second pass
34d20 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
34d30 6c 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74  l after the init
34d40 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
34d50 66 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65  file is processe
34d60 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  d so that the co
34d70 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
34d80 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69  ents will overri
34d90 64 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  de.  ** settings
34da0 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
34db0 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a  zation file..  *
34dc0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  /.  for(i=1; i<a
34dd0 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
34de0 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
34df0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
34e00 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '-' ) continue;.
34e10 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d      if( z[1]=='-
34e20 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ' ){ z++; }.    
34e30 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69  if( strcmp(z,"-i
34e40 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nit")==0 ){.    
34e50 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65    i++;.    }else
34e60 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
34e70 68 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  html")==0 ){.   
34e80 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
34e90 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65  ODE_Html;.    }e
34ea0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
34eb0 2c 22 2d 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ,"-list")==0 ){.
34ec0 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
34ed0 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
34ee0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
34ef0 70 28 7a 2c 22 2d 71 75 6f 74 65 22 29 3d 3d 30  p(z,"-quote")==0
34f00 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
34f10 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65  ode = MODE_Quote
34f20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34f30 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22  strcmp(z,"-line"
34f40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
34f50 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
34f60 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ine;.    }else i
34f70 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f  f( strcmp(z,"-co
34f80 6c 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lumn")==0 ){.   
34f90 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
34fa0 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
34fb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
34fc0 28 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b  (z,"-csv")==0 ){
34fd0 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
34fe0 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
34ff0 20 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 63     memcpy(data.c
35000 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 2c 22 2c  olSeparator,",",
35010 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  2);.    }else if
35020 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 61 73 63  ( strcmp(z,"-asc
35030 69 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ii")==0 ){.     
35040 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
35050 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73  E_Ascii;.      s
35060 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35070 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53  sizeof(data.colS
35080 65 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61 2e  eparator), data.
35090 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  colSeparator,.  
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350b0 20 20 20 20 20 53 45 50 5f 55 6e 69 74 29 3b 0a       SEP_Unit);.
350c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
350d0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
350e0 74 61 2e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  ta.rowSeparator)
350f0 2c 20 64 61 74 61 2e 72 6f 77 53 65 70 61 72 61  , data.rowSepara
35100 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
35110 20 20 20 20 20 20 20 20 20 20 20 20 53 45 50 5f              SEP_
35120 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c  Record);.    }el
35130 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
35140 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30  "-separator")==0
35150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35160 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35170 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  f(data.colSepara
35180 74 6f 72 29 2c 20 64 61 74 61 2e 63 6f 6c 53 65  tor), data.colSe
35190 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351b0 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74  "%s",cmdline_opt
351c0 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61  ion_value(argc,a
351d0 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d  rgv,++i));.    }
351e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
351f0 7a 2c 22 2d 6e 65 77 6c 69 6e 65 22 29 3d 3d 30  z,"-newline")==0
35200 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35210 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35220 66 28 64 61 74 61 2e 72 6f 77 53 65 70 61 72 61  f(data.rowSepara
35230 74 6f 72 29 2c 20 64 61 74 61 2e 72 6f 77 53 65  tor), data.rowSe
35240 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35260 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74  "%s",cmdline_opt
35270 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61  ion_value(argc,a
35280 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d  rgv,++i));.    }
35290 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
352a0 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d  z,"-nullvalue")=
352b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
352c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
352d0 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 56 61 6c  eof(data.nullVal
352e0 75 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 56 61  ue), data.nullVa
352f0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
35300 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 22              "%s"
35310 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  ,cmdline_option_
35320 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
35330 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ++i));.    }else
35340 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
35350 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20  header")==0 ){. 
35360 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65       data.showHe
35370 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65  ader = 1;.    }e
35380 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
35390 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30  ,"-noheader")==0
353a0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73   ){.      data.s
353b0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
353c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
353d0 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d  cmp(z,"-echo")==
353e0 30 20 29 7b 0a 20 20 20 20 20 20 53 68 65 6c 6c  0 ){.      Shell
353f0 53 65 74 46 6c 61 67 28 26 64 61 74 61 2c 20 53  SetFlag(&data, S
35400 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20 20 20 20  HFLG_Echo);.    
35410 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
35420 28 7a 2c 22 2d 65 71 70 22 29 3d 3d 30 20 29 7b  (z,"-eqp")==0 ){
35430 0a 20 20 20 20 20 20 64 61 74 61 2e 61 75 74 6f  .      data.auto
35440 45 51 50 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  EQP = 1;.    }el
35450 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
35460 22 2d 65 71 70 66 75 6c 6c 22 29 3d 3d 30 20 29  "-eqpfull")==0 )
35470 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 61 75 74  {.      data.aut
35480 6f 45 51 50 20 3d 20 32 3b 0a 20 20 20 20 7d 65  oEQP = 2;.    }e
35490 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
354a0 2c 22 2d 73 74 61 74 73 22 29 3d 3d 30 20 29 7b  ,"-stats")==0 ){
354b0 0a 20 20 20 20 20 20 64 61 74 61 2e 73 74 61 74  .      data.stat
354c0 73 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  sOn = 1;.    }el
354d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
354e0 22 2d 73 63 61 6e 73 74 61 74 73 22 29 3d 3d 30  "-scanstats")==0
354f0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73   ){.      data.s
35500 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 31 3b 0a  canstatsOn = 1;.
35510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
35520 72 63 6d 70 28 7a 2c 22 2d 62 61 63 6b 73 6c 61  rcmp(z,"-backsla
35530 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
35540 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64   /* Undocumented
35550 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
35560 74 69 6f 6e 3a 20 2d 62 61 63 6b 73 6c 61 73 68  tion: -backslash
35570 0a 20 20 20 20 20 20 2a 2a 20 43 61 75 73 65 73  .      ** Causes
35580 20 43 2d 73 74 79 6c 65 20 62 61 63 6b 73 6c 61   C-style backsla
35590 73 68 20 65 73 63 61 70 65 73 20 74 6f 20 62 65  sh escapes to be
355a0 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 53 51   evaluated in SQ
355b0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  L statements.   
355c0 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 73     ** prior to s
355d0 65 6e 64 69 6e 67 20 74 68 65 20 53 51 4c 20 69  ending the SQL i
355e0 6e 74 6f 20 53 51 4c 69 74 65 2e 20 20 55 73 65  nto SQLite.  Use
355f0 66 75 6c 20 66 6f 72 20 69 6e 6a 65 63 74 69 6e  ful for injectin
35600 67 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 7a 79  g.      ** crazy
35610 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 69   bytes in the mi
35620 64 64 6c 65 20 6f 66 20 53 51 4c 20 73 74 61 74  ddle of SQL stat
35630 65 6d 65 6e 74 73 20 66 6f 72 20 74 65 73 74 69  ements for testi
35640 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
35650 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35660 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 26 64   ShellSetFlag(&d
35670 61 74 61 2c 20 53 48 46 4c 47 5f 42 61 63 6b 73  ata, SHFLG_Backs
35680 6c 61 73 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lash);.    }else
35690 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
356a0 62 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  bail")==0 ){.   
356b0 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72     bail_on_error
356c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
356d0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76  if( strcmp(z,"-v
356e0 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
356f0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20       printf("%s 
35700 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %s\n", sqlite3_l
35710 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c  ibversion(), sql
35720 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
35730 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
35740 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35750 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 74 65 72  strcmp(z,"-inter
35760 61 63 74 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20  active")==0 ){. 
35770 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e       stdin_is_in
35780 74 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 20  teractive = 1;. 
35790 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
357a0 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d  cmp(z,"-batch")=
357b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69  =0 ){.      stdi
357c0 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
357d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
357e0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
357f0 65 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eap")==0 ){.    
35800 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65    i++;.    }else
35810 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
35820 70 61 67 65 63 61 63 68 65 22 29 3d 3d 30 20 29  pagecache")==0 )
35830 7b 0a 20 20 20 20 20 20 69 2b 3d 32 3b 0a 20 20  {.      i+=2;.  
35840 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
35850 6d 70 28 7a 2c 22 2d 6c 6f 6f 6b 61 73 69 64 65  mp(z,"-lookaside
35860 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
35870 2b 3d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  +=2;.    }else i
35880 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d  f( strcmp(z,"-mm
35890 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ap")==0 ){.     
358a0 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   i++;.    }else 
358b0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76  if( strcmp(z,"-v
358c0 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
358d0 20 69 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c   i++;.#ifdef SQL
358e0 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52  ITE_ENABLE_VFSTR
358f0 41 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ACE.    }else if
35900 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73  ( strcmp(z,"-vfs
35910 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
35920 20 20 20 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a      i++;.#endif.
35930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
35940 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20  ABLE_MULTIPLEX. 
35950 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
35960 63 6d 70 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65  cmp(z,"-multiple
35970 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
35980 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  i++;.#endif.    
35990 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
359a0 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20 29  (z,"-help")==0 )
359b0 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 31 29  {.      usage(1)
359c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
359d0 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29  strcmp(z,"-cmd")
359e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
359f0 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  Run commands tha
35a00 74 20 66 6f 6c 6c 6f 77 20 2d 63 6d 64 20 66 69  t follow -cmd fi
35a10 72 73 74 20 61 6e 64 20 73 65 70 61 72 61 74 65  rst and separate
35a20 6c 79 20 66 72 6f 6d 20 63 6f 6d 6d 61 6e 64 73  ly from commands
35a30 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 73  .      ** that s
35a40 69 6d 70 6c 79 20 61 70 70 65 61 72 20 6f 6e 20  imply appear on 
35a50 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
35a60 2e 20 20 54 68 69 73 20 73 65 65 6d 73 20 67 6f  .  This seems go
35a70 6f 66 79 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20  ofy.  It would. 
35a80 20 20 20 20 20 2a 2a 20 62 65 20 62 65 74 74 65       ** be bette
35a90 72 20 69 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64  r if all command
35aa0 73 20 72 61 6e 20 69 6e 20 74 68 65 20 6f 72 64  s ran in the ord
35ab0 65 72 20 74 68 61 74 20 74 68 65 79 20 61 70 70  er that they app
35ac0 65 61 72 2e 20 20 42 75 74 0a 20 20 20 20 20 20  ear.  But.      
35ad0 2a 2a 20 77 65 20 72 65 74 61 69 6e 20 74 68 65  ** we retain the
35ae0 20 67 6f 6f 66 79 20 62 65 68 61 76 69 6f 72 20   goofy behavior 
35af0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
35b00 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 20 2a 2f  ompatibility. */
35b10 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72  .      if( i==ar
35b20 67 63 2d 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  gc-1 ) break;.  
35b30 20 20 20 20 7a 20 3d 20 63 6d 64 6c 69 6e 65 5f      z = cmdline_
35b40 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67  option_value(arg
35b50 63 2c 61 72 67 76 2c 2b 2b 69 29 3b 0a 20 20 20  c,argv,++i);.   
35b60 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2e 27     if( z[0]=='.'
35b70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35b80 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
35b90 28 7a 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20  (z, &data);.    
35ba0 20 20 20 20 69 66 28 20 72 63 20 26 26 20 62 61      if( rc && ba
35bb0 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20 72 65  il_on_error ) re
35bc0 74 75 72 6e 20 72 63 3d 3d 32 20 3f 20 30 20 3a  turn rc==2 ? 0 :
35bd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   rc;.      }else
35be0 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 5f 64  {.        open_d
35bf0 62 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 20  b(&data, 0);.   
35c00 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f       rc = shell_
35c10 65 78 65 63 28 64 61 74 61 2e 64 62 2c 20 7a 2c  exec(data.db, z,
35c20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
35c30 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
35c40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
35c50 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20  ErrMsg!=0 ){.   
35c60 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
35c70 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
35c80 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
35c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35ca0 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29   bail_on_error )
35cb0 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20   return rc!=0 ? 
35cc0 72 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20  rc : 1;.        
35cd0 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20  }else if( rc!=0 
35ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
35cf0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
35d00 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
35d10 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 5c 22  o process SQL \"
35d20 25 73 5c 22 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  %s\"\n", z);.   
35d30 20 20 20 20 20 20 20 69 66 28 20 62 61 69 6c 5f         if( bail_
35d40 6f 6e 5f 65 72 72 6f 72 20 29 20 72 65 74 75 72  on_error ) retur
35d50 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
35d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35d70 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
35d80 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
35d90 20 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20   Error: unknown 
35da0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41  option: %s\n", A
35db0 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20  rgv0, z);.      
35dc0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
35dd0 72 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72  r,"Use -help for
35de0 20 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f   a list of optio
35df0 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ns.\n");.      r
35e00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
35e10 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
35e20 64 61 74 61 2e 6d 6f 64 65 3b 0a 20 20 7d 0a 0a  data.mode;.  }..
35e30 20 20 69 66 28 20 21 72 65 61 64 53 74 64 69 6e    if( !readStdin
35e40 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61   ){.    /* Run a
35e50 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  ll arguments tha
35e60 74 20 64 6f 20 6e 6f 74 20 62 65 67 69 6e 20 77  t do not begin w
35e70 69 74 68 20 27 2d 27 20 61 73 20 69 66 20 74 68  ith '-' as if th
35e80 65 79 20 77 65 72 65 20 73 65 70 61 72 61 74 65  ey were separate
35e90 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  .    ** command-
35ea0 6c 69 6e 65 20 69 6e 70 75 74 73 2c 20 65 78 63  line inputs, exc
35eb0 65 70 74 20 66 6f 72 20 74 68 65 20 61 72 67 54  ept for the argT
35ec0 6f 53 6b 69 70 20 61 72 67 75 6d 65 6e 74 20 77  oSkip argument w
35ed0 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 0a 20 20  hich contains.  
35ee0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
35ef0 65 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  e filename..    
35f00 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
35f10 69 3c 6e 43 6d 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmd; i++){.  
35f20 20 20 20 20 69 66 28 20 61 7a 43 6d 64 5b 69 5d      if( azCmd[i]
35f30 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
35f40 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61      rc = do_meta
35f50 5f 63 6f 6d 6d 61 6e 64 28 61 7a 43 6d 64 5b 69  _command(azCmd[i
35f60 5d 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20 20  ], &data);.     
35f70 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
35f80 72 6e 20 72 63 3d 3d 32 20 3f 20 30 20 3a 20 72  rn rc==2 ? 0 : r
35f90 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
35fa0 20 20 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28          open_db(
35fb0 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20  &data, 0);.     
35fc0 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
35fd0 65 63 28 64 61 74 61 2e 64 62 2c 20 61 7a 43 6d  ec(data.db, azCm
35fe0 64 5b 69 5d 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  d[i], shell_call
35ff0 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
36000 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
36010 69 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29  if( zErrMsg!=0 )
36020 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
36030 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
36040 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
36050 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
36060 20 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f    return rc!=0 ?
36070 20 72 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20   rc : 1;.       
36080 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30   }else if( rc!=0
36090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
360a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
360b0 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
360c0 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 3a 20  to process SQL: 
360d0 25 73 5c 6e 22 2c 20 61 7a 43 6d 64 5b 69 5d 29  %s\n", azCmd[i])
360e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
360f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36110 20 20 20 66 72 65 65 28 61 7a 43 6d 64 29 3b 0a     free(azCmd);.
36120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
36130 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63  Run commands rec
36140 65 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64  eived from stand
36150 61 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f  ard input.    */
36160 0a 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69  .    if( stdin_i
36170 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b  s_interactive ){
36180 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f  .      char *zHo
36190 6d 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  me;.      char *
361a0 7a 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20  zHistory = 0;.  
361b0 20 20 20 20 69 6e 74 20 6e 48 69 73 74 6f 72 79      int nHistory
361c0 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a  ;.      printf(.
361d0 20 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20          "SQLite 
361e0 76 65 72 73 69 6f 6e 20 25 73 20 25 2e 31 39 73  version %s %.19s
361f0 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73  \n" /*extra-vers
36200 69 6f 6e 2d 69 6e 66 6f 2a 2f 0a 20 20 20 20 20  ion-info*/.     
36210 20 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c     "Enter \".hel
36220 70 5c 22 20 66 6f 72 20 75 73 61 67 65 20 68 69  p\" for usage hi
36230 6e 74 73 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  nts.\n",.       
36240 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
36250 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73  ion(), sqlite3_s
36260 6f 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20  ourceid().      
36270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72  );.      if( war
36280 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20  nInmemoryDb ){. 
36290 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43         printf("C
362a0 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 22 29  onnected to a ")
362b0 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 42  ;.        printB
362c0 6f 6c 64 28 22 74 72 61 6e 73 69 65 6e 74 20 69  old("transient i
362d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
362e0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  e");.        pri
362f0 6e 74 66 28 22 2e 5c 6e 55 73 65 20 5c 22 2e 6f  ntf(".\nUse \".o
36300 70 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20 74  pen FILENAME\" t
36310 6f 20 72 65 6f 70 65 6e 20 6f 6e 20 61 20 22 0a  o reopen on a ".
36320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36330 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
36340 61 73 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ase.\n");.      
36350 7d 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20  }.      zHome = 
36360 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 30 29  find_home_dir(0)
36370 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d  ;.      if( zHom
36380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69  e ){.        nHi
36390 73 74 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30  story = strlen30
363a0 28 7a 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20  (zHome) + 20;.  
363b0 20 20 20 20 20 20 69 66 28 20 28 7a 48 69 73 74        if( (zHist
363c0 6f 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69  ory = malloc(nHi
363d0 73 74 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20  story))!=0 ){.  
363e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
363f0 73 6e 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72  snprintf(nHistor
36400 79 2c 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f  y, zHistory,"%s/
36410 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22  .sqlite_history"
36420 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20  , zHome);.      
36430 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36440 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29    if( zHistory )
36450 7b 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  { shell_read_his
36460 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b 20  tory(zHistory); 
36470 7d 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c  }.#if HAVE_READL
36480 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54  INE || HAVE_EDIT
36490 4c 49 4e 45 0a 20 20 20 20 20 20 72 6c 5f 61 74  LINE.      rl_at
364a0 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69  tempted_completi
364b0 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 3d 20 72 65  on_function = re
364c0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
364d0 6e 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  n;.#elif HAVE_LI
364e0 4e 45 4e 4f 49 53 45 0a 20 20 20 20 20 20 6c 69  NENOISE.      li
364f0 6e 65 6e 6f 69 73 65 53 65 74 43 6f 6d 70 6c 65  nenoiseSetComple
36500 74 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 6c 69 6e  tionCallback(lin
36510 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f  enoise_completio
36520 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  n);.#endif.     
36530 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
36540 70 75 74 28 26 64 61 74 61 2c 20 30 29 3b 0a 20  put(&data, 0);. 
36550 20 20 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72       if( zHistor
36560 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68 65  y ){.        she
36570 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72  ll_stifle_histor
36580 79 28 32 30 30 30 29 3b 0a 20 20 20 20 20 20 20  y(2000);.       
36590 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
365a0 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b 0a  tory(zHistory);.
365b0 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 48 69          free(zHi
365c0 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d 0a  story);.      }.
365d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
365e0 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
365f0 70 75 74 28 26 64 61 74 61 2c 20 73 74 64 69 6e  put(&data, stdin
36600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
36610 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26 64  et_table_name(&d
36620 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  ata, 0);.  if( d
36630 61 74 61 2e 64 62 20 29 7b 0a 20 20 20 20 73 65  ata.db ){.    se
36640 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
36650 26 64 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  &data);.    sqli
36660 74 65 33 5f 63 6c 6f 73 65 28 64 61 74 61 2e 64  te3_close(data.d
36670 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
36680 33 5f 66 72 65 65 28 64 61 74 61 2e 7a 46 72 65  3_free(data.zFre
36690 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 66 69 6e  eOnClose);.  fin
366a0 64 5f 68 6f 6d 65 5f 64 69 72 28 31 29 3b 0a 23  d_home_dir(1);.#
366b0 69 66 20 21 53 51 4c 49 54 45 5f 53 48 45 4c 4c  if !SQLITE_SHELL
366c0 5f 49 53 5f 55 54 46 38 0a 20 20 66 6f 72 28 69  _IS_UTF8.  for(i
366d0 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
366e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 72   sqlite3_free(ar
366f0 67 76 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[i]);.  sqlite
36700 33 5f 66 72 65 65 28 61 72 67 76 29 3b 0a 23 65  3_free(argv);.#e
36710 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
36720 3b 0a 7d 0a                                      ;.}.