/ Hex Artifact Content
Login

Artifact af3fb9eabdc0a95beace2f760597d213be0988c974eca116208eb220cd24469c:


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 69 6e 74 20 63 51 75 6f 74 65 3b 0a 20  .  int cQuote;. 
c770: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
c780: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
c790: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
c7a0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
c7b0: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
c7c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
c7d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
c7e0: 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43   cQuote = quoteC
c7f0: 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20  har(zName);.  n 
c800: 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  = strlen30(zName
c810: 29 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  );.  if( cQuote 
c820: 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20  ) n += n+2;.  z 
c830: 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  = p->zDestTable 
c840: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b  = malloc( n+1 );
c850: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
c860: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
c870: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74  derr,"Error: out
c880: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
c890: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
c8a0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  n = 0;.  if( 
c8b0: 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
c8c0: 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28  = cQuote;.  for(
c8d0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
c8e0: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20  ++){.    z[n++] 
c8f0: 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20  = zName[i];.    
c900: 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51  if( zName[i]==cQ
c910: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
c920: 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66  cQuote;.  }.  if
c930: 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  ( cQuote ) z[n++
c940: 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b  ] = cQuote;.  z[
c950: 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n] = 0;.}.../*.*
c960: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
c970: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
c980: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53   will generate S
c990: 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e  QL output.  Prin
c9a0: 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  t.** the result 
c9b0: 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73  columns, comma-s
c9c0: 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c  eparated, on a l
c9d0: 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64  ine and then add
c9e0: 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20   a.** semicolon 
c9f0: 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68  terminator to th
ca00: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69  e end of that li
ca10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
ca20: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
ca30: 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74  ns is 1 and that
ca40: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
ca50: 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68   text "--".** th
ca60: 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d  en write the sem
ca70: 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61  icolon on a sepa
ca80: 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74  rate line.  That
ca90: 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d   way, if a.** "-
caa0: 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72  -" comment occur
cab0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
cac0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
cad0: 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f  he comment.** wo
cae0: 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20  n't consume the 
caf0: 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
cb00: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
cb10: 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
cb20: 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
cb30: 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20  lState *p,      
cb40: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f       /* Query co
cb50: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
cb60: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20   char *zSelect, 
cb70: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
cb80: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61  atement to extra
cb90: 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ct content */.  
cba0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72  const char *zFir
cbb0: 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e  stRow    /* Prin
cbc0: 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72  t before first r
cbd0: 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ow, if not NULL 
cbe0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
cbf0: 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20  stmt *pSelect;. 
cc00: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
cc10: 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b  Result;.  int i;
cc20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cc30: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cc40: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
cc50: 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20  b, zSelect, -1, 
cc60: 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
cc70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cc80: 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b  K || !pSelect ){
cc90: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
cca0: 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
ccb0: 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
ccc0: 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
cce0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
ccf0: 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
cd00: 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
cd10: 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
cd20: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
cd30: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
cd40: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
cd50: 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20  ect);.  nResult 
cd60: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
cd70: 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b  _count(pSelect);
cd80: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
cd90: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
cda0: 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b  if( zFirstRow ){
cdb0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
cdc0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
cdd0: 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20   zFirstRow);.   
cde0: 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30     zFirstRow = 0
cdf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20  ;.    }.    z = 
ce00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
ce10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
ce20: 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
ce30: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ce40: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
ce50: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
ce60: 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
ce70: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ce80: 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73  p->out, ",%s", s
ce90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
cea0: 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b  xt(pSelect, i));
ceb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
cec0: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
ced0: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26    while( z[0] &&
cee0: 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a   (z[0]!='-' || z
cef0: 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b  [1]!='-') ) z++;
cf00: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b  .    if( z[0] ){
cf10: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
cf20: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e  f(p->out, "\n;\n
cf30: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
cf40: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
cf50: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
cf60: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
cf70: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
cf80: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ect);.  }.  rc =
cf90: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
cfa0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
cfb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cfc0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
cfd0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
cfe0: 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73  * ERROR: (%d) %s
cff0: 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a   *****/\n", rc,.
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
d020: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20  ->db));.    if( 
d030: 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54  (rc&0xff)!=SQLIT
d040: 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e  E_CORRUPT ) p->n
d050: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
d060: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d070: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
d080: 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72  and save off cur
d090: 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e  rent error strin
d0a0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  g..*/.static cha
d0b0: 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28  r *save_err_msg(
d0c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20  .  sqlite3 *db  
d0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
d0e0: 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
d0f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d  /.){.  int nErrM
d100: 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28  sg = 1+strlen30(
d110: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
d120: 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  b));.  char *zEr
d130: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
d140: 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29  alloc64(nErrMsg)
d150: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
d160: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  ){.    memcpy(zE
d170: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
d180: 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d  rrmsg(db), nErrM
d190: 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
d1a0: 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69  n zErrMsg;.}..#i
d1b0: 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f  fdef __linux__./
d1c0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
d1d0: 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74  display I/O stat
d1e0: 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67  s on Linux using
d1f0: 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f   /proc/PID/io.*/
d200: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
d210: 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
d220: 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46  (FILE *out){.  F
d230: 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
d240: 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  z[200];.  sqlite
d250: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
d260: 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f  f(z), z, "/proc/
d270: 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29  %d/io", getpid()
d280: 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  );.  in = fopen(
d290: 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20  z, "rb");.  if( 
d2a0: 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
d2b0: 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
d2c0: 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29  , sizeof(z), in)
d2d0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  !=0 ){.    stati
d2e0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
d2f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
d300: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20  r *zPattern;.   
d310: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d320: 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61  Desc;.    } aTra
d330: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ns[] = {.      {
d340: 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "rchar: ",     
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
d360: 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20  tes received by 
d370: 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20  read():" },.    
d380: 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20    { "wchar: ",  
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77  "Bytes sent to w
d3b0: 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20  rite():"    },. 
d3c0: 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22       { "syscr: "
d3d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d3e0: 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65     "Read() syste
d3f0: 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d  m calls:"      }
d400: 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77  ,.      { "syscw
d410: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
d420: 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73        "Write() s
d430: 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20  ystem calls:"   
d440: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65    },.      { "re
d450: 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  ad_bytes: ",    
d460: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
d470: 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67  read from storag
d480: 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  e:"  },.      { 
d490: 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  "write_bytes: ",
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
d4b0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74  es written to st
d4c0: 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20  orage:" },.     
d4d0: 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72   { "cancelled_wr
d4e0: 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22  ite_bytes: ",  "
d4f0: 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20  Cancelled write 
d500: 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20  bytes:"    },.  
d510: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
d520: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
d530: 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29  rraySize(aTrans)
d540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d550: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
d560: 6e 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  n(aTrans[i].zPat
d570: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  tern);.      if(
d580: 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b   strncmp(aTrans[
d590: 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20  i].zPattern, z, 
d5a0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
d5b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
d5c0: 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54  , "%-36s %s", aT
d5d0: 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26  rans[i].zDesc, &
d5e0: 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  z[n]);.        b
d5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d600: 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65    }.  }.  fclose
d610: 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (in);.}.#endif..
d620: 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20  /*.** Display a 
d630: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73  single line of s
d640: 74 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62  tatus using 64-b
d650: 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  it values..*/.st
d660: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
d670: 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65  yStatLine(.  She
d680: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
d690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
d6a0: 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ell context */. 
d6b0: 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20   char *zLabel,  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
d6d0: 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65  bel for this one
d6e0: 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20   line */.  char 
d6f0: 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20  *zFormat,       
d700: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66       /* Format f
d710: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  or the result */
d720: 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73 43 74  .  int iStatusCt
d730: 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rl,          /* 
d740: 57 68 69 63 68 20 73 74 61 74 75 73 20 74 6f 20  Which status to 
d750: 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74  display */.  int
d760: 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
d770: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
d780: 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
d790: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
d7a0: 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d  3_int64 iCur = -
d7b0: 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  1;.  sqlite3_int
d7c0: 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a  64 iHiwtr = -1;.
d7d0: 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e    int i, nPercen
d7e0: 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  t;.  char zLine[
d7f0: 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
d800: 73 74 61 74 75 73 36 34 28 69 53 74 61 74 75 73  status64(iStatus
d810: 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48  Ctrl, &iCur, &iH
d820: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
d830: 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65   for(i=0, nPerce
d840: 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d  nt=0; zFormat[i]
d850: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d860: 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20  zFormat[i]=='%' 
d870: 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20  ) nPercent++;.  
d880: 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74  }.  if( nPercent
d890: 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
d8a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
d8b0: 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c  f(zLine), zLine,
d8c0: 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20   zFormat, iCur, 
d8d0: 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65  iHiwtr);.  }else
d8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
d8f0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
d900: 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
d910: 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20  rmat, iHiwtr);. 
d920: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
d930: 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  p->out, "%-36s %
d940: 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c  s\n", zLabel, zL
d950: 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ine);.}../*.** D
d960: 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74  isplay memory st
d970: 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ats..*/.static i
d980: 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73  nt display_stats
d990: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
d9c0: 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
d9d0: 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
d9e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
d9f0: 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
da00: 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
da30: 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
da40: 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
da50: 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69 66  nt iHiwtr;..  if
da60: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
da70: 6f 75 74 20 29 7b 0a 20 20 20 20 64 69 73 70 6c  out ){.    displ
da80: 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
da90: 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c   "Memory Used:",
daa0: 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  .       "%lld (m
dab0: 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
dac0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
dad0: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65 73  EMORY_USED, bRes
dae0: 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  et);.    display
daf0: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
db00: 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61  Number of Outsta
db10: 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e  nding Allocation
db20: 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  s:",.       "%ll
db30: 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
db40: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
db50: 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65  LOC_COUNT, bRese
db60: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67  t);.    if( pArg
db70: 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
db80: 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b  FLG_Pagecache ){
db90: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 53 74  .      displaySt
dba0: 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
dbb0: 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
dbc0: 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
dbd0: 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
dbe0: 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53   %lld) pages", S
dbf0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
dc00: 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65  ECACHE_USED, bRe
dc10: 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
dc20: 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
dc30: 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
dc40: 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c 6f 77   Pcache Overflow
dc50: 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20 20 20   Bytes:",.      
dc60: 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
dc70: 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
dc80: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
dc90: 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65 73  E_OVERFLOW, bRes
dca0: 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  et);.    display
dcb0: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
dcc0: 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69  Largest Allocati
dcd0: 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  on:",.       "%l
dce0: 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
dcf0: 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
dd00: 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  SIZE, bReset);. 
dd10: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
dd20: 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
dd30: 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74  t Pcache Allocat
dd40: 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ion:",.       "%
dd50: 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
dd60: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
dd70: 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
dd80: 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
dd90: 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
dda0: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
ddb0: 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65 73  ne(pArg, "Deepes
ddc0: 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22  t Parser Stack:"
ddd0: 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28  ,.       "%lld (
dde0: 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
ddf0: 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52  TE_STATUS_PARSER
de00: 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b  _STACK, bReset);
de10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
de20: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
de30: 3e 6f 75 74 20 26 26 20 64 62 20 29 7b 0a 20 20  >out && db ){.  
de40: 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
de50: 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f  lFlgs & SHFLG_Lo
de60: 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20  okaside ){.     
de70: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
de80: 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
de90: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
dea0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
deb0: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c  _LOOKASIDE_USED,
dec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ded0: 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
dee0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
def0: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
df00: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20  tf(pArg->out,.  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f              "Loo
df20: 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65  kaside Slots Use
df30: 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d:              
df40: 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
df50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df60: 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
df70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
df80: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
df90: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
dfa0: 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20  SIDE_HIT,.      
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
dfd0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
dfe0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
dff0: 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66  ->out, "Successf
e000: 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74  ul lookaside att
e010: 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c  empts:       %d\
e020: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e030: 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20    iHiwtr);.     
e040: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
e050: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
e060: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
e070: 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20  _MISS_SIZE,.    
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
e0a0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
e0b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
e0c0: 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
e0d0: 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65  ide failures due
e0e0: 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25   to size:      %
e0f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e100: 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
e110: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
e120: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
e130: 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
e140: 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20  DE_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 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
e170: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
e180: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e190: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
e1a0: 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
e1b0: 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20  ue to OOM:      
e1c0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
e1d0: 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
e1e0: 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20     }.    iHiwtr 
e1f0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
e200: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
e210: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
e220: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45  STATUS_CACHE_USE
e230: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
e240: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
e250: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
e260: 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61  >out, "Pager Hea
e270: 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
e280: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
e290: 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
e2a0: 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20       iCur);.    
e2b0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
e2c0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
e2d0: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
e2e0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
e2f0: 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20  CHE_HIT, &iCur, 
e300: 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
e310: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
e320: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
e330: 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20  he hits:        
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
e350: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
e360: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
e370: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
e380: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
e390: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
e3a0: 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20  HE_MISS, &iCur, 
e3b0: 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
e3c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
e3d0: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
e3e0: 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20  he misses:      
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
e400: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
e410: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
e420: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
e430: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
e440: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
e450: 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c  HE_WRITE, &iCur,
e460: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
e470: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
e480: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
e490: 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20  che writes:     
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
e4b0: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
e4c0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
e4d0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
e4e0: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
e4f0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43  LITE_DBSTATUS_SC
e500: 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72  HEMA_USED, &iCur
e510: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
e520: 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
e530: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
e540: 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65  chema Heap Usage
e550: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
e560: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
e570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75  .            iCu
e580: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
e590: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
e5a0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
e5b0: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
e5c0: 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c  TATUS_STMT_USED,
e5d0: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
e5e0: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
e5f0: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
e600: 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48  ut, "Statement H
e610: 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73  eap/Lookaside Us
e620: 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74  age:      %d byt
e630: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
e640: 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20     iCur);.  }.. 
e650: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
e660: 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26 26 20  g->out && db && 
e670: 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  pArg->pStmt ){. 
e680: 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
e690: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
e6a0: 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
e6b0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
e6c0: 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20  LSCAN_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 62 52 65 73 65             bRese
e6f0: 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
e700: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46  tf(pArg->out, "F
e710: 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20 20  ullscan Steps:  
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
e740: 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
e750: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
e760: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
e770: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
e780: 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a 20  SORT, bReset);. 
e790: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
e7a0: 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f  rg->out, "Sort O
e7b0: 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20  perations:      
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
e7d0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
e7e0: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
e7f0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
e800: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
e810: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
e820: 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20 20  NDEX,bReset);.  
e830: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
e840: 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64  g->out, "Autoind
e850: 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20 20  ex Inserts:     
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
e870: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
e880: 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
e890: 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
e8a0: 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
e8b0: 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45  TMTSTATUS_VM_STE
e8c0: 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  P, bReset);.    
e8d0: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
e8e0: 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c 20 4d  >out, "Virtual M
e8f0: 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20 20 20  achine Steps:   
e900: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
e910: 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23  ", iCur);.  }..#
e920: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
e930: 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f    displayLinuxIo
e940: 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29  Stats(pArg->out)
e950: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
e960: 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69  o not remove thi
e970: 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62  s machine readab
e980: 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72  le comment: extr
e990: 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68  a-stats-output-h
e9a0: 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ere */..  return
e9b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
e9c0: 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e  play scan stats.
e9d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9e0: 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
e9f0: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
ea00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ea10: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
ea20: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
ea30: 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20  hellState *pArg 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
ea60: 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69  llState */.){.#i
ea70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
ea80: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
ea90: 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  TUS.  UNUSED_PAR
eaa0: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
eab0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
eac0: 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Arg);.#else.  in
ead0: 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20  t i, k, n, mx;. 
eae0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
eaf0: 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
eb00: 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d   scanstats -----
eb10: 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20  ---\n");.  mx = 
eb20: 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  0;.  for(k=0; k<
eb30: 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64  =mx; k++){.    d
eb40: 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d  ouble rEstLoop =
eb50: 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   1.0;.    for(i=
eb60: 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20  n=0; 1; i++){.  
eb70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
eb80: 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d   *p = pArg->pStm
eb90: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
eba0: 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56  _int64 nLoop, nV
ebb0: 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62  isit;.      doub
ebc0: 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69  le rEst;.      i
ebd0: 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63  nt iSid;.      c
ebe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
ebf0: 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ain;.      if( s
ec00: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
ec10: 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
ec20: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f  ITE_SCANSTAT_NLO
ec30: 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f  OP, (void*)&nLoo
ec40: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  p) ){.        br
ec50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ec60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
ec70: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
ec80: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
ec90: 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64  _SELECTID, (void
eca0: 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20  *)&iSid);.      
ecb0: 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78  if( iSid>mx ) mx
ecc0: 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69   = iSid;.      i
ecd0: 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e  f( iSid!=k ) con
ece0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
ecf0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
ed00: 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75   rEstLoop = (dou
ed10: 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20  ble)nLoop;.     
ed20: 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77     if( k>0 ) raw
ed30: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
ed40: 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62  t, "-------- sub
ed50: 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d  query %d -------
ed60: 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d  \n", k);.      }
ed70: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
ed80: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
ed90: 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
eda0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
edb0: 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
edc0: 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73  nVisit);.      s
edd0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
ede0: 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
edf0: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54  ITE_SCANSTAT_EST
ee00: 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b  , (void*)&rEst);
ee10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ee20: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
ee30: 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
ee40: 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76  STAT_EXPLAIN, (v
ee50: 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b  oid*)&zExplain);
ee60: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
ee70: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
ee80: 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20  oop %2d: %s\n", 
ee90: 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  n, zExplain);.  
eea0: 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20      rEstLoop *= 
eeb0: 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f  rEst;.      raw_
eec0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
eed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ,.          "   
eee0: 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c        nLoop=%-8l
eef0: 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65  ld nRow=%-8lld e
ef00: 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74  stRow=%-8lld est
ef10: 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22  Row/Loop=%-8g\n"
ef20: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f  ,.          nLoo
ef30: 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69  p, nVisit, (sqli
ef40: 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c  te3_int64)(rEstL
ef50: 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20  oop+0.5), rEst. 
ef60: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
ef70: 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  }.  raw_printf(p
ef80: 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->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 5c 6e 22 29 3b 0a 23 65 6e 64  ------\n");.#end
efb0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  if.}../*.** Para
efc0: 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f  meter azArray po
efd0: 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74  ints to a zero-t
efe0: 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20  erminated array 
eff0: 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72  of strings. zStr
f000: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
f010: 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69  single nul-termi
f020: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65  nated string. Re
f030: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
f040: 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61   zStr.** is equa
f050: 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  l, according to 
f060: 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79  strcmp(), to any
f070: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20   of the strings 
f080: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
f090: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
f0a0: 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
f0b0: 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72  ic int str_in_ar
f0c0: 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ray(const char *
f0d0: 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
f0e0: 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69   **azArray){.  i
f0f0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
f100: 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b   azArray[i]; i++
f110: 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
f120: 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72  rcmp(zStr, azArr
f130: 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ay[i]) ) return 
f140: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
f150: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  0;.}../*.** If c
f160: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
f170: 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74  t pSql appears t
f180: 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20  o be an EXPLAIN 
f190: 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63  statement, alloc
f1a0: 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  ate.** and popul
f1b0: 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61  ate the ShellSta
f1c0: 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  te.aiIndent[] ar
f1d0: 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ray with the num
f1e0: 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73  ber of.** spaces
f1f0: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f   each opcode sho
f200: 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20  uld be indented 
f210: 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74  before it is out
f220: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  put..**.** The i
f230: 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61  ndenting rules a
f240: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  re:.**.**     * 
f250: 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c  For each "Next",
f260: 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22   "Prev", "VNext"
f270: 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74   or "VPrev" inst
f280: 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a  ruction, indent.
f290: 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63  **       all opc
f2a0: 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  odes that occur 
f2b0: 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a  between the p2 j
f2c0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
f2d0: 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a  and the opcode.*
f2e0: 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62  *       itself b
f2f0: 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a  y 2 spaces..**.*
f300: 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68  *     * For each
f310: 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20   "Goto", if the 
f320: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
f330: 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74   is earlier in t
f340: 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20  he program.**   
f350: 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20      and ends on 
f360: 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20  one of:.**      
f370: 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47      Yield  SeekG
f380: 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65  t  SeekLt  RowSe
f390: 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a  tRead  Rewind.**
f3a0: 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65         or if the
f3b0: 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
f3c0: 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20   one instead of 
f3d0: 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74  zero,.**       t
f3e0: 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f  hen indent all o
f3f0: 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74  pcodes between t
f400: 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72  he earlier instr
f410: 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  uction.**       
f420: 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20  and "Goto" by 2 
f430: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
f440: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
f450: 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c  ata_prepare(Shel
f460: 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74  lState *p, sqlit
f470: 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a  e3_stmt *pSql){.
f480: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
f490: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
f4a0: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66    /* The text of
f4b0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
f4c0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
f4d0: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
f4e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
f4f0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  to check if this
f500: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a   is an EXPLAIN *
f510: 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64  /.  int *abYield
f520: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f530: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
f540: 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64  p is an OP_Yield
f550: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
f560: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f570: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
f580: 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69  ed size of p->ai
f590: 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c  Indent[], abYiel
f5a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20  d */.  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 2f 2a 20 49 6e 64 65 78 20         /* Index 
f5d0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  of operation in 
f5e0: 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  p->aiIndent[] */
f5f0: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
f600: 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65  azNext[] = { "Ne
f610: 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50  xt", "Prev", "VP
f620: 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22  rev", "VNext", "
f630: 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20 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 22 4e 65 78 74 49 66 4f          "NextIfO
f660: 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65  pen", "PrevIfOpe
f670: 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74  n", 0 };.  const
f680: 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d   char *azYield[]
f690: 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53   = { "Yield", "S
f6a0: 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22  eekLT", "SeekGT"
f6b0: 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a  , "RowSetRead",.
f6c0: 20 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 22 52 65 77              "Rew
f6e0: 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  ind", 0 };.  con
f6f0: 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b  st char *azGoto[
f700: 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20  ] = { "Goto", 0 
f710: 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  };..  /* Try to 
f720: 66 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68  figure out if th
f730: 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  is is really an 
f740: 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e  EXPLAIN statemen
f750: 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20  t. If this.  ** 
f760: 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69  cannot be verifi
f770: 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  ed, return early
f780: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
f790: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
f7a0: 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20  (pSql)!=8 ){.   
f7b0: 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
f7c0: 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
f7d0: 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  .  }.  zSql = sq
f7e0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b  lite3_sql(pSql);
f7f0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
f800: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a   return;.  for(z
f810: 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c  =zSql; *z==' ' |
f820: 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a  | *z=='\t' || *z
f830: 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\n' || *z=='\
f840: 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20  f' || *z=='\r'; 
f850: 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  z++);.  if( sqli
f860: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20  te3_strnicmp(z, 
f870: 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b  "explain", 7) ){
f880: 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
f890: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74  p->mode;.    ret
f8a0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  urn;.  }..  for(
f8b0: 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f  iOp=0; SQLITE_RO
f8c0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
f8d0: 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20  pSql); iOp++){. 
f8e0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
f8f0: 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
f900: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
f910: 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  l, 0);.    const
f920: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f   char *zOp = (co
f930: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
f940: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f950: 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ql, 1);..    /* 
f960: 53 65 74 20 70 32 20 74 6f 20 74 68 65 20 50 32  Set p2 to the P2
f970: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
f980: 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68  rrent opcode. Th
f990: 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  en, assuming tha
f9a0: 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61  t.    ** p2 is a
f9b0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  n instruction ad
f9c0: 64 72 65 73 73 2c 20 73 65 74 20 76 61 72 69 61  dress, set varia
f9d0: 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20  ble p2op to the 
f9e0: 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20  index of that.  
f9f0: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
fa00: 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74   in the aiIndent
fa10: 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64  [] array. p2 and
fa20: 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66   p2op may be dif
fa30: 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a  ferent if.    **
fa40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73   the current ins
fa50: 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74  truction is part
fa60: 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61   of a sub-progra
fa70: 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  m generated by a
fa80: 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69  n.    ** SQL tri
fa90: 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20  gger or foreign 
faa0: 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74  key.  */.    int
fab0: 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   p2 = sqlite3_co
fac0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33  lumn_int(pSql, 3
fad0: 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20  );.    int p2op 
fae0: 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64  = (p2 + (iOp-iAd
faf0: 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72  dr));..    /* Gr
fb00: 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65  ow the p->aiInde
fb10: 6e 74 20 61 72 72 61 79 20 61 73 20 72 65 71 75  nt array as requ
fb20: 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ired */.    if( 
fb30: 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  iOp>=nAlloc ){. 
fb40: 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20       if( iOp==0 
fb50: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ){.        /* Do
fb60: 20 66 75 72 74 68 65 72 20 76 65 72 66 69 63 61   further verfica
fb70: 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69  tion that this i
fb80: 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74  s explain output
fb90: 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20  .  Abort if.    
fba0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
fbb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74   */.        stat
fbc0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65  ic const char *e
fbd0: 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b  xplainCols[] = {
fbe0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 64 64  .           "add
fbf0: 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70  r", "opcode", "p
fc00: 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20  1", "p2", "p3", 
fc10: 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d  "p4", "p5", "com
fc20: 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20  ment" };.       
fc30: 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20   int jj;.       
fc40: 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72   for(jj=0; jj<Ar
fc50: 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43  raySize(explainC
fc60: 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  ols); jj++){.   
fc70: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
fc80: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  p(sqlite3_column
fc90: 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65  _name(pSql,jj),e
fca0: 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21  xplainCols[jj])!
fcb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fcc0: 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
fcd0: 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
fce0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
fcf0: 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pSql);.         
fd00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
fd10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
fd20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
fd30: 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20  Alloc += 100;.  
fd40: 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20      p->aiIndent 
fd50: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
fd60: 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49  realloc64(p->aiI
fd70: 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69  ndent, nAlloc*si
fd80: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
fd90: 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74    abYield = (int
fda0: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
fdb0: 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c  c64(abYield, nAl
fdc0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
fdd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69  ;.    }.    abYi
fde0: 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69  eld[iOp] = str_i
fdf0: 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59  n_array(zOp, azY
fe00: 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ield);.    p->ai
fe10: 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b  Indent[iOp] = 0;
fe20: 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20  .    p->nIndent 
fe30: 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66  = iOp+1;..    if
fe40: 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
fe50: 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20  Op, azNext) ){. 
fe60: 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b       for(i=p2op;
fe70: 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e   i<iOp; i++) p->
fe80: 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32  aiIndent[i] += 2
fe90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fea0: 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
feb0: 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f  , azGoto) && p2o
fec0: 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20  p<p->nIndent.   
fed0: 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32    && (abYield[p2
fee0: 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63  op] || sqlite3_c
fef0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
ff00: 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  2)).    ){.     
ff10: 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
ff20: 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
ff30: 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
ff40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49    }.  }..  p->iI
ff50: 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c  ndent = 0;.  sql
ff60: 69 74 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c  ite3_free(abYiel
ff70: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  d);.  sqlite3_re
ff80: 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a  set(pSql);.}../*
ff90: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72 72  .** Free the arr
ffa0: 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ay allocated by 
ffb0: 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
ffc0: 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
ffd0: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
ffe0: 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c  ata_delete(Shell
fff0: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c  State *p){.  sql
10000 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49  ite3_free(p->aiI
10010 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49  ndent);.  p->aiI
10020 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
10030 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  nIndent = 0;.  p
10040 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d  ->iIndent = 0;.}
10050 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
10060 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65  and restore .whe
10070 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c  retrace and .sel
10080 65 63 74 74 72 61 63 65 20 73 65 74 74 69 6e 67  ecttrace setting
10090 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
100a0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
100b0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
100c0 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
100d0 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74  RACE).extern int
100e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
100f0 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ace;.static int 
10100 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
10110 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
10120 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10130 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
10140 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
10150 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  ETRACE).extern i
10160 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  nt sqlite3WhereT
10170 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74  race;.static int
10180 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65   savedWhereTrace
10190 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ;.#endif.static 
101a0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62  void disable_deb
101b0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76  ug_trace_modes(v
101c0 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  oid){.#if define
101d0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
101e0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
101f0 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
10200 52 41 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c  RACE).  savedSel
10210 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74  ectTrace = sqlit
10220 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20  e3SelectTrace;. 
10230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
10240 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
10250 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
10260 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
10270 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
10280 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20  LE_WHERETRACE). 
10290 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65   savedWhereTrace
102a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 54   = sqlite3WhereT
102b0 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  race;.  sqlite3W
102c0 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23  hereTrace = 0;.#
102d0 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76  endif.}.static v
102e0 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75  oid restore_debu
102f0 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f  g_trace_modes(vo
10300 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
10310 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
10320 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
10330 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52  _ENABLE_SELECTTR
10340 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65  ACE).  sqlite3Se
10350 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61 76 65  lectTrace = save
10360 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
10370 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
10380 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
10390 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
103a0 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
103b0 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65  CE).  sqlite3Whe
103c0 72 65 54 72 61 63 65 20 3d 20 73 61 76 65 64 57  reTrace = savedW
103d0 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
103e0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  f.}../*.** Run a
103f0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10400 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
10410 69 64 20 65 78 65 63 5f 70 72 65 70 61 72 65 64  id exec_prepared
10420 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74  _stmt(.  ShellSt
10430 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *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 2f 2a 20 50 6f 69            /* Poi
10460 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
10470 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
10480 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 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 2f 2a 20 53 74 61 74           /* Stat
104b0 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20  ment to run */. 
104c0 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
104d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
104e0 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 20  **,char**,int*) 
104f0 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75    /* Callback fu
10500 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nction */.){.  i
10510 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72  nt rc;..  /* per
10520 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20 73  form the first s
10530 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c 20  tep.  this will 
10540 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20 20  tell us if we.  
10550 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  ** have a result
10560 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20   set or not and 
10570 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a  how wide it is..
10580 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
10590 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
105a0 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65  .  /* if we have
105b0 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e   a result set...
105c0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
105d0 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
105e0 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20    /* if we have 
105f0 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 2a 2f  a callback... */
10600 0a 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61  .    if( xCallba
10610 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  ck ){.      /* a
10620 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
10630 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20  r col name ptr, 
10640 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74  value ptr, and t
10650 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ype */.      int
10660 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
10670 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
10680 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  mt);.      void 
10690 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  *pData = sqlite3
106a0 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c  _malloc64(3*nCol
106b0 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68  *sizeof(const ch
106c0 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 20  ar*) + 1);.     
106d0 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a 20   if( !pData ){. 
106e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
106f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
10710 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28  har **azCols = (
10720 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20 20  char **)pData;  
10730 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20      /* Names of 
10740 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
10750 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
10760 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c  *azVals = &azCol
10770 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f  s[nCol];       /
10780 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  * Results */.   
10790 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65       int *aiType
107a0 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61  s = (int *)&azVa
107b0 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73  ls[nCol]; /* Res
107c0 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ult types */.   
107d0 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20       int i, x;. 
107e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69         assert(si
107f0 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a  zeof(int) <= siz
10800 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20  eof(char *));.  
10810 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66        /* save of
10820 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e  f ptrs to column
10830 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20   names */.      
10840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
10850 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
10860 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28     azCols[i] = (
10870 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
10880 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
10890 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , i);.        }.
108a0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
108b0 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74        /* extract
108c0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64 61   the data and da
108d0 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20  ta types */.    
108e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
108f0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10900 20 20 20 20 20 20 20 20 20 61 69 54 79 70 65 73           aiTypes
10910 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65  [i] = x = sqlite
10920 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
10930 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
10940 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c 49       if( x==SQLI
10950 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67 20  TE_BLOB && pArg 
10960 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d  && pArg->cMode==
10970 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20  MODE_Insert ){. 
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56               azV
10990 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20  als[i] = "";.   
109a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
109c0 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a  Vals[i] = (char*
109d0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
109e0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a  text(pStmt, i);.
109f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
10a00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
10a10 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54  zVals[i] && (aiT
10a20 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f  ypes[i]!=SQLITE_
10a30 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
10a40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10a50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10a60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f          break; /
10a70 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20  * from for */.  
10a80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10a90 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66        } /* end f
10aa0 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  or */..         
10ab0 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20   /* if data and 
10ac0 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20  types extracted 
10ad0 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20  successfully... 
10ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
10af0 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
10b00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
10b10 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70   /* call the sup
10b20 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77  plied callback w
10b30 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 72  ith the result r
10b40 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20  ow data */.     
10b50 20 20 20 20 20 20 20 69 66 28 20 78 43 61 6c 6c         if( xCall
10b60 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c  back(pArg, nCol,
10b70 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c   azVals, azCols,
10b80 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20   aiTypes) ){.   
10b90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
10ba0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
10bb0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
10bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
10bd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
10be0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
10bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10c00 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69   }.        } whi
10c10 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
10c20 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  = rc );.        
10c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
10c40 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
10c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
10c60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10c70 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
10c80 74 29 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c  t);.      } whil
10c90 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  e( rc == SQLITE_
10ca0 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ROW );.    }.  }
10cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
10cc0 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  e a statement or
10cd0 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e   set of statemen
10ce0 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e  ts.  Print.** an
10cf0 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f  y result rows/co
10d00 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20  lumns depending 
10d10 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  on the current m
10d20 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74  ode.** set via t
10d30 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c  he supplied call
10d40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
10d50 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
10d60 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69   to SQLite's bui
10d70 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78  lt-in sqlite3_ex
10d80 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ec().** function
10d90 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73   except it takes
10da0 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66   a slightly diff
10db0 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a  erent callback.*
10dc0 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64  * and callback d
10dd0 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ata argument..*/
10de0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
10df0 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65  l_exec(.  sqlite
10e00 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
10e30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
10e40 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st 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 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
10e70 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f   be evaluated */
10e80 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
10e90 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
10ea0 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a  ar**,char**,int*
10eb0 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  ),   /* Callback
10ec0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   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 2f 2a 20 28 6e 6f 74           /* (not
10f00 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
10f10 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20  ite3_exec) */.  
10f20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
10f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10f50 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
10f60 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
10f70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
10fa0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
10fb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
10fc0 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
10fd0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
10fe0 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
10ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11000 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
11010 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
11020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20   */.  int rc2;. 
11030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65   const char *zLe
11040 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20  ftover;         
11050 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72   /* Tail of unpr
11060 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a  ocessed SQL */..
11070 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
11080 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
11090 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 77  = NULL;.  }..  w
110a0 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26  hile( zSql[0] &&
110b0 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72   (SQLITE_OK == r
110c0 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  c) ){.    static
110d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
110e0 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20  mtSql;.    rc = 
110f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
11100 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
11110 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f   &pStmt, &zLefto
11120 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ver);.    if( SQ
11130 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b  LITE_OK != rc ){
11140 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72  .      if( pzErr
11150 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
11160 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
11170 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
11180 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
11190 20 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74        if( !pStmt
111a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
111b0 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
111c0 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69  a comment or whi
111d0 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te-space */.    
111e0 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
111f0 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
11200 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
11210 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
11220 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
11230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11240 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74  zStmtSql = sqlit
11250 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
11260 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71       if( zStmtSq
11270 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20  l==0 ) zStmtSql 
11280 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c  = "";.      whil
11290 65 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74  e( IsSpace(zStmt
112a0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53  Sql[0]) ) zStmtS
112b0 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ql++;..      /* 
112c0 73 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65  save off the pre
112d0 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68  pared statment h
112e0 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20  andle and reset 
112f0 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
11300 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
11310 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
11320 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
11330 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20      pArg->cnt = 
11340 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
11350 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71    /* echo the sq
11360 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65  l statement if e
11370 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cho on */.      
11380 69 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c  if( pArg && Shel
11390 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53  lHasFlag(pArg, S
113a0 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20  HFLG_Echo) ){.  
113b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
113c0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73  f(pArg->out, "%s
113d0 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20  \n", zStmtSql ? 
113e0 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29  zStmtSql : zSql)
113f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11400 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50   /* Show the EXP
11410 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
11420 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f  if .eqp is on */
11430 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
11440 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  && pArg->autoEQP
11450 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
11460 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a  ike("EXPLAIN%",z
11470 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b  StmtSql,0)!=0 ){
11480 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11490 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b  _stmt *pExplain;
114a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
114b0 45 51 50 3b 0a 20 20 20 20 20 20 20 20 64 69 73  EQP;.        dis
114c0 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
114d0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
114e0 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33    zEQP = sqlite3
114f0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
11500 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
11510 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
11520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11530 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
11540 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
11550 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
11560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11580 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
11590 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d  step(pExplain)==
115a0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
115b0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
115c0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22  intf(pArg->out,"
115d0 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c 73 71 6c  --EQP-- %d,",sql
115e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
115f0 70 45 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a 20  pExplain, 0));. 
11600 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
11610 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11620 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63  "%d,", sqlite3_c
11630 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
11640 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20  in, 1));.       
11650 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
11660 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c  pArg->out,"%d,",
11670 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11680 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29  int(pExplain, 2)
11690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
116a0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  tf8_printf(pArg-
116b0 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73 71 6c  >out,"%s\n", sql
116c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
116d0 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 29 3b 0a  (pExplain, 3));.
116e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
116f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11700 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11710 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
11720 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11730 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
11740 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
11750 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =2 ){.          
11760 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58  /* Also do an EX
11770 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20  PLAIN for ".eqp 
11780 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20  full" mode */.  
11790 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73          zEQP = s
117a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
117b0 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74  EXPLAIN %s", zSt
117c0 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
117d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
117e0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
117f0 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
11800 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
11810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11830 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
11840 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
11850 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
11860 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70  n_data_prepare(p
11870 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a  Arg, pExplain);.
11880 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63              exec
11890 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70  _prepared_stmt(p
118a0 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 2c 20 78  Arg, pExplain, x
118b0 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
118c0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
118d0 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29  ata_delete(pArg)
118e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
118f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11900 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
11910 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
11920 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
11930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11940 20 20 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75      restore_debu
11950 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b  g_trace_modes();
11960 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11970 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
11980 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
11990 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20  = pArg->mode;.  
119a0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
119b0 61 75 74 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20  autoExplain.    
119c0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
119d0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
119e0 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20  mt)==8.         
119f0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
11a00 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a  ke("EXPLAIN%", z
11a10 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20  StmtSql,0)==0.  
11a20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
11a30 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d     pArg->cMode =
11a40 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20   MODE_Explain;. 
11a50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11a60 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65 6c    /* If the shel
11a70 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  l is currently i
11a80 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64  n ".explain" mod
11a90 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65 78  e, gather the ex
11aa0 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  tra.        ** d
11ab0 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f 20  ata required to 
11ac0 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20 74  add indents to t
11ad0 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20  he output.*/.   
11ae0 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 63       if( pArg->c
11af0 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  Mode==MODE_Expla
11b00 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
11b10 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
11b20 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d 74  pare(pArg, pStmt
11b30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11b40 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 65 63     }..      exec
11b50 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70  _prepared_stmt(p
11b60 41 72 67 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c  Arg, pStmt, xCal
11b70 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 65 78  lback);.      ex
11b80 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74  plain_data_delet
11b90 65 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20  e(pArg);..      
11ba0 2f 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73  /* print usage s
11bb0 74 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e  tats if stats on
11bc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
11bd0 72 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74  rg && pArg->stat
11be0 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64  sOn ){.        d
11bf0 69 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c  isplay_stats(db,
11c00 20 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20   pArg, 0);.     
11c10 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69   }..      /* pri
11c20 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73  nt loop-counters
11c30 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
11c40 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
11c50 26 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74  & pArg->scanstat
11c60 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64  sOn ){.        d
11c70 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
11c80 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20  (db, pArg);.    
11c90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
11ca0 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65  nalize the state
11cb0 6d 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74  ment just execut
11cc0 65 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c  ed. If this fail
11cd0 73 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20  s, save a.      
11ce0 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65  ** copy of the e
11cf0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74  rror message. Ot
11d00 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71  herwise, set zSq
11d10 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  l to point to th
11d20 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20  e.      ** next 
11d30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  statement to exe
11d40 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  cute. */.      r
11d50 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
11d60 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
11d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11d80 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20  TE_NOMEM ) rc = 
11d90 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc2;.      if( r
11da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11db0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
11dc0 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
11dd0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
11de0 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
11df0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
11e00 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
11e10 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
11e20 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67  g = save_err_msg
11e30 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  (db);.      }.. 
11e40 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61       /* clear sa
11e50 76 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20  ved stmt handle 
11e60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
11e70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
11e80 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  g->pStmt = NULL;
11e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11ea0 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20   } /* end while 
11eb0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  */..  return rc;
11ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
11ed0 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75  e memory previou
11ee0 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
11ef0 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74   tableColumnList
11f00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
11f10 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  id freeColumnLis
11f20 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  t(char **azCol){
11f30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
11f40 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69  i=1; azCol[i]; i
11f50 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
11f60 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b  _free(azCol[i]);
11f70 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b  .  }.  /* azCol[
11f80 30 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73  0] is a static s
11f90 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  tring */.  sqlit
11fa0 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a  e3_free(azCol);.
11fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11fc0 61 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65  a list of pointe
11fd0 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68  rs to strings wh
11fe0 69 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65  ich are the name
11ff0 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75  s of all.** colu
12000 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61  mns in table zTa
12010 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  b.   The memory 
12020 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
12030 73 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  s is dynamically
12040 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
12050 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73  d must be releas
12060 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
12070 20 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75   using a subsequ
12080 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  ent call.** to f
12090 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  reeColumnList().
120a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c  .**.** The azCol
120b0 5b 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75  [0] entry is usu
120c0 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65  ally NULL.  Howe
120d0 76 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e  ver, if zTab con
120e0 74 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a  tains a rowid.**
120f0 20 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64   value that need
12100 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
12110 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d  d, then azCol[0]
12120 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
12130 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  th the.** name o
12140 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  f the rowid colu
12150 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  mn..**.** The fi
12160 72 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  rst regular colu
12170 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
12180 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68  is azCol[1].  Th
12190 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e  e list is termin
121a0 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e  ated.** by an en
121b0 74 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69  try with azCol[i
121c0 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ]==0..*/.static 
121d0 63 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75  char **tableColu
121e0 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74  mnList(ShellStat
121f0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
12200 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20   *zTab){.  char 
12210 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73  **azCol = 0;.  s
12220 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
12230 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt;.  char *zSql
12240 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  ;.  int nCol = 0
12250 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  ;.  int nAlloc =
12260 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20   0;.  int nPK = 
12270 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
12280 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45  er of PRIMARY KE
12290 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a  Y columns seen *
122a0 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20  /.  int isIPK = 
122b0 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
122c0 66 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45  f one PRIMARY KE
122d0 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65  Y column of type
122e0 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e   INTEGER */.  in
122f0 74 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  t preserveRowid 
12300 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  = ShellHasFlag(p
12310 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
12320 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63  Rowid);.  int rc
12330 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
12340 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
12350 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
12360 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20  Q", zTab);.  rc 
12370 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
12380 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
12390 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
123a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
123b0 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63  (zSql);.  if( rc
123c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
123d0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
123e0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
123f0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
12400 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20   nCol>=nAlloc-2 
12410 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  ){.      nAlloc 
12420 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f  = nAlloc*2 + nCo
12430 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a  l + 10;.      az
12440 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Col = sqlite3_re
12450 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c  alloc(azCol, nAl
12460 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  loc*sizeof(azCol
12470 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
12480 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
12490 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
124a0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
124b0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
124c0 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
124d0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
124e0 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43  }.    azCol[++nC
124f0 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ol] = sqlite3_mp
12500 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
12510 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
12520 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20  pStmt, 1));.    
12530 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
12540 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29  mn_int(pStmt, 5)
12550 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b   ){.      nPK++;
12560 0a 20 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d  .      if( nPK==
12570 31 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  1.       && sqli
12580 74 65 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e  te3_stricmp((con
12590 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
125a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
125b0 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20  mt,2),.         
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
125e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
125f0 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20  isIPK = 1;.     
12600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12610 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20  isIPK = 0;.     
12620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
12630 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
12640 70 53 74 6d 74 29 3b 0a 20 20 61 7a 43 6f 6c 5b  pStmt);.  azCol[
12650 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b  0] = 0;.  azCol[
12660 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20  nCol+1] = 0;..  
12670 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e 20  /* The decision 
12680 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
12690 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c 79  t a rowid really
126a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
126b0 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20 74  served.  ** is t
126c0 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65 72  ricky.  We never
126d0 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76   need to preserv
126e0 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61 20  e a rowid for a 
126f0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
12700 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74 61  ble.  ** or a ta
12710 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54 45  ble with an INTE
12720 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
12730 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65 20    We are unable 
12740 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a 2a  to preserve.  **
12750 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c 65   rowids on table
12760 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77 69  s where the rowi
12770 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62 6c  d is inaccessibl
12780 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  e because there 
12790 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 63  are other.  ** c
127a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
127b0 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69 64  ble named "rowid
127c0 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61 6e  ", "_rowid_", an
127d0 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20 20  d "oid"..  */.  
127e0 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69  if( preserveRowi
127f0 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20 20  d && isIPK ){.  
12800 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c 65    /* If a single
12810 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
12820 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49 4e  umn with type IN
12830 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c 20  TEGER was seen, 
12840 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d  then it.    ** m
12850 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73 65  ight be an alise
12860 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 20   for the ROWID. 
12870 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61 6c   But it might al
12880 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54 20  so be a WITHOUT 
12890 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61 62  ROWID.    ** tab
128a0 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52 20  le or a INTEGER 
128b0 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53 43  PRIMARY KEY DESC
128c0 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65 72   column, neither
128d0 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20 20   of which are.  
128e0 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61 73    ** ROWID alias
128f0 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67 75  es.  To distingu
12900 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73 2c  ish these cases,
12910 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
12920 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
12930 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69 6e   a "pk" entry in
12940 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c   "PRAGMA index_l
12950 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69 6c  ist".  There wil
12960 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20 22  l be.    ** no "
12970 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68 65  pk" index if the
12980 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65 61   PRIMARY KEY rea
12990 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73 20  lly is an alias 
129a0 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  for the ROWID.. 
129b0 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d     */.    zSql =
129c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
129d0 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
129e0 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69 73  pragma_index_lis
129f0 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20 20  t(%Q)".         
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69 6e    " WHERE origin
12a20 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a 20  ='pk'", zTab);. 
12a30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12a40 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
12a50 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
12a60 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
12a70 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
12a80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12a90 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69      freeColumnLi
12aa0 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  st(azCol);.     
12ab0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
12ac0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12ad0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
12ae0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
12af0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
12b00 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20  preserveRowid = 
12b10 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  rc==SQLITE_ROW;.
12b20 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65 72    }.  if( preser
12b30 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 2f  veRowid ){.    /
12b40 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65 20  * Only preserve 
12b50 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65 20  the rowid if we 
12b60 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65 20  can find a name 
12b70 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20  to use for the. 
12b80 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a 20     ** rowid */. 
12b90 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
12ba0 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22 72  azRowid[] = { "r
12bb0 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22  owid", "_rowid_"
12bc0 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20 69  , "oid" };.    i
12bd0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
12be0 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
12bf0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
12c00 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  i<=nCol; i++){. 
12c10 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12c20 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f 77  e3_stricmp(azRow
12c30 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d  id[j],azCol[i])=
12c40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12c50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
12c60 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
12c70 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
12c80 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  , we know that a
12c90 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f 74  zRowid[j] is not
12ca0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79   the name of any
12cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 69  .        ** ordi
12cc0 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  nary column in t
12cd0 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69 66  he table.  Verif
12ce0 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  y that azRowid[j
12cf0 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20 20  ] is a valid.   
12d00 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72       ** name for
12d10 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f 72   the rowid befor
12d20 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20 61  e adding it to a
12d30 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f 55  zCol[0].  WITHOU
12d40 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20  T ROWID.        
12d50 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 66  ** tables will f
12d60 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63 68  ail this last ch
12d70 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  eck */.        r
12d80 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
12d90 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
12da0 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c 61  a(p->db,0,zTab,a
12db0 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c  zRowid[j],0,0,0,
12dc0 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  0,0);.        if
12dd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12de0 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52  ) azCol[0] = azR
12df0 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  owid[j];.       
12e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12e10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12e20 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn azCol;.}../*.
12e30 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72 65  ** Toggle the re
12e40 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
12e50 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67 2e  selects setting.
12e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12e70 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
12e80 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
12e90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12ea0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
12eb0 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a 20   iSetting = 0;. 
12ec0 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30 5d   char zStmt[100]
12ed0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
12ee0 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47  are_v2(db, "PRAG
12ef0 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
12f00 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20 2d  ered_selects", -
12f10 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
12f20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
12f30 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
12f40 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65 74  _ROW ){.    iSet
12f50 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 63  ting = sqlite3_c
12f60 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
12f70 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
12f80 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12f90 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  t);.  sqlite3_sn
12fa0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
12fb0 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20 20  tmt), zStmt,.   
12fc0 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76 65      "PRAGMA reve
12fd0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
12fe0 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53 65  lects(%d)", !iSe
12ff0 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  tting);.  sqlite
13000 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d 74  3_exec(db, zStmt
13010 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  , 0, 0, 0);.}../
13020 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
13030 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63  ifferent callbac
13040 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 66  k routine used f
13050 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20 64  or dumping the d
13060 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68  atabase..** Each
13070 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62 79   row received by
13080 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 63   this callback c
13090 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61 62  onsists of a tab
130a0 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20  le name,.** the 
130b0 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e 64  table type ("ind
130c0 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29 20  ex" or "table") 
130d0 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61 74  and SQL to creat
130e0 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  e the table..** 
130f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
13100 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20 73  uld print text s
13110 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65 63  ufficient to rec
13120 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e  reate the table.
13130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
13140 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69  ump_callback(voi
13150 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
13160 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
13170 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73 65   char **azNotUse
13180 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
13190 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
131a0 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le;.  const char
131b0 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74   *zType;.  const
131c0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
131d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
131e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41 72  ShellState *)pAr
131f0 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g;..  UNUSED_PAR
13200 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65 64  AMETER(azNotUsed
13210 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33  );.  if( nArg!=3
13220 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20 72   || azArg==0 ) r
13230 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62 6c  eturn 0;.  zTabl
13240 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
13250 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zType = azArg[1]
13260 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67  ;.  zSql = azArg
13270 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72 63  [2];..  if( strc
13280 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
13290 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
132a0 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
132b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45  tf(p->out, "DELE
132c0 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  TE FROM sqlite_s
132d0 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20  equence;\n");.  
132e0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
132f0 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74  3_strglob("sqlit
13300 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65  e_stat?", zTable
13310 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  )==0 ){.    raw_
13320 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
13330 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
13340 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65  aster;\n");.  }e
13350 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
13360 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
13370 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
13380 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
13390 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
133a0 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  ql, "CREATE VIRT
133b0 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d  UAL TABLE", 20)=
133c0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
133d0 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70  zIns;.    if( !p
133e0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
133f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
13400 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
13410 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
13420 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  hema=ON;\n");.  
13430 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
13440 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d  chema = 1;.    }
13450 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69  .    zIns = sqli
13460 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
13470 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
13480 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74   sqlite_master(t
13490 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
134a0 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22  e,rootpage,sql)"
134b0 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  .       "VALUES(
134c0 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71  'table','%q','%q
134d0 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20  ',0,'%q');",.   
134e0 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62      zTable, zTab
134f0 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 75  le, zSql);.    u
13500 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
13510 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29  t, "%s\n", zIns)
13520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13530 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65  ee(zIns);.    re
13540 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
13550 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61  .    printSchema
13560 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53 71  Line(p->out, zSq
13570 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a  l, ";\n");.  }..
13580 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79    if( strcmp(zTy
13590 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20  pe, "table")==0 
135a0 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  ){.    ShellText
135b0 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68   sSelect;.    Sh
135c0 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b 0a  ellText sTable;.
135d0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
135e0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
135f0 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73 74   char *savedDest
13600 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 73  Table;.    int s
13610 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20 61  avedMode;..    a
13620 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c 75  zCol = tableColu
13630 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c 65  mnList(p, zTable
13640 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
13650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
13660 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
13670 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
13680 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f     /* Always quo
13690 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
136a0 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61 70  e, even if it ap
136b0 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72 65  pears to be pure
136c0 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69   ascii,.    ** i
136d0 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20 6b  n case it is a k
136e0 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53  eyword. Ex:  INS
136f0 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65 22  ERT INTO "table"
13700 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69 74   ... */.    init
13710 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20  Text(&sTable);. 
13720 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
13730 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 71  Table, zTable, q
13740 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29  uoteChar(zTable)
13750 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72 65  );.    /* If pre
13760 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77 69  serving the rowi
13770 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20  d, add a column 
13780 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20 74  list after the t
13790 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 2a  able name..    *
137a0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
137b0 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  :  "INSERT INTO 
137c0 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c  tab(rowid,a,b,c,
137d0 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e 29  ...) VALUES(...)
137e0 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64  ".    ** instead
137f0 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22 49   of the usual "I
13800 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20 56  NSERT INTO tab V
13810 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20 20  ALUES(...)"..   
13820 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   */.    if( azCo
13830 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70  l[0] ){.      ap
13840 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
13850 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  , "(", 0);.     
13860 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
13870 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ble, azCol[0], 0
13880 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
13890 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
138a0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
138b0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 2c  Text(&sTable, ",
138c0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
138d0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
138e0 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f  e, azCol[i], quo
138f0 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29  teChar(azCol[i])
13900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13910 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
13920 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20  ble, ")", 0);.  
13930 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c    }..    /* Buil
13940 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  d an appropriate
13950 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13960 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78  t */.    initTex
13970 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
13980 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
13990 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22 2c  lect, "SELECT ",
139a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43   0);.    if( azC
139b0 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
139c0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
139d0 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29  ct, azCol[0], 0)
139e0 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
139f0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22  xt(&sSelect, ","
13a00 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
13a10 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
13a20 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ]; i++){.      a
13a30 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
13a40 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  ct, azCol[i], qu
13a50 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
13a60 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
13a70 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  Col[i+1] ){.    
13a80 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
13a90 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29  sSelect, ",", 0)
13aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13ab0 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69      freeColumnLi
13ac0 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 61  st(azCol);.    a
13ad0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
13ae0 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30 29  ct, " FROM ", 0)
13af0 3b 0a 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 7a 54 61 62 6c  (&sSelect, zTabl
13b10 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61  e, quoteChar(zTa
13b20 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76 65  ble));..    save
13b30 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d 3e  dDestTable = p->
13b40 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  zDestTable;.    
13b50 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d  savedMode = p->m
13b60 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  ode;.    p->zDes
13b70 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65 2e  tTable = sTable.
13b80 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  z;.    p->mode =
13b90 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45   p->cMode = MODE
13ba0 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20  _Insert;.    rc 
13bb0 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e  = shell_exec(p->
13bc0 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73  db, sSelect.z, s
13bd0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
13be0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
13bf0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
13c00 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
13c10 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
13c20 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
13c30 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
13c40 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
13c50 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
13c60 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
13c70 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e    shell_exec(p->
13c80 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73  db, sSelect.z, s
13c90 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
13ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  , 0);.      togg
13cb0 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
13cc0 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >db);.    }.    
13cd0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
13ce0 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
13cf0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61      p->mode = sa
13d00 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65  vedMode;.    fre
13d10 65 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  eText(&sTable);.
13d20 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 53      freeText(&sS
13d30 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
13d40 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  rc ) p->nErr++;.
13d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
13d60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75  }../*.** Run zQu
13d70 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63  ery.  Use dump_c
13d80 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65  allback() as the
13d90 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
13da0 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  e so that.** the
13db0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13dc0 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70 75   query are outpu
13dd0 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65  t as SQL stateme
13de0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nts..**.** If we
13df0 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f   get a SQLITE_CO
13e00 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72  RRUPT error, rer
13e10 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66 74  un the query aft
13e20 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20  er appending.** 
13e30 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
13e40 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64  DESC" to the end
13e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13e60 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
13e70 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
13e80 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20  ate *p,.  const 
13e90 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a  char *zQuery.){.
13ea0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
13eb0 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72 63   *zErr = 0;.  rc
13ec0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
13ed0 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64  p->db, zQuery, d
13ee0 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
13ef0 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72   &zErr);.  if( r
13f00 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
13f10 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
13f20 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20  Q2;.    int len 
13f30 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72  = strlen30(zQuer
13f40 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  y);.    raw_prin
13f50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
13f60 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45  *** CORRUPTION E
13f70 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  RROR *******/\n"
13f80 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20  );.    if( zErr 
13f90 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
13fa0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
13fb0 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  ***** %s ******/
13fc0 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
13fd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13fe0 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45 72 72  Err);.      zErr
13ff0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14000 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65  zQ2 = malloc( le
14010 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28  n+100 );.    if(
14020 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e   zQ2==0 ) return
14030 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
14040 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30  _snprintf(len+10
14050 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45  0, zQ2, "%s ORDE
14060 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
14070 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  , zQuery);.    r
14080 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
14090 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d  (p->db, zQ2, dum
140a0 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  p_callback, p, &
140b0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
140c0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
140d0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
140e0 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25  /****** ERROR: %
140f0 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
14100 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rr);.    }else{.
14110 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14120 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  E_CORRUPT;.    }
14130 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14140 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66 72 65  e(zErr);.    fre
14150 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65  e(zQ2);.  }.  re
14160 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14170 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70  * Text of a help
14180 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74   message.*/.stat
14190 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20  ic char zHelp[] 
141a0 3d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  =.#ifndef SQLITE
141b0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
141c0 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c  ION.  ".auth ON|
141d0 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 53 68  OFF           Sh
141e0 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ow authorizer ca
141f0 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64 69  llbacks\n".#endi
14200 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  f.  ".backup ?DB
14210 3f 20 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b  ? FILE      Back
14220 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  up DB (default \
14230 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45  "main\") to FILE
14240 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c  \n".  ".bail on|
14250 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 53 74  off           St
14260 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67  op after hitting
14270 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61   an error.  Defa
14280 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62  ult OFF\n".  ".b
14290 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20  inary on|off    
142a0 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79       Turn binary
142b0 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66   output on or of
142c0 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  f.  Default OFF\
142d0 6e 22 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54  n".  ".cd DIRECT
142e0 4f 52 59 20 20 20 20 20 20 20 20 20 20 43 68 61  ORY          Cha
142f0 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20  nge the working 
14300 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52  directory to DIR
14310 45 43 54 4f 52 59 5c 6e 22 0a 20 20 22 2e 63 68  ECTORY\n".  ".ch
14320 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20  anges on|off    
14330 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20      Show number 
14340 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20  of rows changed 
14350 62 79 20 53 51 4c 5c 6e 22 0a 20 20 22 2e 63 68  by SQL\n".  ".ch
14360 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20  eck GLOB        
14370 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70      Fail if outp
14380 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61  ut since .testca
14390 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
143a0 68 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e  h\n".  ".clone N
143b0 45 57 44 42 20 20 20 20 20 20 20 20 20 20 20 43  EWDB           C
143c0 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e  lone data into N
143d0 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78  EWDB from the ex
143e0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c  isting database\
143f0 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  n".  ".databases
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
14410 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
14420 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
14430 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64  tabases\n".  ".d
14440 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20  binfo ?DB?      
14450 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75 73       Show status
14460 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
14470 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 5c  ut the database\
14480 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42  n".  ".dump ?TAB
14490 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d  LE? ...      Dum
144a0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  p the database i
144b0 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f  n an SQL text fo
144c0 72 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20  rmat\n".  "     
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
144f0 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d  cified, only dum
14500 70 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  p tables matchin
14510 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
14540 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f  BLE.\n".  ".echo
14550 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
14560 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
14570 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  cho on or off\n"
14580 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c  .  ".eqp on|off|
14590 66 75 6c 6c 20 20 20 20 20 20 20 45 6e 61 62 6c  full       Enabl
145a0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74  e or disable aut
145b0 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
145c0 55 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22  UERY PLAN\n".  "
145d0 2e 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20  .exit           
145e0 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
145f0 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 2f 2a 20 42   program\n"./* B
14600 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d  ecause explain m
14610 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74  ode comes on aut
14620 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20  omatically now, 
14630 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d  the ".explain" m
14640 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65  ode.** is remove
14650 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20  d from the help 
14660 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73  screen.  It is s
14670 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66  till supported f
14680 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76  or legacy, howev
14690 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69  er */./*".explai
146a0 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20  n ?on|off|auto? 
146b0 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
146c0 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
146d0 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74  ff or to automat
146e0 69 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c  ic\n"*/.  ".full
146f0 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74  schema ?--indent
14700 3f 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e  ? Show schema an
14710 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
14720 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62   sqlite_stat tab
14730 6c 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65  les\n".  ".heade
14740 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
14750 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
14760 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
14770 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20  ff\n".  ".help  
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67  Show this messag
147a0 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20  e\n".  ".import 
147b0 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49  FILE TABLE     I
147c0 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
147d0 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c  FILE into TABLE\
147e0 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n".#ifndef SQLIT
147f0 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
14800 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72  ROL.  ".imposter
14810 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 43 72   INDEX TABLE  Cr
14820 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61  eate imposter ta
14830 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64  ble TABLE on ind
14840 65 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64  ex INDEX\n".#end
14850 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f  if.  ".indexes ?
14860 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f  TABLE?       Sho
14870 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69  w names of all i
14880 6e 64 65 78 65 73 5c 6e 22 0a 20 20 22 20 20 20  ndexes\n".  "   
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
148b0 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
148c0 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 20  how indexes for 
148d0 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20  tables\n".  "   
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c        matching L
14900 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
14910 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c  E.\n".#ifdef SQL
14920 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
14930 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46  CE.  ".iotrace F
14940 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61  ILE          Ena
14950 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
14960 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
14970 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  LE\n".#endif.  "
14980 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f  .limit ?LIMIT? ?
14990 56 41 4c 3f 20 20 20 44 69 73 70 6c 61 79 20 6f  VAL?   Display o
149a0 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  r change the val
149b0 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f  ue of an SQLITE_
149c0 4c 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e  LIMIT\n".  ".lin
149d0 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20  t OPTIONS       
149e0 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74     Report potent
149f0 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65  ial schema issue
14a00 73 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20  s. Options:\n". 
14a10 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
14a20 20 20 20 20 20 20 20 20 20 20 20 66 6b 65 79 2d             fkey-
14a30 69 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64  indexes     Find
14a40 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e   missing foreign
14a50 20 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a   key indexes\n".
14a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14a70 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
14a80 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45  ON.  ".load FILE
14a90 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61   ?ENTRY?     Loa
14aa0 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c  d an extension l
14ab0 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66  ibrary\n".#endif
14ac0 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66  .  ".log FILE|of
14ad0 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
14ae0 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  logging on or of
14af0 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20  f.  FILE can be 
14b00 73 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22  stderr/stdout\n"
14b10 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f  .  ".mode MODE ?
14b20 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f  TABLE?     Set o
14b30 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65  utput mode where
14b40 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a   MODE is one of:
14b50 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73  ascii    Columns
14b80 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20  /rows delimited 
14b90 62 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45  by 0x1F and 0x1E
14ba0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73  csv      Comma-s
14bd0 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c  eparated values\
14be0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
14c00 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
14c10 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
14c20 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20  See .width)\n". 
14c30 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
14c40 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20             html 
14c50 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e      HTML <table>
14c60 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   code\n".  "    
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
14c90 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
14ca0 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22  nts for TABLE\n"
14cb0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
14cd0 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
14ce0 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20  per line\n".  " 
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20          list    
14d10 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65   Values delimite
14d20 64 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20  d by \"|\"\n".  
14d30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
14d40 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 20            quote 
14d50 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72     Escape answer
14d60 73 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a  s as for SQL\n".
14d70 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
14d80 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73              tabs
14d90 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
14da0 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20           tcl    
14dd0 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65    TCL list eleme
14de0 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76  nts\n".  ".nullv
14df0 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
14e00 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70   Use STRING in p
14e10 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c  lace of NULL val
14e20 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20  ues\n".  ".once 
14e30 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20  FILENAME        
14e40 20 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20   Output for the 
14e50 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  next SQL command
14e60 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 4e 41 4d   only to FILENAM
14e70 45 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f  E\n".  ".open ?O
14e80 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43  PTIONS? ?FILE? C
14e90 6c 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61  lose existing da
14ea0 74 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65  tabase and reope
14eb0 6e 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20  n FILE\n".  "   
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20        The --new 
14ee0 6f 70 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69  option starts wi
14ef0 74 68 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  th an empty file
14f00 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f  \n".  ".output ?
14f10 46 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20 53 65  FILENAME?     Se
14f20 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
14f30 45 4e 41 4d 45 20 6f 72 20 73 74 64 6f 75 74 5c  ENAME or stdout\
14f40 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  n".  ".print STR
14f50 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69  ING...       Pri
14f60 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
14f70 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  G\n".  ".prompt 
14f80 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
14f90 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
14fa0 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
14fb0 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
14fc0 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
14fd0 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
14fe0 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
14ff0 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
15000 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
15010 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
15020 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
15030 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
15040 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
15050 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
15060 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45  n".  ".save FILE
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
15080 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
15090 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c  abase into FILE\
150a0 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73  n".  ".scanstats
150b0 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54 75 72   on|off      Tur
150c0 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  n sqlite3_stmt_s
150d0 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72  canstatus() metr
150e0 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ics on or off\n"
150f0 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54  .  ".schema ?PAT
15100 54 45 52 4e 3f 20 20 20 20 20 20 53 68 6f 77 20  TERN?      Show 
15110 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
15120 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50  ments matching P
15130 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20  ATTERN\n".  "   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 20 20 20 20 41 64 64 20 2d 2d 69 6e 64         Add --ind
15160 65 6e 74 20 66 6f 72 20 70 72 65 74 74 79 2d 70  ent for pretty-p
15170 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73  rinting\n".  ".s
15180 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f  elftest ?--init?
15190 20 20 20 20 20 52 75 6e 20 74 65 73 74 73 20 64       Run tests d
151a0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45  efined in the SE
151b0 4c 46 54 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a  LFTEST table\n".
151c0 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f    ".separator CO
151d0 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e 67 65  L ?ROW?   Change
151e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
151f0 72 61 74 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e  rator and option
15200 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a  ally the row\n".
15210 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
15220 20 20 20 20 20 20 20 20 20 20 20 20 73 65 70 61              sepa
15230 72 61 74 6f 72 20 66 6f 72 20 62 6f 74 68 20 74  rator for both t
15240 68 65 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61  he output mode a
15250 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69  nd .import\n".#i
15260 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
15270 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
15280 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44  .  ".session CMD
15290 20 2e 2e 2e 20 20 20 20 20 20 20 43 72 65 61 74   ...       Creat
152a0 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
152b0 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  sions\n".#endif.
152c0 20 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54    ".sha3sum ?OPT
152d0 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74  IONS...?  Comput
152e0 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66  e a SHA3 hash of
152f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
15300 74 5c 6e 22 0a 20 20 22 2e 73 68 65 6c 6c 20 43  t\n".  ".shell C
15310 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52  MD ARGS...     R
15320 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
15330 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
15340 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  \n".  ".show    
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
15360 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
15370 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75  alues for variou
15380 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20  s settings\n".  
15390 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f  ".stats ?on|off?
153a0 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
153b0 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
153c0 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
153d0 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47  ".system CMD ARG
153e0 53 2e 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44 20  S...    Run CMD 
153f0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
15400 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22  tem shell\n".  "
15410 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20  .tables ?TABLE? 
15420 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
15430 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20  s of tables\n". 
15440 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
15450 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
15460 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
15470 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20  nly list tables 
15480 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
154b0 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
154c0 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45   ".testcase NAME
154d0 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72           Begin r
154e0 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75  edirecting outpu
154f0 74 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f  t to 'testcase-o
15500 75 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22 2e 74  ut.txt'\n".  ".t
15510 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
15520 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67       Try opening
15530 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66   locked tables f
15540 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e  or MS millisecon
15550 64 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 72 20  ds\n".  ".timer 
15560 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
15570 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f  Turn SQL timer o
15580 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
15590 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 20 20  trace FILE|off  
155a0 20 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63        Output eac
155b0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
155c0 61 73 20 69 74 20 69 73 20 72 75 6e 5c 6e 22 0a  as it is run\n".
155d0 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58    ".vfsinfo ?AUX
155e0 3f 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d  ?         Inform
155f0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
15600 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c 6e 22  top-level VFS\n"
15610 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20  .  ".vfslist    
15620 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
15630 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46  all available VF
15640 53 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61  Ses\n".  ".vfsna
15650 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  me ?AUX?        
15660 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20   Print the name 
15670 6f 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b  of the VFS stack
15680 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55  \n".  ".width NU
15690 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65  M1 NUM2 ...   Se
156a0 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  t column widths 
156b0 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d  for \"column\" m
156c0 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ode\n".  "      
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75     Negative valu
156f0 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79  es right-justify
15700 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66 69 6e  \n".;..#if defin
15710 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
15720 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20  _SESSION)./*.** 
15730 50 72 69 6e 74 20 68 65 6c 70 20 69 6e 66 6f 72  Print help infor
15740 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22  mation for the "
15750 2e 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d 6d 61  .sessions" comma
15760 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73 73 69  nd.*/.void sessi
15770 6f 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53 74 61  on_help(ShellSta
15780 74 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f 70 72  te *p){.  raw_pr
15790 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20 20 20  intf(p->out,.   
157a0 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45   ".session ?NAME
157b0 3f 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41 52  ? SUBCOMMAND ?AR
157c0 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20 22 49  GS...?\n".    "I
157d0 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74  f ?NAME? is omit
157e0 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64  ted, the first d
157f0 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69  efined session i
15800 73 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20 20 22  s used.\n".    "
15810 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a  Subcommands:\n".
15820 20 20 20 20 22 20 20 20 61 74 74 61 63 68 20 54      "   attach T
15830 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ABLE            
15840 20 41 74 74 61 63 68 20 54 41 42 4c 45 5c 6e 22   Attach TABLE\n"
15850 0a 20 20 20 20 22 20 20 20 63 68 61 6e 67 65 73  .    "   changes
15860 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  et FILE         
15870 20 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65    Write a change
15880 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22  set into FILE\n"
15890 0a 20 20 20 20 22 20 20 20 63 6c 6f 73 65 20 20  .    "   close  
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73    Close one sess
158c0 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 65  ion\n".    "   e
158d0 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20  nable ?BOOLEAN? 
158e0 20 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71          Set or q
158f0 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20  uery the enable 
15900 62 69 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 66  bit\n".    "   f
15910 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20  ilter GLOB...   
15920 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74          Reject t
15930 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47  ables matching G
15940 4c 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20 20 20  LOBs\n".    "   
15950 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
15960 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
15970 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
15980 65 63 74 20 73 74 61 74 75 73 5c 6e 22 0a 20 20  ect status\n".  
15990 20 20 22 20 20 20 69 73 65 6d 70 74 79 20 20 20    "   isempty   
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51                 Q
159b0 75 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65  uery whether the
159c0 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74   session is empt
159d0 79 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c 69 73  y\n".    "   lis
159e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
159f0 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65        List curre
15a00 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
15a10 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20 20 22  n names\n".    "
15a20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20     open DB NAME 
15a30 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e              Open
15a40 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f   a new session o
15a50 6e 20 44 42 5c 6e 22 0a 20 20 20 20 22 20 20 20  n DB\n".    "   
15a60 70 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20  patchset FILE   
15a70 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
15a80 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46   patchset into F
15a90 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65  ILE\n".  );.}.#e
15aa0 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72  ndif.../* Forwar
15ab0 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
15ac0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
15ad0 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61  s_input(ShellSta
15ae0 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  te *p, FILE *in)
15af0 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  ;../*.** Read th
15b00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c  e content of fil
15b10 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d  e zName into mem
15b20 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
15b30 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
15b40 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75  64().** and retu
15b50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
15b60 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20  the buffer. The 
15b70 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
15b80 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
15b90 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e  g.** the memory.
15ba0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
15bb0 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f  ter pnByte is no
15bc0 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65  t NULL, (*pnByte
15bd0 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  ) is set to the 
15be0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
15bf0 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  ** read..**.** F
15c00 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20  or convenience, 
15c10 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  a nul-terminator
15c20 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20   byte is always 
15c30 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
15c40 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f  data read.** fro
15c50 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  m the file befor
15c60 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  e the buffer is 
15c70 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62  returned. This b
15c80 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75  yte is not inclu
15c90 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ded in.** the fi
15ca0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70  nal value of (*p
15cb0 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69  nByte), if appli
15cc0 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c  cable..**.** NUL
15cd0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
15ce0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
15cf0 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66  countered. The f
15d00 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
15d10 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65  nByte.** is unde
15d20 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
15d30 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
15d40 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
15d50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
15d60 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20  int *pnByte){.  
15d70 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e  FILE *in = fopen
15d80 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20  (zName, "rb");. 
15d90 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a   long nIn;.  siz
15da0 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61  e_t nRead;.  cha
15db0 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69  r *pBuf;.  if( i
15dc0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
15dd0 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20  .  fseek(in, 0, 
15de0 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e  SEEK_END);.  nIn
15df0 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20   = ftell(in);.  
15e00 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42  rewind(in);.  pB
15e10 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
15e20 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a  loc64( nIn+1 );.
15e30 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20    if( pBuf==0 ) 
15e40 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61  return 0;.  nRea
15e50 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
15e60 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
15e70 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
15e80 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
15e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
15ea0 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
15eb0 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
15ec0 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
15ed0 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
15ee0 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
15ef0 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
15f00 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
15f10 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
15f20 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
15f30 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
15f40 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
15f50 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
15f60 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
15f70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
15f80 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
15f90 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
15fa0 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
15fb0 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
15fc0 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
15fd0 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
15fe0 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
15ff0 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
16000 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
16010 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
16020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16030 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
16040 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
16050 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
16060 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
16070 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
16080 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
16090 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
160a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
160b0 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
160c0 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
160d0 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
160e0 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
160f0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
16100 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
16110 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
16120 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
16130 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
16140 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
16150 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
16160 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
16170 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
16180 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
16190 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
161a0 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
161b0 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
161c0 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
161d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
161e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
161f0 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
16200 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
16210 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
16220 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
16230 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
16240 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
16250 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
16260 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
16270 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
16280 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
16290 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
162a0 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
162b0 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
162c0 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
162d0 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
162e0 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
162f0 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
16300 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
16310 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
16320 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
16330 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
16340 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
16350 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
16360 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
16370 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
16380 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
163a0 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73   open.  If it is
163b0 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20   not, then open 
163c0 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64  it.  If.** the d
163d0 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
163e0 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20   open, print an 
163f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
16400 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  d exit..*/.stati
16410 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53  c void open_db(S
16420 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
16430 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20  t keepAlive){.  
16440 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
16450 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74      sqlite3_init
16460 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 73 71  ialize();.    sq
16470 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
16480 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
16490 62 29 3b 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62  b);.    globalDb
164a0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66   = p->db;.    if
164b0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51  ( p->db==0 || SQ
164c0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
164d0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
164e0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
164f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
16500 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  or: unable to op
16510 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73  en database \"%s
16520 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  \": %s\n",.     
16530 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
16540 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ame, sqlite3_err
16550 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
16560 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69 76 65     if( keepAlive
16570 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
16580 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
16590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
165a0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
165b0 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ON.    sqlite3_e
165c0 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
165d0 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a  sion(p->db, 1);.
165e0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
165f0 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70  e3_fileio_init(p
16600 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
16610 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65   sqlite3_shathre
16620 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  e_init(p->db, 0,
16630 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
16640 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74  _completion_init
16650 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
16660 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
16670 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
16680 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  , "shell_add_sch
16690 65 6d 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ema", 2, SQLITE_
166a0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68       shellAddSch
166d0 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a  emaName, 0, 0);.
166e0 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f    }.}..#if HAVE_
166f0 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45  READLINE || HAVE
16700 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20  _EDITLINE./*.** 
16710 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74  Readline complet
16720 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f  ion callbacks.*/
16730 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
16740 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
16750 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73  n_generator(cons
16760 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e  t char *text, in
16770 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74  t state){.  stat
16780 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
16790 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
167a0 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20  ar *zRet;.  if( 
167b0 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  state==0 ){.    
167c0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
167d0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
167e0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
167f0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
16800 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
16810 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
16820 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
16850 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29  M completion(%Q)
16860 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65   ORDER BY 1", te
16870 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
16880 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62  _prepare_v2(glob
16890 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  alDb, zSql, -1, 
168a0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
168b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
168c0 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
168d0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
168e0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
168f0 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64  .    zRet = strd
16900 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  up((const char*)
16910 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
16920 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
16930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16940 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
16950 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
16960 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  = 0;.    zRet = 
16970 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
16980 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  zRet;.}.static c
16990 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63  har **readline_c
169a0 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
169b0 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
169c0 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
169d0 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74  d){.  rl_attempt
169e0 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76  ed_completion_ov
169f0 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  er = 1;.  return
16a00 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d   rl_completion_m
16a10 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65  atches(zText, re
16a20 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
16a30 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a  n_generator);.}.
16a40 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45  .#elif HAVE_LINE
16a50 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65  NOISE./*.** Line
16a60 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  noise completion
16a70 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
16a80 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69  tic void linenoi
16a90 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  se_completion(co
16aa0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  nst char *zLine,
16ab0 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65   linenoiseComple
16ac0 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e  tions *lc){.  in
16ad0 74 20 6e 4c 69 6e 65 20 3d 20 28 69 6e 74 29 73  t nLine = (int)s
16ae0 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20  trlen(zLine);.  
16af0 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
16b00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16b10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
16b20 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a   *zSql;.  char z
16b30 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  Buf[1000];..  if
16b40 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a  ( nLine>sizeof(z
16b50 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e  Buf)-30 ) return
16b60 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d  ;.  if( zLine[0]
16b70 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a  =='.' ) return;.
16b80 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b    for(i=nLine-1;
16b90 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75   i>=0 && (isalnu
16ba0 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a  m(zLine[i]) || z
16bb0 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69  Line[i]=='_'); i
16bc0 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e  --){}.  if( i==n
16bd0 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b  Line-1 ) return;
16be0 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b  .  iStart = i+1;
16bf0 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
16c00 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a  zLine, iStart);.
16c10 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
16c20 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
16c30 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
16c40 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
16c50 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
16c70 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
16c80 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20  %Q,%Q) ORDER BY 
16c90 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c               &zL
16cb0 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69  ine[iStart], zLi
16cc0 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ne);.  sqlite3_p
16cd0 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
16ce0 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
16cf0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
16d00 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
16d10 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
16d20 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41  lobalDb, "PRAGMA
16d30 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c   page_count", 0,
16d40 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20   0, 0); /* Load 
16d50 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
16d60 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
16d70 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
16d80 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
16d90 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c  nst char *zCompl
16da0 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63  etion = (const c
16db0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
16dc0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
16dd0 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d  0);.    int nCom
16de0 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  pletion = sqlite
16df0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
16e00 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
16e10 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65  ( iStart+nComple
16e20 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42  tion < sizeof(zB
16e30 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  uf)-1 ){.      m
16e40 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72  emcpy(zBuf+iStar
16e50 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20  t, zCompletion, 
16e60 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a  nCompletion+1);.
16e70 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41        linenoiseA
16e80 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c  ddCompletion(lc,
16e90 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
16ea0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
16eb0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23  lize(pStmt);.}.#
16ec0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
16ed0 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65  C-language style
16ee0 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a   dequoting..**.*
16ef0 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c  *    \a    -> al
16f00 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20  arm.**    \b    
16f10 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20  -> backspace.** 
16f20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
16f30 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
16f40 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20  ewline.**    \v 
16f50 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74     -> vertical t
16f60 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d  ab.**    \f    -
16f70 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20  > form feed.**  
16f80 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
16f90 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
16fa0 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a   \s    -> space.
16fb0 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22  **    \"    -> "
16fc0 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20  .**    \'    -> 
16fd0 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  '.**    \\    ->
16fe0 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20   backslash.**   
16ff0 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
17000 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
17010 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63   octal.*/.static
17020 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
17030 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
17040 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
17050 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c    char c;.  whil
17060 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c  e( *z && *z!='\\
17070 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69  ' ) z++;.  for(i
17080 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
17090 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  !=0; i++, j++){.
170a0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
170b0 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a  && z[i+1]!=0 ){.
170c0 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
170d0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
170e0 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  a' ){.        c 
170f0 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65  = '\a';.      }e
17100 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29  lse if( c=='b' )
17110 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
17120 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  b';.      }else 
17130 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
17140 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
17150 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17160 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20  c=='n' ){.      
17170 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
17180 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
17190 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  v' ){.        c 
171a0 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65  = '\v';.      }e
171b0 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
171c0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
171d0 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f';.      }else 
171e0 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
171f0 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
17200 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17210 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
17220 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20    c = '"';.     
17230 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
17240 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  '' ){.        c 
17250 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65  = '\'';.      }e
17260 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
17270 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
17280 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
17290 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
172a0 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
172b0 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
172c0 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
172d0 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
172e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
172f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
17300 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
17310 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
17320 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
17330 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
17340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17350 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
17360 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
17370 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
17380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
173a0 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
173b0 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20   if( j<i ) z[j] 
173c0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
173d0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
173e0 66 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  f a hexadecimal 
173f0 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e 20 2d  digit.  Return -
17400 31 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a  1 if the input.*
17410 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78 20 64  * is not a hex d
17420 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  igit..*/.static 
17430 69 6e 74 20 68 65 78 44 69 67 69 74 56 61 6c 75  int hexDigitValu
17440 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28  e(char c){.  if(
17450 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39   c>='0' && c<='9
17460 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
17470 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27 61 27  0';.  if( c>='a'
17480 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72 65 74   && c<='f' ) ret
17490 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20 31 30  urn c - 'a' + 10
174a0 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26  ;.  if( c>='A' &
174b0 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74 75 72  & c<='F' ) retur
174c0 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a  n c - 'A' + 10;.
174d0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
174e0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
174f0 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74 65 67  zArg as an integ
17500 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73 69 62  er value, possib
17510 6c 79 20 77 69 74 68 20 73 75 66 66 69 78 65 73  ly with suffixes
17520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
17530 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65 67 65  te3_int64 intege
17540 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  rValue(const cha
17550 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69  r *zArg){.  sqli
17560 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b  te3_int64 v = 0;
17570 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
17580 73 74 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a  struct { char *z
17590 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c  Suffix; int iMul
175a0 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b  t; } aMult[] = {
175b0 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30  .    { "KiB", 10
175c0 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42  24 },.    { "MiB
175d0 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a  ", 1024*1024 },.
175e0 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32      { "GiB", 102
175f0 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20  4*1024*1024 },. 
17600 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30     { "KB",  1000
17610 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20   },.    { "MB", 
17620 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
17630 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30 30 30  { "GB",  1000000
17640 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22  000 },.    { "K"
17650 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ,   1000 },.    
17660 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30  { "M",   1000000
17670 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20   },.    { "G",  
17680 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
17690 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
176a0 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20  nt isNeg = 0;.  
176b0 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27  if( zArg[0]=='-'
176c0 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20   ){.    isNeg = 
176d0 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  1;.    zArg++;. 
176e0 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b   }else if( zArg[
176f0 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a  0]=='+' ){.    z
17700 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Arg++;.  }.  if(
17710 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
17720 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
17730 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20  .    int x;.    
17740 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77  zArg += 2;.    w
17750 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69  hile( (x = hexDi
17760 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d  gitValue(zArg[0]
17770 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ))>=0 ){.      v
17780 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20   = (v<<4) + x;. 
17790 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20       zArg++;.   
177a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
177b0 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
177c0 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[0]) ){.     
177d0 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67   v = v*10 + zArg
177e0 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [0] - '0';.     
177f0 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
17800 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
17810 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c 74 29  ArraySize(aMult)
17820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
17830 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
17840 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66 69 78  aMult[i].zSuffix
17850 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  , zArg)==0 ){.  
17860 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74 5b 69      v *= aMult[i
17870 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20 20 62  ].iMult;.      b
17880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17890 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67 3f 20    return isNeg? 
178a0 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  -v : v;.}../*.**
178b0 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
178c0 61 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  as either an int
178d0 65 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61  eger or a boolea
178e0 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
178f0 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54   1 or 0.** for T
17900 52 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20  RUE and FALSE.  
17910 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
17920 65 72 20 76 61 6c 75 65 20 69 66 20 61 70 70 72  er value if appr
17930 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
17940 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
17950 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
17960 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zArg){.  int i;.
17970 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
17980 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
17990 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  x' ){.    for(i=
179a0 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  2; hexDigitValue
179b0 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b  (zArg[i])>=0; i+
179c0 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +){}.  }else{.  
179d0 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b    for(i=0; zArg[
179e0 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  i]>='0' && zArg[
179f0 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a  i]<='9'; i++){}.
17a00 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26    }.  if( i>0 &&
17a10 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
17a20 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67  turn (int)(integ
17a30 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20  erValue(zArg) & 
17a40 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69  0xffffffff);.  i
17a50 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
17a60 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d  mp(zArg, "on")==
17a70 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
17a80 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29  icmp(zArg,"yes")
17a90 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
17aa0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
17ab0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
17ac0 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c  Arg, "off")==0 |
17ad0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
17ae0 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20  p(zArg,"no")==0 
17af0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
17b00 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e  .  }.  utf8_prin
17b10 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
17b20 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e  R: Not a boolean
17b30 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20   value: \"%s\". 
17b40 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e  Assuming \"no\".
17b50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  \n",.          z
17b60 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
17b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ;.}../*.** Set o
17b80 72 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20  r clear a shell 
17b90 66 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74  flag according t
17ba0 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  o a boolean valu
17bb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
17bc0 64 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67  d setOrClearFlag
17bd0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
17be0 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20  unsigned mFlag, 
17bf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
17c00 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  ){.  if( boolean
17c10 56 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20  Value(zArg) ){. 
17c20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
17c30 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c  p, mFlag);.  }el
17c40 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65  se{.    ShellCle
17c50 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  arFlag(p, mFlag)
17c60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
17c70 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66  lose an output f
17c80 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ile, assuming it
17c90 20 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f   is not stderr o
17ca0 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74  r stdout.*/.stat
17cb0 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66  ic void output_f
17cc0 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a  ile_close(FILE *
17cd0 66 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66  f){.  if( f && f
17ce0 21 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73  !=stdout && f!=s
17cf0 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66  tderr ) fclose(f
17d00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
17d10 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75  to open an outpu
17d20 74 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61  t file.   The na
17d30 6d 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64  mes "stdout" and
17d40 20 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a   "stderr" are.**
17d50 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
17d60 64 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69  do the right thi
17d70 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  ng.  NULL is ret
17d80 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74  urned if the out
17d90 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20  put.** filename 
17da0 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61  is "off"..*/.sta
17db0 74 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74  tic FILE *output
17dc0 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74  _file_open(const
17dd0 20 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20   char *zFile){. 
17de0 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20   FILE *f;.  if( 
17df0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74  strcmp(zFile,"st
17e00 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
17e10 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d   f = stdout;.  }
17e20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
17e30 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29  zFile, "stderr")
17e40 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
17e50 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69  tderr;.  }else i
17e60 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
17e70 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20   "off")==0 ){.  
17e80 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65    f = 0;.  }else
17e90 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28  {.    f = fopen(
17ea0 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20  zFile, "wb");.  
17eb0 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20    if( f==0 ){.  
17ec0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
17ed0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
17ee0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
17ef0 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
17f00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17f10 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  n f;.}..#if !def
17f20 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45  ined(SQLITE_UNTE
17f30 53 54 41 42 4c 45 29 0a 23 69 66 20 21 64 65 66  STABLE).#if !def
17f40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17f50 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
17f60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17f70 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
17f80 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20  /*.** A routine 
17f90 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74  for handling out
17fa0 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  put from sqlite3
17fb0 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61  _trace()..*/.sta
17fc0 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63  tic int sql_trac
17fd0 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e  e_callback(.  un
17fe0 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20  signed mType,.  
17ff0 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f  void *pArg,.  vo
18000 69 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a  id *pP,.  void *
18010 70 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20  pX.){.  FILE *f 
18020 3d 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20  = (FILE*)pArg;. 
18030 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18040 52 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53  R(mType);.  UNUS
18050 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29  ED_PARAMETER(pP)
18060 3b 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20  ;.  if( f ){.   
18070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
18080 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58   (const char*)pX
18090 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 28 69  ;.    int i = (i
180a0 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  nt)strlen(z);.  
180b0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
180c0 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 69  z[i-1]==';' ){ i
180d0 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f 70  --; }.    utf8_p
180e0 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c  rintf(f, "%.*s;\
180f0 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20  n", i, z);.  }. 
18100 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
18110 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
18120 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
18130 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
18140 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
18150 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
18160 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
18170 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
18180 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
18190 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
181a0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
181b0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
181c0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
181d0 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
181e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
181f0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
18200 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
18210 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
18220 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
18230 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
18240 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
18250 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
18260 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18270 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
18280 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
18290 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
182a0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
182b0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
182c0 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
182d0 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
182e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
182f0 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
18300 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
18310 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
18320 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18330 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
18340 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
18350 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
18360 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
18370 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
18380 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
18390 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
183a0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
183b0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
183c0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
183d0 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
183e0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
183f0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
18400 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
18410 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
18420 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
18430 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
18440 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18450 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
18460 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
18470 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
18480 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
18490 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
184a0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
184b0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
184c0 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
184d0 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
184e0 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
184f0 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
18500 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
18510 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
18520 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
18530 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
18540 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
18550 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
18560 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
18570 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
18580 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
18590 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a   if( p->z==0 ){.
185a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
185b0 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
185c0 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
185d0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
185e0 7d 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  }.  }.  p->z[p->
185f0 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  n++] = (char)c;.
18600 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
18610 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56  gle field of CSV
18620 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62   text.  Compatib
18630 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30 20  le with rfc4180 
18640 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20  and extended.** 
18650 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20  with the option 
18660 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70 61  of having a sepa
18670 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
18680 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20   ","..**.**   + 
18690 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
186a0 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
186b0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
186c0 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
186d0 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
186e0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
186f0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
18700 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
18710 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
18720 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
18730 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
18740 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
18750 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ,"..**   +  Use 
18760 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
18770 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
18780 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
18790 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70  n"..**   +  Keep
187a0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
187b0 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ne number in p->
187c0 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
187d0 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
187e0 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
187f0 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
18800 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
18810 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
18820 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
18830 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
18840 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
18850 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
18860 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
18870 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
18880 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
18890 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
188a0 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
188b0 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
188c0 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
188d0 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
188e0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
188f0 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
18900 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
18910 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
18920 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
18930 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22  .  }.  if( c=='"
18940 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c  ' ){.    int pc,
18950 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74   ppc;.    int st
18960 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
18970 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
18980 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
18990 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
189a0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
189b0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
189c0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72  ;.      if( c==r
189d0 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  Sep ) p->nLine++
189e0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
189f0 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
18a00 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
18a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
18a20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
18a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
18a40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18a50 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
18a60 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
18a70 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
18a80 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
18a90 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65        || (c==rSe
18aa0 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  p && pc=='\r' &&
18ab0 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
18ac0 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
18ad0 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
18ae0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18af0 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
18b00 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
18b10 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
18b20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
18b30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18b50 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
18b60 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
18b70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
18b80 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
18b90 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61  escaped %c chara
18ba0 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  cter\n",.       
18bb0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c           p->zFil
18bc0 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75  e, p->nLine, cQu
18bd0 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ote);.      }.  
18be0 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29      if( c==EOF )
18bf0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
18c00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
18c10 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74  s:%d: unterminat
18c20 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65  ed %c-quoted fie
18c30 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
18c40 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
18c50 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f   startLine, cQuo
18c60 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  te);.        p->
18c70 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
18c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18c90 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  }.      import_a
18ca0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
18cb0 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70 63  ;.      ppc = pc
18cc0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a  ;.      pc = c;.
18cd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18ce0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
18cf0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
18d00 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e   being parsed an
18d10 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74 68  d it begins with
18d20 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d   the.    ** UTF-
18d30 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20  8 BOM  (0xEF BB 
18d40 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  BF) then skip th
18d50 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28  e BOM */.    if(
18d60 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20   (c&0xff)==0xef 
18d70 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d  && p->bNotFirst=
18d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  =0 ){.      impo
18d90 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
18da0 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
18db0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
18dc0 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
18dd0 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20  ==0xbb ){.      
18de0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
18df0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
18e00 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
18e10 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >in);.        if
18e20 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66  ( (c&0xff)==0xbf
18e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
18e40 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
18e50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d            p->n =
18e60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
18e70 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e  turn csv_read_on
18e80 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20  e_field(p);.    
18e90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18ea0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63    }.    while( c
18eb0 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70  !=EOF && c!=cSep
18ec0 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20   && c!=rSep ){. 
18ed0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
18ee0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
18ef0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
18f00 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->in);.    }.   
18f10 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
18f20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b        p->nLine++
18f30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
18f40 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d  >0 && p->z[p->n-
18f50 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d  1]=='\r' ) p->n-
18f60 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  -;.    }.    p->
18f70 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20  cTerm = c;.  }. 
18f80 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a   if( p->z ) p->z
18f90 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d  [p->n] = 0;.  p-
18fa0 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
18fb0 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
18fc0 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
18fd0 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49  le field of ASCI
18fe0 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74  I delimited text
18ff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
19000 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
19010 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
19020 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
19030 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
19040 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
19050 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
19060 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
19070 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
19080 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
19090 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
190a0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
190b0 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46  default is "\x1F
190c0 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
190d0 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
190e0 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
190f0 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78  e default is "\x
19100 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  1E"..**   +  Kee
19110 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72  p track of the r
19120 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ow number in p->
19130 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
19140 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
19150 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
19160 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
19170 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
19180 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
19190 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
191a0 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
191b0 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
191c0 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
191d0 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
191e0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
191f0 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20  field(ImportCtx 
19200 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *p){.  int c;.  
19210 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43  int cSep = p->cC
19220 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65  olSep;.  int rSe
19230 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a  p = p->cRowSep;.
19240 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20    p->n = 0;.  c 
19250 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
19260 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20    if( c==EOF || 
19270 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
19280 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
19290 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EOF;.    return 
192a0 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
192b0 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
192c0 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
192d0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
192e0 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
192f0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
19300 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  n);.  }.  if( c=
19310 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e  =rSep ){.    p->
19320 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70  nLine++;.  }.  p
19330 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69  ->cTerm = c;.  i
19340 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
19350 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  ->n] = 0;.  retu
19360 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn p->z;.}../*.*
19370 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
19380 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  r data for table
19390 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20   zTable.  If an 
193a0 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68  error is seen wh
193b0 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f  ile.** moving fo
193c0 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f  rward, try to go
193d0 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65   backwards.  The
193e0 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d   backwards movem
193f0 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72  ent won't.** wor
19400 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  k for WITHOUT RO
19410 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  WID tables..*/.s
19420 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
19430 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65  CloneData(.  She
19440 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
19450 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
19460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
19470 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  le.){.  sqlite3_
19480 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
19490 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
194a0 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
194b0 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
194c0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
194d0 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
194e0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
194f0 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
19500 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 62  (int)strlen(zTab
19510 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
19520 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
19530 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
19540 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
19550 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
19560 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
19570 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
19580 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
19590 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
195a0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
195b0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
195c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
195d0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
195e0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
195f0 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
19600 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19610 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
19620 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
19630 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19640 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
19650 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
19660 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
19670 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
19680 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
19690 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
196a0 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
196b0 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
196c0 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
196d0 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
196e0 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
196f0 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
19700 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
19710 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
19720 78 66 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xfer;.  }.  sqli
19730 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
19740 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
19750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19760 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
19770 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
19780 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
19790 62 6c 65 29 3b 0a 20 20 69 20 3d 20 28 69 6e 74  ble);.  i = (int
197a0 29 73 74 72 6c 65 6e 28 7a 49 6e 73 65 72 74 29  )strlen(zInsert)
197b0 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e  ;.  for(j=1; j<n
197c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63  ; j++){.    memc
197d0 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c  py(zInsert+i, ",
197e0 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d  ?", 2);.    i +=
197f0 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79   2;.  }.  memcpy
19800 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22  (zInsert+i, ");"
19810 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 3);.  rc = sql
19820 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
19830 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20  newDb, zInsert, 
19840 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29  -1, &pInsert, 0)
19850 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
19860 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
19870 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
19880 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
19890 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
198a0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
198b0 63 6f 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c  code(newDb), sql
198c0 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
198d0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
198e0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74  zQuery);.    got
198f0 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
19900 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  .  }.  for(k=0; 
19910 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77  k<2; k++){.    w
19920 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
19930 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
19940 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
19950 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
19960 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
19970 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
19980 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
19990 51 75 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20  Query, i) ){.   
199a0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
199b0 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
199c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
199d0 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74  ind_null(pInsert
199e0 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
199f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19a10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
19a20 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
19a30 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19a40 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20  _int64(pInsert, 
19a50 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
19a60 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79  umn_int64(pQuery
19a70 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
19a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
19aa0 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
19ab0 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
19ac0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
19ad0 62 6c 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ble(pInsert, i+1
19ae0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19af0 5f 64 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69  _double(pQuery,i
19b00 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
19b10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
19b20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
19b30 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
19b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
19b50 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
19b60 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20  Insert, i+1,.   
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
19b90 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
19ba0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
19bb0 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54     -1, SQLITE_ST
19be0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
19bf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19c10 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
19c20 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
19c30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
19c40 62 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  b(pInsert, i+1, 
19c50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
19c60 6c 6f 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  lob(pQuery,i),. 
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19ca0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
19cb0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
19cf0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
19d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
19d20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66        } /* End f
19d30 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  or */.      rc =
19d40 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
19d50 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66  nsert);.      if
19d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19d70 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
19d80 57 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  W && rc!=SQLITE_
19d90 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
19da0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
19db0 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
19dc0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78  s\n", sqlite3_ex
19dd0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
19de0 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ewDb),.         
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19e00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
19e10 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wDb));.      }. 
19e20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
19e30 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  et(pInsert);.   
19e40 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
19e50 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74  if( (cnt%spinRat
19e60 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
19e70 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20   printf("%c\b", 
19e80 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69  "|/-\\"[(cnt/spi
19e90 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20  nRate)%4]);.    
19ea0 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
19eb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
19ec0 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a  } /* End while *
19ed0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
19ee0 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61  LITE_DONE ) brea
19ef0 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  k;.    sqlite3_f
19f00 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
19f10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19f20 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a  e(zQuery);.    z
19f30 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
19f40 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
19f50 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52  * FROM \"%w\" OR
19f60 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
19f70 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  C;",.           
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72    zTable);.    r
19fa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19fb0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
19fc0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
19fd0 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
19fe0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
19ff0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1a000 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20  Warning: cannot 
1a010 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b  step \"%s\" back
1a020 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b  wards", zTable);
1a030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a040 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66    }.  } /* End f
1a050 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65  or(k=0...) */..e
1a060 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20  nd_data_xfer:.  
1a070 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1a080 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
1a090 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e  te3_finalize(pIn
1a0a0 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  sert);.  sqlite3
1a0b0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1a0c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
1a0d0 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nsert);.}.../*.*
1a0e0 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
1a0f0 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  r all rows of th
1a100 65 20 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61  e schema that ma
1a110 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72  tch zWhere.  For
1a120 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e  .** each row, in
1a130 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20  voke xForEach() 
1a140 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65  on the object de
1a150 66 69 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f  fined by that ro
1a160 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  w..** If an erro
1a170 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1a180 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f   while moving fo
1a190 72 77 61 72 64 20 74 68 72 6f 75 67 68 20 74 68  rward through th
1a1a0 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  e.** sqlite_mast
1a1b0 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67  er table, try ag
1a1c0 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77  ain moving backw
1a1d0 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ards..*/.static 
1a1e0 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53  void tryToCloneS
1a1f0 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74  chema(.  ShellSt
1a200 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
1a210 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
1a220 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a  t char *zWhere,.
1a230 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63    void (*xForEac
1a240 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73  h)(ShellState*,s
1a250 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68  qlite3*,const ch
1a260 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
1a270 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
1a280 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
1a290 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ry = 0;.  int rc
1a2a0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1a2b0 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  ed char *zName;.
1a2c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1a2d0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1a2e0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
1a2f0 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71  ;..  zQuery = sq
1a300 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1a310 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1a320 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1a330 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a350 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65   WHERE %s", zWhe
1a360 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  re);.  rc = sqli
1a370 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1a380 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1a390 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1a3a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1a3b0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1a3c0 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20  r, "Error: (%d) 
1a3d0 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1a400 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
1a410 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1a420 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1a440 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
1a450 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
1a460 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28  ;.  }.  while( (
1a470 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1a480 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
1a490 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e  TE_ROW ){.    zN
1a4a0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
1a4b0 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
1a4c0 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  , 0);.    zSql =
1a4d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1a4e0 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
1a4f0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e  .    printf("%s.
1a500 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66  .. ", zName); ff
1a510 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
1a520 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
1a530 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
1a540 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  r*)zSql, 0, 0, &
1a550 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
1a560 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1a570 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1a580 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
1a590 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
1a5a0 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
1a5b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1a5c0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
1a5d0 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b      zErrMsg = 0;
1a5e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
1a5f0 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
1a600 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77   xForEach(p, new
1a610 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1a620 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  )zName);.    }. 
1a630 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1a640 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  n");.  }.  if( r
1a650 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1a660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1a670 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
1a680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a690 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51  (zQuery);.    zQ
1a6a0 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
1a6b0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e  printf("SELECT n
1a6c0 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ame, sql FROM sq
1a6d0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
1a700 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
1a710 77 69 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72  wid DESC", zWher
1a720 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
1a730 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1a740 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
1a750 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
1a760 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1a770 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1a780 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1a790 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
1a7a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a7b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a7c0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1a7d0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1a7e0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1a7f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a800 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
1a810 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1a820 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20  schema_xfer;.   
1a830 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
1a840 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1a850 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
1a860 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a  E_ROW ){.      z
1a870 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Name = sqlite3_c
1a880 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
1a890 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71  y, 0);.      zSq
1a8a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1a8b0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1a8c0 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  1);.      printf
1a8d0 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
1a8e0 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
1a8f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a900 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1a910 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1a920 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1a930 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d  .      if( zErrM
1a940 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  sg ){.        ut
1a950 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1a960 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51  , "Error: %s\nSQ
1a970 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72  L: [%s]\n", zErr
1a980 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  Msg, zSql);.    
1a990 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a9a0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
1a9b0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
1a9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a9d0 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20  ( xForEach ){.  
1a9e0 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
1a9f0 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
1aa00 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
1aa10 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
1aa20 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20  tf("done\n");.  
1aa30 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65    }.  }.end_sche
1aa40 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74  ma_xfer:.  sqlit
1aa50 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1aa60 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
1aa70 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a  ree(zQuery);.}..
1aa80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
1aa90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
1aaa0 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20  amed "zNewDb".  
1aab0 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61  Try to recover a
1aac0 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69  s much informati
1aad0 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c  on.** as possibl
1aae0 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  e out of the mai
1aaf0 6e 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63  n database (whic
1ab00 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75  h might be corru
1ab10 70 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74  pt) and write it
1ab20 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e  .** into zNewDb.
1ab30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ab40 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c  tryToClone(Shell
1ab50 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
1ab60 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20  char *zNewDb){. 
1ab70 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1ab80 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20  e3 *newDb = 0;. 
1ab90 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77   if( access(zNew
1aba0 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Db,0)==0 ){.    
1abb0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1abc0 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22  rr, "File \"%s\"
1abd0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
1abe0 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20  \n", zNewDb);.  
1abf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ac00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
1ac10 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62  n(zNewDb, &newDb
1ac20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ac30 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1ac40 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63  tderr, "Cannot c
1ac50 72 65 61 74 65 20 6f 75 74 70 75 74 20 64 61 74  reate output dat
1ac60 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20  abase: %s\n",.  
1ac70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ac80 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29  3_errmsg(newDb))
1ac90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1aca0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1acb0 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
1acc0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c  ble_schema=ON;",
1acd0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1ace0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1acf0 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53  b, "BEGIN EXCLUS
1ad00 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  IVE;", 0, 0, 0);
1ad10 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
1ad20 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
1ad30 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20  "type='table'", 
1ad40 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b  tryToCloneData);
1ad50 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
1ad60 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
1ad70 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c  "type!='table'",
1ad80 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1ad90 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f  _exec(newDb, "CO
1ada0 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29  MMIT;", 0, 0, 0)
1adb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1adc0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1add0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1ade0 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
1adf0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1ae00 5f 63 6c 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d  _close(newDb);.}
1ae10 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1ae20 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 62  he output file b
1ae30 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 0a 2a 2f  ack to stdout.*/
1ae40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
1ae50 70 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53  put_reset(ShellS
1ae60 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  tate *p){.  if( 
1ae70 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27  p->outfile[0]=='
1ae80 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  |' ){.#ifndef SQ
1ae90 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
1aea0 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75      pclose(p->ou
1aeb0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  t);.#endif.  }el
1aec0 73 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66  se{.    output_f
1aed0 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74  ile_close(p->out
1aee0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  );.  }.  p->outf
1aef0 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
1af00 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
1af10 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
1af20 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
1af30 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
1af40 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
1af50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1af60 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
1af70 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1af80 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
1af90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1afa0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
1afb0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1afc0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
1afd0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1afe0 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
1aff0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b000 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1b010 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
1b020 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1b030 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
1b040 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1b050 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
1b060 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
1b070 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
1b080 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
1b090 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
1b0a0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
1b0b0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
1b0c0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
1b0d0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1b0e0 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1b0f0 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
1b100 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
1b110 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
1b120 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1b130 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1b140 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
1b150 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
1b160 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
1b170 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1b180 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
1b190 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
1b1a0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
1b1b0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
1b1c0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
1b1d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b1e0 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
1b1f0 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
1b200 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
1b210 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
1b220 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1b230 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
1b240 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
1b250 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
1b260 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
1b270 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
1b280 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
1b290 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
1b2a0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
1b2b0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
1b2c0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1b2d0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
1b2e0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
1b2f0 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
1b300 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
1b310 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
1b320 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
1b330 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
1b340 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
1b350 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
1b360 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
1b370 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
1b380 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
1b390 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
1b3a0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
1b3b0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
1b3c0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
1b3d0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
1b3e0 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
1b3f0 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
1b400 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
1b410 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
1b420 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
1b430 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
1b440 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1b450 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
1b460 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
1b470 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
1b480 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
1b490 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
1b4a0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1b4b0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1b4c0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1b4d0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
1b4e0 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
1b4f0 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
1b500 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1b510 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1b520 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
1b530 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1b540 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
1b550 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
1b560 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
1b570 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
1b580 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1b590 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
1b5a0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
1b5b0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
1b5c0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
1b5d0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
1b5e0 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
1b5f0 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
1b600 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
1b610 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
1b620 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b630 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
1b640 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68   i;.  char *zSch
1b650 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a  emaTab;.  char *
1b660 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  zDb = nArg>=2 ? 
1b670 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e  azArg[1] : "main
1b680 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ";.  unsigned ch
1b690 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar aHdr[100];.  
1b6a0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
1b6b0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20   if( p->db==0 ) 
1b6c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69  return 1;.  sqli
1b6d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1b6e0 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c  (p->db, zDb, SQL
1b6f0 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
1b700 4f 49 4e 54 45 52 2c 20 26 70 46 69 6c 65 29 3b  OINTER, &pFile);
1b710 0a 20 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20  .  if( pFile==0 
1b720 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
1b730 64 73 3d 3d 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ds==0 || pFile->
1b740 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 3d  pMethods->xRead=
1b750 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b760 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 70 46   1;.  }.  i = pF
1b770 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
1b780 52 65 61 64 28 70 46 69 6c 65 2c 20 61 48 64 72  Read(pFile, aHdr
1b790 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69 66 28  , 100, 0);.  if(
1b7a0 20 69 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   i!=SQLITE_OK ){
1b7b0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
1b7c0 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20  stderr, "unable 
1b7d0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
1b7e0 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20   header\n");.   
1b7f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1b800 20 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74   i = get2byteInt
1b810 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28  (aHdr+16);.  if(
1b820 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33   i==1 ) i = 6553
1b830 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  6;.  utf8_printf
1b840 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1b850 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65  %d\n", "database
1b860 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29   page size:", i)
1b870 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1b880 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1b890 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72  d\n", "write for
1b8a0 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29  mat:", aHdr[18])
1b8b0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1b8c0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1b8d0 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d  d\n", "read form
1b8e0 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b  at:", aHdr[19]);
1b8f0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1b900 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1b910 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62  \n", "reserved b
1b920 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d  ytes:", aHdr[20]
1b930 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1b940 41 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64  ArraySize(aField
1b950 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
1b960 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69   ofst = aField[i
1b970 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69  ].ofst;.    unsi
1b980 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67  gned int val = g
1b990 65 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20  et4byteInt(aHdr 
1b9a0 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66  + ofst);.    utf
1b9b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
1b9c0 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69   "%-20s %u", aFi
1b9d0 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  eld[i].zName, va
1b9e0 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  l);.    switch( 
1b9f0 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  ofst ){.      ca
1ba00 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20  se 56: {.       
1ba10 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61   if( val==1 ) ra
1ba20 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
1ba30 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20   " (utf8)");.   
1ba40 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20       if( val==2 
1ba50 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
1ba60 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29  out, " (utf16le)
1ba70 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
1ba80 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69  val==3 ) raw_pri
1ba90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
1baa0 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20  tf16be)");.     
1bab0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77   }.    }.    raw
1bac0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1bad0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1bae0 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a   zDb==0 ){.    z
1baf0 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
1bb00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69  te3_mprintf("mai
1bb10 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  n.sqlite_master"
1bb20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
1bb30 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22  trcmp(zDb,"temp"
1bb40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  )==0 ){.    zSch
1bb50 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
1bb60 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22  _mprintf("%s", "
1bb70 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
1bb80 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  er");.  }else{. 
1bb90 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
1bba0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bbb0 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d  "\"%w\".sqlite_m
1bbc0 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20  aster", zDb);.  
1bbd0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  }.  for(i=0; i<A
1bbe0 72 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29  rraySize(aQuery)
1bbf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1bc00 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
1bc10 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b  _mprintf(aQuery[
1bc20 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61  i].zSql, zSchema
1bc30 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61  Tab);.    int va
1bc40 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53  l = db_int(p, zS
1bc50 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
1bc60 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
1bc70 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
1bc80 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
1bc90 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61  ", aQuery[i].zNa
1bca0 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  me, val);.  }.  
1bcb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63  sqlite3_free(zSc
1bcc0 68 65 6d 61 54 61 62 29 3b 0a 20 20 72 65 74 75  hemaTab);.  retu
1bcd0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
1bce0 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74  rint the current
1bcf0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1bd00 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72  ) value to stder
1bd10 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
1bd20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1bd30 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
1bd40 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
1bd50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
1bd60 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
1bd70 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70  sg(db);.  utf8_p
1bd80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1bd90 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
1bda0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  r);.  return 1;.
1bdb0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
1bdc0 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
1bdd0 6d 65 73 73 61 67 65 20 74 6f 20 73 74 64 65 72  message to stder
1bde0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
1bdf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1be00 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f  ellNomemError(vo
1be10 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
1be20 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1be30 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
1be40 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n");.  return 1;
1be50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1be60 65 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e  e the pattern in
1be70 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74   zGlob[] against
1be80 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d   the text in z[]
1be90 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a  .  Return TRUE.*
1bea0 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20  * if they match 
1beb0 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66  and FALSE (0) if
1bec0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
1bed0 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  ch..**.** Globbi
1bee0 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
1bef0 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
1bf00 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
1bf10 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
1bf20 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
1bf30 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
1bf40 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
1bf50 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
1bf60 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
1bf70 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
1bf80 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
1bf90 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
1bfa0 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
1bfb0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
1bfc0 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
1bfd0 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
1bfe0 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
1bff0 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
1c000 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
1c010 2a 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20  *      '#'      
1c020 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
1c030 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20  uence of one or 
1c040 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68  more digits with
1c050 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   an.**          
1c060 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b        optional +
1c070 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72   or - sign in fr
1c080 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  ont.**.**      '
1c090 20 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61   '       Any spa
1c0a0 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20  n of whitespace 
1c0b0 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65  matches any othe
1c0c0 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20  r span of.**    
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74              whit
1c0e0 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  espace..**.** Ex
1c0f0 74 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61  tra whitespace a
1c100 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d  t the end of z[]
1c110 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
1c120 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63  static int testc
1c130 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63  ase_glob(const c
1c140 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73  har *zGlob, cons
1c150 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
1c160 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69  t c, c2;.  int i
1c170 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
1c180 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  n;..  while( (c 
1c190 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21  = (*(zGlob++)))!
1c1a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73  =0 ){.    if( Is
1c1b0 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
1c1c0 20 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a    if( !IsSpace(*
1c1d0 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
1c1e0 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
1c1f0 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47  ace(*zGlob) ) zG
1c200 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  lob++;.      whi
1c210 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
1c220 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ) z++;.    }else
1c230 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20   if( c=='*' ){. 
1c240 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28       while( (c=(
1c250 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20  *(zGlob++))) == 
1c260 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b  '*' || c=='?' ){
1c270 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
1c280 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d  '?' && (*(z++))=
1c290 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c2b0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1c2c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1c2d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
1c2e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
1c2f0 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61  le( *z && testca
1c300 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c  se_glob(zGlob-1,
1c310 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
1c320 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
1c330 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1c340 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20   (*z)!=0;.      
1c350 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
1c360 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d  c2 = (*(z++)))!=
1c370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
1c380 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20  le( c2!=c ){.   
1c390 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b         c2 = *(z+
1c3a0 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
1c3b0 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
1c3c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1c3d0 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61        if( testca
1c3e0 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29  se_glob(zGlob,z)
1c3f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1c400 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1c410 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
1c420 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
1c430 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d     if( (*(z++))=
1c440 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1c460 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '[' ){.      int
1c470 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
1c480 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
1c490 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
1c4a0 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29        c = *(z++)
1c4b0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
1c4c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1c4d0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
1c4e0 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  +);.      if( c2
1c4f0 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
1c500 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
1c510 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
1c520 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
1c530 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
1c540 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
1c550 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
1c560 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
1c570 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1c580 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
1c590 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
1c5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
1c5b0 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  ='-' && zGlob[0]
1c5c0 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  !=']' && zGlob[0
1c5d0 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
1c5e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
1c5f0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1c600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e            if( c>
1c610 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63  =prior_c && c<=c
1c620 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  2 ) seen = 1;.  
1c630 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
1c640 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1c650 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1c660 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20  ( c==c2 ){.     
1c670 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b         seen = 1;
1c680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c690 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
1c6a0 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   c2;.        }. 
1c6b0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
1c6c0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
1c6d0 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
1c6e0 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
1c6f0 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
1c700 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c710 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c=='#' ){.      
1c720 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c  if( (z[0]=='-' |
1c730 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20  | z[0]=='+') && 
1c740 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20  IsDigit(z[1]) ) 
1c750 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  z++;.      if( !
1c760 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20  IsDigit(z[0]) ) 
1c770 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1c780 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
1c790 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20  ( IsDigit(z[0]) 
1c7a0 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65  ){ z++; }.    }e
1c7b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63  lse{.      if( c
1c7c0 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74  !=(*(z++)) ) ret
1c7d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1c7e0 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63  .  while( IsSpac
1c7f0 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  e(*z) ){ z++; }.
1c800 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
1c810 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
1c820 65 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  e the string as 
1c830 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  a command-line o
1c840 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65  ption with eithe
1c850 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20  r one or two.** 
1c860 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  initial "-" char
1c870 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
1c880 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63  c int optionMatc
1c890 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  h(const char *zS
1c8a0 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
1c8b0 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74  zOpt){.  if( zSt
1c8c0 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  r[0]!='-' ) retu
1c8d0 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a  rn 0;.  zStr++;.
1c8e0 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27    if( zStr[0]=='
1c8f0 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72  -' ) zStr++;.  r
1c900 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74  eturn strcmp(zSt
1c910 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a  r, zOpt)==0;.}..
1c920 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66  /*.** Delete a f
1c930 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c  ile..*/.int shel
1c940 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73  lDeleteFile(cons
1c950 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1c960 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  e){.  int rc;.#i
1c970 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
1c980 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
1c990 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
1c9a0 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  _unicode(zFilena
1c9b0 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e  me);.  rc = _wun
1c9c0 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74  link(z);.  sqlit
1c9d0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
1c9e0 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28  e.  rc = unlink(
1c9f0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  zFilename);.#end
1ca00 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
1ca10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
1ca20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ca30 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
1ca40 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  ion fkey_collate
1ca50 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a  _clause(), used.
1ca60 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74  ** by the ".lint
1ca70 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63   fkey-indexes" c
1ca80 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61  ommand. This sca
1ca90 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  lar function is 
1caa0 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64  always.** called
1cab0 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d   with four argum
1cac0 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e  ents - the paren
1cad0 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68  t table name, th
1cae0 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20  e parent column 
1caf0 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69  name,.** the chi
1cb00 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  ld table name an
1cb10 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75  d the child colu
1cb20 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  mn name..**.**  
1cb30 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
1cb40 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62  ause('parent-tab
1cb50 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c  ', 'parent-col',
1cb60 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63   'child-tab', 'c
1cb70 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a  hild-col').**.**
1cb80 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
1cb90 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f  e named tables o
1cba0 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74  r columns do not
1cbb0 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e   exist, this fun
1cbc0 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
1cbd0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1cbe0 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  . An empty strin
1cbf0 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  g is also return
1cc00 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65  ed if both table
1cc10 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  s.** and columns
1cc20 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20   exist but have 
1cc30 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
1cc40 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1cc50 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62  nce. Or,.** if b
1cc60 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68  oth exist but th
1cc70 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
1cc80 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72  ion sequences ar
1cc90 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
1cca0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
1ccb0 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
1ccc0 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65   " COLLATE <pare
1ccd0 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20  nt-collation>", 
1cce0 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74  where.** <parent
1ccf0 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74  -collation> is t
1cd00 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
1cd10 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
1cd20 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
1cd30 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
1cd40 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  id shellFkeyColl
1cd50 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c  ateClause(.  sql
1cd60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1cd70 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
1cd80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1cd90 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c  **apVal.){.  sql
1cda0 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
1cdb0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1cdc0 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f  ndle(pCtx);.  co
1cdd0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
1cde0 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
1cdf0 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63  *zParentCol;.  c
1ce00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
1ce10 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63  ntSeq;.  const c
1ce20 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63  har *zChild;.  c
1ce30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
1ce40 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dCol;.  const ch
1ce50 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20  ar *zChildSeq = 
1ce60 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  0;  /* Initializ
1ce70 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65  e to avoid false
1ce80 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e  -positive warnin
1ce90 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  g */.  int rc;..
1cea0 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
1ceb0 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d  4 );.  zParent =
1cec0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1ced0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1cee0 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50  (apVal[0]);.  zP
1cef0 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73  arentCol = (cons
1cf00 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1cf10 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1cf20 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d  [1]);.  zChild =
1cf30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1cf40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1cf50 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43  (apVal[2]);.  zC
1cf60 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  hildCol = (const
1cf70 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1cf80 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
1cf90 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  3]);..  sqlite3_
1cfa0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
1cfb0 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , "", -1, SQLITE
1cfc0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d  _STATIC);.  rc =
1cfd0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
1cfe0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
1cff0 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22        db, "main"
1d000 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65  , zParent, zPare
1d010 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65  ntCol, 0, &zPare
1d020 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20  ntSeq, 0, 0, 0. 
1d030 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1d040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d050 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
1d060 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1d070 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  a(.        db, "
1d080 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a  main", zChild, z
1d090 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43  ChildCol, 0, &zC
1d0a0 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30  hildSeq, 0, 0, 0
1d0b0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
1d0c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d0d0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
1d0e0 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20  cmp(zParentSeq, 
1d0f0 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20  zChildSeq) ){.  
1d100 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
1d110 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f  te3_mprintf(" CO
1d120 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65  LLATE %s", zPare
1d130 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69  ntSeq);.    sqli
1d140 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1d150 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pCtx, z, -1, SQL
1d160 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1d170 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d180 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (z);.  }.}.../*.
1d190 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
1d1a0 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d  ation of dot-com
1d1b0 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79  mand ".lint fkey
1d1c0 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74  -indexes"..*/.st
1d1d0 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65  atic int lintFke
1d1e0 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c  yIndexes(.  Shel
1d1f0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
1d200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d210 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
1d220 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
1d230 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d250 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
1d260 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
1d270 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1d280 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d2a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1d2b0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
1d2c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1d2d0 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20  b = pState->db; 
1d2e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d2f0 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72  e handle to quer
1d300 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a  y "main" db of *
1d310 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  /.  FILE *out = 
1d320 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20  pState->out;    
1d330 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f      /* Stream to
1d340 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72   write non-error
1d350 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20   output to */.  
1d360 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30  int bVerbose = 0
1d370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d380 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69  /* If -verbose i
1d390 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
1d3a0 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  nt bGroupByParen
1d3b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
1d3c0 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72  * If -groupbypar
1d3d0 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ent is present *
1d3e0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d400 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
1d410 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b  e through azArg[
1d420 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
1d430 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b  r *zIndent = "";
1d440 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
1d450 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45  ch to indent CRE
1d460 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a  ATE INDEX by */.
1d470 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d4a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d4b0 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20  mt *pSql = 0;   
1d4c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
1d4d0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  d version of SQL
1d4e0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77   statement below
1d4f0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   */..  /*.  ** T
1d500 68 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  his SELECT state
1d510 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65  ment returns one
1d520 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f   row for each fo
1d530 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1d540 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65  aint.  ** in the
1d550 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d   schema of the m
1d560 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68  ain database. Th
1d570 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
1d580 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30  are:.  **.  ** 0
1d590 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e  . The text of an
1d5a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73   SQL statement s
1d5b0 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a  imilar to:.  **.
1d5c0 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41    **      "EXPLA
1d5d0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
1d5e0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
1d5f0 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52  child_table WHER
1d600 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20  E child_key=?". 
1d610 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73   **.  **    This
1d620 20 69 73 20 74 68 65 20 73 61 6d 65 20 53 45 4c   is the same SEL
1d630 45 43 54 20 74 68 61 74 20 74 68 65 20 66 6f 72  ECT that the for
1d640 65 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d  eign keys implem
1d650 65 6e 74 61 74 69 6f 6e 20 6e 65 65 64 73 0a 20  entation needs. 
1d660 20 2a 2a 20 20 20 20 74 6f 20 72 75 6e 20 69 6e   **    to run in
1d670 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c  ternally on chil
1d680 64 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65  d tables. If the
1d690 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  re is an index t
1d6a0 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20  hat can.  **    
1d6b0 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
1d6c0 69 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20  ize this query, 
1d6d0 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f  then it can also
1d6e0 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
1d6f0 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65  FK.  **    imple
1d700 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74  mentation to opt
1d710 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
1d720 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
1d730 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a  s on the parent.
1d740 20 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20    **    table.. 
1d750 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c   **.  ** 1. A GL
1d760 4f 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61  OB pattern suita
1d770 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ble for sqlite3_
1d780 73 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68  strglob(). If th
1d790 65 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79  e plan output by
1d7a0 0a 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50  .  **    the EXP
1d7b0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1d7c0 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20  command matches 
1d7d0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
1d7e0 65 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20  en the schema.  
1d7f0 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61  **    contains a
1d800 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  n index that can
1d810 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69   be used to opti
1d820 6d 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a  mize the query..
1d830 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d    **.  ** 2. Hum
1d840 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
1d850 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1d860 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
1d870 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67  and columns. e.g
1d880 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
1d890 20 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63    "child_table(c
1d8a0 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64  hild_key1, child
1d8b0 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a  _key2)".  **.  *
1d8c0 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 3. Human reada
1d8d0 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
1d8e0 73 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65  scribes the pare
1d8f0 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  nt table and col
1d900 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  umns. e.g..  **.
1d910 20 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65    **       "pare
1d920 6e 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f  nt_table(parent_
1d930 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79  key1, parent_key
1d940 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e  2)".  **.  ** 4.
1d950 20 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49   A full CREATE I
1d960 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66  NDEX statement f
1d970 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
1d980 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74   could be used t
1d990 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69  o.  **    optimi
1d9a0 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  ze DELETE or UPD
1d9b0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ATE statements o
1d9c0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
1d9d0 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  le. e.g..  **.  
1d9e0 2a 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45  **       "CREATE
1d9f0 20 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62   INDEX child_tab
1da00 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20  le_child_key ON 
1da10 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c  child_table(chil
1da20 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a  d_key)".  **.  *
1da30 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66  * 5. The name of
1da40 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
1da50 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1da60 73 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72  se six values ar
1da70 65 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20  e used by the C 
1da80 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67  logic below to g
1da90 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f  enerate the repo
1daa0 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  rt..  */.  const
1dab0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20   char *zSql =.  
1dac0 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20  "SELECT ".    " 
1dad0 20 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45      'EXPLAIN QUE
1dae0 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 72  RY PLAN SELECT r
1daf0 6f 77 69 64 20 46 52 4f 4d 20 27 20 7c 7c 20 71  owid FROM ' || q
1db00 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
1db10 27 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22  ' WHERE '".    "
1db20 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
1db30 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  t(quote(s.name) 
1db40 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28  || '.' || quote(
1db50 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f  f.[from]) || '=?
1db60 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b  ' ".    "  || fk
1db70 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
1db80 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  e(".    "       
1db90 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45  f.[table], COALE
1dba0 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
1dbb0 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66  ame]), s.name, f
1dbc0 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27  .[from]),' AND '
1dbd0 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  )".    ", ".    
1dbe0 22 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41  "     'SEARCH TA
1dbf0 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20  BLE ' || s.name 
1dc00 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52  || ' USING COVER
1dc10 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20  ING INDEX*('".  
1dc20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
1dc30 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e  ncat('*=?', ' AN
1dc40 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  D ') || ')'".   
1dc50 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
1dc60 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c  s.name  || '(' |
1dc70 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
1dc80 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20  .[from],  ', ') 
1dc90 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
1dca0 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
1dcb0 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67  ble] || '(' || g
1dcc0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c  roup_concat(COAL
1dcd0 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
1dce0 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a  name])) || ')'".
1dcf0 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
1dd00 20 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58     'CREATE INDEX
1dd10 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
1dd20 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70  me ||'_'|| group
1dd30 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d  _concat(f.[from]
1dd40 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20  , '_'))".    "  
1dd50 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f  || ' ON ' || quo
1dd60 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28  te(s.name) || '(
1dd70 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
1dd80 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
1dd90 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20  f.[from]) ||".  
1dda0 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f    "        fkey_
1ddb0 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22  collate_clause("
1ddc0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
1ddd0 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45  f.[table], COALE
1dde0 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
1ddf0 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66  ame]), s.name, f
1de00 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22  .[from]), ', ')"
1de10 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22  .    "  || ');'"
1de20 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
1de30 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a      f.[table] ".
1de40 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
1de50 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72  _master AS s, pr
1de60 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79  agma_foreign_key
1de70 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53  _list(s.name) AS
1de80 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a   f ".    "LEFT J
1de90 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65  OIN pragma_table
1dea0 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70  _info AS p ON (p
1deb0 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72  k-1=seq AND p.ar
1dec0 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20  g=f.[table]) ". 
1ded0 20 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e     "GROUP BY s.n
1dee0 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20  ame, f.id ".    
1def0 22 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20  "ORDER BY (CASE 
1df00 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74  WHEN ? THEN f.[t
1df10 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d  able] ELSE s.nam
1df20 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f  e END)".  ;.  co
1df30 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49  nst char *zGlobI
1df40 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42  PK = "SEARCH TAB
1df50 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47  LE * USING INTEG
1df60 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28  ER PRIMARY KEY (
1df70 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f  rowid=?)";..  fo
1df80 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=2; i<nArg; i
1df90 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ++){.    int n =
1dfa0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41   (int)strlen(azA
1dfb0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[i]);.    if( 
1dfc0 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73  n>1 && sqlite3_s
1dfd0 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73  trnicmp("-verbos
1dfe0 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  e", azArg[i], n)
1dff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65  ==0 ){.      bVe
1e000 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
1e010 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
1e020 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  1 && sqlite3_str
1e030 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70  nicmp("-groupbyp
1e040 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d  arent", azArg[i]
1e050 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
1e060 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20   bGroupByParent 
1e070 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65  = 1;.      zInde
1e080 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20  nt = "    ";.   
1e090 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
1e0a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
1e0b0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73  derr, "Usage: %s
1e0c0 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f   %s ?-verbose? ?
1e0d0 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c  -groupbyparent?\
1e0e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a  n",.          az
1e0f0 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d  Arg[0], azArg[1]
1e100 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1e110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1e120 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
1e130 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
1e140 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  e fkey_collate_c
1e150 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63  lause() SQL func
1e160 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  tion */.  rc = s
1e170 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1e180 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79  nction(db, "fkey
1e190 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22  _collate_clause"
1e1a0 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 4, SQLITE_UTF8
1e1b0 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c  ,.      0, shell
1e1c0 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73  FkeyCollateClaus
1e1d0 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20  e, 0, 0.  );... 
1e1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e1f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1e200 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1e210 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
1e220 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20  &pSql, 0);.  }. 
1e230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e240 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1e250 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
1e260 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65   1, bGroupByPare
1e270 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nt);.  }..  if( 
1e280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e290 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1e2a0 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20    char *zPrev = 
1e2b0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  0;.    while( SQ
1e2c0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1e2d0 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
1e2e0 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
1e2f0 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
1e300 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
1e310 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73   = 0;.      cons
1e320 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28  t char *zEQP = (
1e330 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1e340 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1e350 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSql, 0);.      
1e360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
1e370 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
1e380 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1e390 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20  text(pSql, 1);. 
1e3a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e3b0 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20  *zFrom = (const 
1e3c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1e3d0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
1e3e0 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  2);.      const 
1e3f0 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20  char *zTarget = 
1e400 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e410 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1e420 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20  (pSql, 3);.     
1e430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49   const char *zCI
1e440 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1e450 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e460 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20  ext(pSql, 4);.  
1e470 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e480 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
1e490 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1e4a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1e4b0 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d   5);..      rc =
1e4c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1e4d0 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
1e4e0 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
1e4f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e500 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
1e510 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
1e520 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
1e530 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29  step(pExplain) )
1e540 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1e550 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63  char *zPlan = (c
1e560 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1e570 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1e580 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20  Explain, 3);.   
1e590 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20       res = (.   
1e5a0 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71             0==sq
1e5b0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
1e5c0 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20  lob, zPlan).    
1e5d0 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c         || 0==sql
1e5e0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c  ite3_strglob(zGl
1e5f0 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20  obIPK, zPlan).  
1e600 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1e610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e620 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
1e630 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  plain);.      if
1e640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e650 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
1e660 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
1e670 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
1e680 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1e690 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29  internal error")
1e6a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1e6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e6c0 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75 70        if( bGroup
1e6d0 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20  ByParent.       
1e6e0 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c   && (bVerbose ||
1e6f0 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20   res==0).       
1e700 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c   && (zPrev==0 ||
1e710 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1e720 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29  (zParent, zPrev)
1e730 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1e740 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
1e750 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e  f(out, "-- Paren
1e760 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a  t table %s\n", z
1e770 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
1e780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e790 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20  zPrev);.        
1e7a0 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65    zPrev = sqlite
1e7b0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1e7c0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
1e7d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1e7e0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1e7f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
1e800 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25  out, "%s%s --> %
1e810 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a  s\n", zIndent, z
1e820 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20  CI, zTarget);.  
1e830 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e840 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
1e850 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1e860 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65  (out, "%s/* no e
1e870 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65 71  xtra indexes req
1e880 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20  uired for %s -> 
1e890 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20  %s */\n",.      
1e8a0 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c          zIndent,
1e8b0 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a   zFrom, zTarget.
1e8c0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1e8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e8e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e8f0 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20  _free(zPrev);.. 
1e900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
1e920 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1e930 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
1e940 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
1e950 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73    }..    rc2 = s
1e960 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1e970 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  pSql);.    if( r
1e980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e990 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1e9a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1e9b0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
1e9c0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
1e9d0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
1e9e0 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g(db));.    }.  
1e9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
1ea00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1ea10 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
1ea20 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a  rmsg(db));.  }..
1ea30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ea40 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1ea50 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20  tion of ".lint" 
1ea60 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
1ea70 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44  static int lintD
1ea80 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
1ea90 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eab0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
1eac0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
1ead0 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaf0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
1eb00 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
1eb10 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
1eb20 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1eb50 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
1eb60 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
1eb70 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 28  n = (nArg>=2 ? (
1eb80 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67  int)strlen(azArg
1eb90 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28  [1]) : 0);.  if(
1eba0 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f   n<1 || sqlite3_
1ebb0 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31  strnicmp(azArg[1
1ebc0 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73  ], "fkey-indexes
1ebd0 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61  ", n) ) goto usa
1ebe0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e  ge;.  return lin
1ebf0 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74  tFkeyIndexes(pSt
1ec00 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  ate, azArg, nArg
1ec10 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61  );.. usage:.  ra
1ec20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1ec30 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d 63   "Usage %s sub-c
1ec40 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73  ommand ?switches
1ec50 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30  ...?\n", azArg[0
1ec60 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ]);.  raw_printf
1ec70 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65 20  (stderr, "Where 
1ec80 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65  sub-commands are
1ec90 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69  :\n");.  raw_pri
1eca0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
1ecb0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22   fkey-indexes\n"
1ecc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1ecd0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 2f 2a  TE_ERROR;.}.../*
1ece0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20  .** If an input 
1ecf0 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68  line begins with
1ed00 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65   "." then invoke
1ed10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
1ed20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
1ed30 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   line..**.** Ret
1ed40 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20  urn 1 on error, 
1ed50 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30  2 to exit, and 0
1ed60 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1ed70 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74  tatic int do_met
1ed80 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a  a_command(char *
1ed90 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74  zLine, ShellStat
1eda0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d  e *p){.  int h =
1edb0 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d   1;.  int nArg =
1edc0 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a   0;.  int n, c;.
1edd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1ede0 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b  char *azArg[50];
1edf0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
1ee00 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f   input line into
1ee10 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
1ee20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
1ee30 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a  && nArg<ArraySiz
1ee40 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  e(azArg) ){.    
1ee50 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
1ee60 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
1ee70 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
1ee80 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [h]==0 ) break;.
1ee90 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
1eea0 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
1eeb0 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  h]=='"' ){.     
1eec0 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
1eed0 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[h++];.      a
1eee0 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
1eef0 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
1ef00 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
1ef10 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c  && zLine[h]!=del
1ef20 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  im ){.        if
1ef30 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27  ( zLine[h]=='\\'
1ef40 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
1ef50 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20  & zLine[h+1]!=0 
1ef60 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68  ) h++;.        h
1ef70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1ef80 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
1ef90 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
1efa0 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
1efb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1efc0 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
1efd0 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
1efe0 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
1eff0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1f000 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
1f010 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
1f020 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
1f030 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63  ne[h] && !IsSpac
1f040 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
1f050 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
1f060 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65  zLine[h] ) zLine
1f070 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
1f080 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
1f090 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
1f0a0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
1f0b0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
1f0c0 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
1f0d0 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
1f0e0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
1f0f0 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
1f100 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
1f110 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
1f120 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
1f130 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ];..#ifndef SQLI
1f140 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1f150 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27  ATION.  if( c=='
1f160 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
1f170 41 72 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20  Arg[0], "auth", 
1f180 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
1f190 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
1f1a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1f1b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75  err, "Usage: .au
1f1c0 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20  th ON|OFF\n");. 
1f1d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
1f1e0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
1f1f0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
1f200 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
1f210 30 29 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c  0);.    if( bool
1f220 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
1f230 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ]) ){.      sqli
1f240 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
1f250 65 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41  er(p->db, shellA
1f260 75 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  uth, p);.    }el
1f270 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1f280 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
1f290 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1f2a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
1f2b0 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27  dif..  if( (c=='
1f2c0 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
1f2d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
1f2e0 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29  "backup", n)==0)
1f2f0 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26  .   || (c=='s' &
1f300 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
1f310 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76  p(azArg[0], "sav
1f320 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a  e", n)==0).  ){.
1f330 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f340 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20  zDestFile = 0;. 
1f350 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f360 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  Db = 0;.    sqli
1f370 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
1f380 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
1f390 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
1f3a0 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b   j;.    for(j=1;
1f3b0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20   j<nArg; j++){. 
1f3c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f3d0 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  *z = azArg[j];. 
1f3e0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
1f3f0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  -' ){.        wh
1f400 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29  ile( z[0]=='-' )
1f410 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a   z++;.        /*
1f420 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70   No options to p
1f430 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20 74  rocess at this t
1f440 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ime */.        {
1f450 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
1f460 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1f470 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
1f480 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
1f490 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f4a0 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1f4b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f4c0 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
1f4d0 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
1f4e0 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
1f4f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
1f500 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
1f510 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
1f520 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
1f530 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
1f540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f550 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
1f560 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79  tderr, "too many
1f570 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62   arguments to .b
1f580 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20  ackup\n");.     
1f590 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f5a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f5b0 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
1f5c0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
1f5d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
1f5e0 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
1f5f0 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
1f600 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
1f610 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1f620 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
1f630 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
1f640 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
1f650 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44  n(zDestFile, &pD
1f660 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  est);.    if( rc
1f670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f680 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1f690 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1f6a0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
1f6b0 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
1f6c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f6d0 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
1f6e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1f6f0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
1f700 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
1f710 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
1f720 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
1f730 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c  , "main", p->db,
1f740 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
1f750 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
1f760 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1f770 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
1f780 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
1f790 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
1f7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1f7b0 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
1f7c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1f7d0 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
1f7e0 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
1f7f0 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
1f800 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
1f810 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
1f820 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
1f830 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
1f840 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1f850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
1f860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f870 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f880 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
1f890 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
1f8a0 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
1f8b0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
1f8c0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1f8d0 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  e(pDest);.  }els
1f8e0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  e..  if( c=='b' 
1f8f0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
1f900 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
1f910 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  il", n)==0 ){.  
1f920 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
1f930 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  .      bail_on_e
1f940 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  rror = booleanVa
1f950 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
1f960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f970 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1f980 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c  r, "Usage: .bail
1f990 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
1f9a0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
1f9b0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
1f9c0 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
1f9d0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
1f9e0 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29  0], "binary", n)
1f9f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
1fa00 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
1fa10 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
1fa20 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
1fa30 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
1fa40 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
1fa50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fa60 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
1fa70 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
1fa80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1fa90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1faa0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
1fab0 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c   .binary on|off\
1fac0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
1fad0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
1fae0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
1faf0 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
1fb00 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ],"cd")==0 ){.  
1fb10 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
1fb20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1fb30 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1fb40 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68  WIN32).      wch
1fb50 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
1fb60 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1fb70 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d  unicode(azArg[1]
1fb80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53  );.      rc = !S
1fb90 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f  etCurrentDirecto
1fba0 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71  ryW(z);.      sq
1fbb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
1fbc0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
1fbd0 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b  chdir(azArg[1]);
1fbe0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1fbf0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1fc00 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1fc10 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e  rr, "Cannot chan
1fc20 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
1fc30 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
1fc40 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
1fc50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1fc60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fc70 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1fc80 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49  , "Usage: .cd DI
1fc90 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20  RECTORY\n");.   
1fca0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
1fcb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
1fcc0 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  he undocumented 
1fcd0 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f  ".breakpoint" co
1fce0 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63  mmand causes a c
1fcf0 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70  all to the no-op
1fd00 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61  .  ** routine na
1fd10 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  med test_breakpo
1fd20 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  int()..  */.  if
1fd30 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
1fd40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
1fd50 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e  g[0], "breakpoin
1fd60 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
1fd70 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1fd80 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ();.  }else..  i
1fd90 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d  f( c=='c' && n>=
1fda0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
1fdb0 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22  rg[0], "changes"
1fdc0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
1fdd0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
1fde0 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
1fdf0 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e  ag(p, SHFLG_Coun
1fe00 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b  tChanges, azArg[
1fe10 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
1fe20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1fe30 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
1fe40 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66   .changes on|off
1fe50 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
1fe60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1fe70 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f  e..  /* Cancel o
1fe80 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69 6f  utput redirectio
1fe90 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72 72  n, if it is curr
1fea0 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74  ently set (by .t
1feb0 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68  estcase).  ** Th
1fec0 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  en read the cont
1fed0 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74 63  ent of the testc
1fee0 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65  ase-out.txt file
1fef0 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61   and compare aga
1ff00 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b  inst.  ** azArg[
1ff10 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  1].  If there ar
1ff20 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72  e differences, r
1ff30 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61  eport an error a
1ff40 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20  nd exit..  */.  
1ff50 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
1ff60 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
1ff70 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c  Arg[0], "check",
1ff80 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
1ff90 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20  ar *zRes = 0;.  
1ffa0 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
1ffb0 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  );.    if( nArg!
1ffc0 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
1ffd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1ffe0 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c  Usage: .check GL
1fff0 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a  OB-PATTERN\n");.
20000 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
20010 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65    }else if( (zRe
20020 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65  s = readFile("te
20030 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c  stcase-out.txt",
20040 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
20050 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
20060 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
20070 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61 73  ot read 'testcas
20080 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a  e-out.txt'\n");.
20090 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
200a0 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74    }else if( test
200b0 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b  case_glob(azArg[
200c0 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20  1],zRes)==0 ){. 
200d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
200e0 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
200f0 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 63            "testc
20100 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20  ase-%s FAILED\n 
20110 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
20120 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c        Got: [%s]\
20130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20140 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73       p->zTestcas
20150 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65  e, azArg[1], zRe
20160 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32  s);.      rc = 2
20170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20180 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
20190 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65  tdout, "testcase
201a0 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54  -%s ok\n", p->zT
201b0 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20  estcase);.      
201c0 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20  p->nCheck++;.   
201d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
201e0 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c  ree(zRes);.  }el
201f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
20200 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
20210 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e  g[0], "clone", n
20220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
20230 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
20240 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61   tryToClone(p, a
20250 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
20260 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
20270 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
20280 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c  sage: .clone FIL
20290 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
202a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
202b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
202c0 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73  ='d' && n>1 && s
202d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
202e0 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29   "databases", n)
202f0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
20300 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
20310 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
20320 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
20330 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  , 0);.    memcpy
20340 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
20350 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
20360 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
20370 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
20380 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
20390 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73  MODE_List;.    s
203a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
203b0 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53  sizeof(data.colS
203c0 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63  eparator),data.c
203d0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22  olSeparator,": "
203e0 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20  );.    data.cnt 
203f0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
20400 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
20410 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20  LECT name, file 
20420 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
20430 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
20450 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
20460 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
20470 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
20480 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
20490 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
204a0 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
204b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
204c0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
204d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
204e0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
204f0 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='d' && strncmp(
20500 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
20510 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
20520 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
20530 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
20540 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
20550 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
20560 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
20570 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
20580 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
20590 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20  t char *zLike = 
205a0 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
205b0 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48    int savedShowH
205c0 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48  eader = p->showH
205d0 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c  eader;.    Shell
205e0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
205f0 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
20600 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29  |SHFLG_Newlines)
20610 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
20620 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
20630 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b     if( azArg[i][
20640 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
20650 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20660 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20   = azArg[i]+1;. 
20670 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
20680 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
20690 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
206a0 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  ,"preserve-rowid
206b0 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  s")==0 ){.#ifdef
206c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
206d0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
206e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
206f0 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72  tderr, "The --pr
20700 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70  eserve-rowids op
20710 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  tion is not comp
20720 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20  atible".        
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49       " with SQLI
20750 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20760 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ABLE\n");.      
20770 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
20780 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
20790 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65  command_exit;.#e
207a0 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68  lse.          Sh
207b0 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48  ellSetFlag(p, SH
207c0 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
207d0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
207e0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
207f0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e   if( strcmp(z,"n
20800 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a  ewlines")==0 ){.
20810 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
20820 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
20830 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20  Newlines);.     
20840 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
20850 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77   {.          raw
20860 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20870 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20  "Unknown option 
20880 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d  \"%s\" on \".dum
20890 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d  p\"\n", azArg[i]
208a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
208b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
208c0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
208d0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
208e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
208f0 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
20900 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
20910 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75  err, "Usage: .du
20920 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72  mp ?--preserve-r
20930 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20  owids? ".       
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73      "?--newlines
20960 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  ? ?LIKE-PATTERN?
20970 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
20980 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
20990 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
209a0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  exit;.      }els
209b0 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65  e{.        zLike
209c0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
209d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f     }.    }.    o
209e0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
209f0 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
20a00 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c  g back a "dump",
20a10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67   the content mig
20a20 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20  ht appear in an 
20a30 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69  order.    ** whi
20a40 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69  ch causes immedi
20a50 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
20a60 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62  constraints to b
20a70 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20  e violated..    
20a80 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f  ** So disable fo
20a90 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72  reign-key constr
20aa0 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  aint enforcement
20ab0 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62   to prevent prob
20ac0 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77  lems. */.    raw
20ad0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
20ae0 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
20af0 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  keys=OFF;\n");. 
20b00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
20b10 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41  >out, "BEGIN TRA
20b20 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20  NSACTION;\n");. 
20b30 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
20b40 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d  hema = 0;.    p-
20b50 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  >showHeader = 0;
20b60 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74  .    /* Set writ
20b70 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73  able_schema=ON s
20b80 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f  ince doing so fo
20b90 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69  rces SQLite to i
20ba0 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a  nitialize.    **
20bb0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20   as much of the 
20bc0 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e  schema as it can
20bd0 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c   even if the sql
20be0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
20bf0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75   is.    ** corru
20c00 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pt. */.    sqlit
20c10 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
20c20 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20  SAVEPOINT dump; 
20c30 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
20c40 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30  schema=ON", 0, 0
20c50 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72  , 0);.    p->nEr
20c60 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  r = 0;.    if( z
20c70 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Like==0 ){.     
20c80 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
20c90 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
20ca0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
20cb0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
20cc0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
20cd0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
20ce0 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
20cf0 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44  ype=='table' AND
20d00 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
20d10 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
20d20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
20d30 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
20d40 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
20d50 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
20d60 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
20d70 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
20d80 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
20d90 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
20da0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
20db0 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
20dc0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
20dd0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
20de0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
20df0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
20e00 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
20e10 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
20e20 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
20e30 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
20e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e50 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
20e60 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
20e70 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
20e80 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
20e90 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
20ea0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
20eb0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
20ec0 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41  l_name LIKE %Q A
20ed0 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
20ee0 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
20ef0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
20f00 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
20f10 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
20f20 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20  ery(p,zSql);.   
20f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20f40 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71  zSql);.      zSq
20f50 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
20f60 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
20f70 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
20f80 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
20f90 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
20fa0 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20   NOT NULL".     
20fb0 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49     "  AND type I
20fc0 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
20fd0 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ger','view')".  
20fe0 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
20ff0 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20  _name LIKE %Q", 
21000 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
21010 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
21020 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  ry(p, zSql, 0);.
21030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21040 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
21050 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
21060 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
21070 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
21080 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
21090 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
210a0 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d  F;\n");.      p-
210b0 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
210c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
210d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
210e0 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
210f0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
21100 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
21110 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
21120 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d  db, "RELEASE dum
21130 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  p;", 0, 0, 0);. 
21140 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
21150 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20  >out, p->nErr ? 
21160 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75  "ROLLBACK; -- du
21170 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a  e to errors\n" :
21180 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
21190 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
211a0 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64   = savedShowHead
211b0 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  er;.  }else..  i
211c0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
211d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
211e0 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  echo", n)==0 ){.
211f0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
21200 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
21210 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
21220 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29  _Echo, azArg[1])
21230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21240 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
21250 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
21260 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  cho on|off\n");.
21270 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
21280 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
21290 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
212a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
212b0 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eqp", n)==0 ){. 
212c0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
212d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
212e0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c  mp(azArg[1],"ful
212f0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
21300 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 32    p->autoEQP = 2
21310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21320 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
21330 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  P = booleanValue
21340 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
21350 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
21360 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21370 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
21380 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c  .eqp on|off|full
21390 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
213a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
213b0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
213c0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
213d0 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d  [0], "exit", n)=
213e0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
213f0 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69  rg>1 && (rc = (i
21400 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
21410 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20  azArg[1]))!=0 ) 
21420 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63  exit(rc);.    rc
21430 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
21440 20 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69   /* The ".explai
21450 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75  n" command is au
21460 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74  tomatic now.  It
21470 20 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e   is largely poin
21480 74 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20  tless.  It.  ** 
21490 72 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20  retained purely 
214a0 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  for backwards co
214b0 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20  mpatibility */. 
214c0 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
214d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
214e0 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d   "explain", n)==
214f0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c  0 ){.    int val
21500 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 1;.    if( nA
21510 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rg>=2 ){.      i
21520 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
21530 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b  1],"auto")==0 ){
21540 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39  .        val = 9
21550 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  9;.      }else{.
21560 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62          val =  b
21570 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
21580 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[1]);.      }. 
21590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c     }.    if( val
215a0 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d  ==1 && p->mode!=
215b0 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a  MODE_Explain ){.
215c0 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d        p->normalM
215d0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
215e0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
215f0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
21600 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69     p->autoExplai
21610 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 0;.    }else
21620 20 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20   if( val==0 ){. 
21630 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65       if( p->mode
21640 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
21650 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f   p->mode = p->no
21660 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20  rmalMode;.      
21670 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d  p->autoExplain =
21680 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
21690 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20  ( val==99 ){.   
216a0 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
216b0 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
216c0 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
216d0 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
216e0 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31  >autoExplain = 1
216f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
21700 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26  .  if( c=='f' &&
21710 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
21720 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c  ], "fullschema",
21730 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
21740 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
21750 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
21760 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f   = 0;.    int do
21770 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d  Stats = 0;.    m
21780 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
21790 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
217a0 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
217b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
217c0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
217d0 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
217e0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
217f0 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  && optionMatch(a
21800 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74  zArg[1], "indent
21810 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  ") ){.      data
21820 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
21830 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79  de = MODE_Pretty
21840 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31  ;.      nArg = 1
21850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21860 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20  nArg!=1 ){.     
21870 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
21880 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c  rr, "Usage: .ful
21890 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
218a0 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t?\n");.      rc
218b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
218c0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
218d0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
218e0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
218f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
21900 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
21910 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
21920 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45  M".       "  (SE
21930 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
21940 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
21950 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
21960 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
21970 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f         "     FRO
21980 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
21990 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
219a0 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
219b0 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
219c0 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52  , name, rowid FR
219d0 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
219e0 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
219f0 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
21a00 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
21a10 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
21a20 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
21a30 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52   ".       "ORDER
21a40 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
21a50 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
21a60 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
21a70 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
21a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21a90 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
21aa0 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63  *pStmt;.      rc
21ab0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
21ac0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
21ae0 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
21af0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
21b10 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
21b20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
21b30 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
21b40 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
21b50 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73  );.      doStats
21b60 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
21b70 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
21b80 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OW;.      sqlite
21b90 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
21ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21bb0 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20   doStats==0 ){. 
21bc0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21bd0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53  p->out, "/* No S
21be0 54 41 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c  TAT tables avail
21bf0 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20  able */\n");.   
21c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
21c10 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
21c20 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
21c30 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
21c40 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
21c50 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
21c60 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  'ANALYZE sqlite_
21c70 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20  master'",.      
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
21c90 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
21ca0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
21cb0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
21cc0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  .mode = MODE_Ins
21cd0 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  ert;.      data.
21ce0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
21cf0 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20  lite_stat1";.   
21d00 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
21d10 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
21d20 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ROM sqlite_stat1
21d30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21d40 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
21d50 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d  ck, &data,&zErrM
21d60 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
21d70 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
21d80 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20  lite_stat3";.   
21d90 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
21da0 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
21db0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ROM sqlite_stat3
21dc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21dd0 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
21de0 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d  ck, &data,&zErrM
21df0 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
21e00 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
21e10 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20  lite_stat4";.   
21e20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
21e30 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
21e40 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ROM sqlite_stat4
21e50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21e60 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
21e70 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
21e80 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  Msg);.      raw_
21e90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
21ea0 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
21eb0 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
21ec0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
21ed0 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
21ee0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
21ef0 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  aders", n)==0 ){
21f00 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
21f10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f   ){.      p->sho
21f20 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61  wHeader = boolea
21f30 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
21f40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21f50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
21f60 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68  derr, "Usage: .h
21f70 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22  eaders on|off\n"
21f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
21f90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
21fa0 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20    if( c=='h' && 
21fb0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
21fc0 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20  , "help", n)==0 
21fd0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
21fe0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
21ff0 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   zHelp);.  }else
22000 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26  ..  if( c=='i' &
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 69 6d 70 6f 72 74 22 2c 20 6e 29  0], "import", n)
22030 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
22040 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
22050 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
22060 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
22070 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
22080 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
22090 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
220a0 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72   of file to extr
220b0 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a  a content from *
220c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
220d0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
220e0 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
220f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
22100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22120 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
22130 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
22140 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
22150 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22160 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
22170 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
22180 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
221b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
221c0 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
221d0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43      /* True to C
221e0 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
221f0 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20  K at end */.    
22200 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
22210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22220 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
22230 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  n p->colSeparato
22240 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  r[] */.    char 
22250 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
22260 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
22270 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
22280 20 20 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78    ImportCtx sCtx
22290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
222a0 20 52 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20   Reader context 
222b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51  */.    char *(SQ
222c0 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61  LITE_CDECL *xRea
222d0 64 29 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20  d)(ImportCtx*); 
222e0 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20  /* Func to read 
222f0 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  one value */.   
22300 20 69 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45   int (SQLITE_CDE
22310 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c  CL *xCloser)(FIL
22320 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e  E*);      /* Fun
22330 63 20 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20  c to close file 
22340 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  */..    if( nArg
22350 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=3 ){.      raw
22360 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
22370 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20  "Usage: .import 
22380 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a  FILE TABLE\n");.
22390 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
223a0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
223b0 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
223c0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54  azArg[1];.    zT
223d0 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  able = azArg[2];
223e0 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75  .    seenInterru
223f0 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  pt = 0;.    mems
22400 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
22410 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
22420 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
22430 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
22440 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
22450 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
22460 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
22470 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
22480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22490 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75    "Error: non-nu
224a0 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ll column separa
224b0 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
224c0 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
224d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
224e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
224f0 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
22500 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
22510 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
22520 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70  acter column sep
22530 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
22540 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
22550 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
22560 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
22570 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22580 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74   }.    nSep = st
22590 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
225a0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
225b0 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
225c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
225d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e  err, "Error: non
225e0 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61  -null row separa
225f0 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
22600 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
22610 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22620 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d   }.    if( nSep=
22630 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d  =2 && p->mode==M
22640 4f 44 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d  ODE_Csv && strcm
22650 70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  p(p->rowSeparato
22660 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20  r, SEP_CrLf)==0 
22670 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ){.      /* When
22680 20 69 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28   importing CSV (
22690 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f  only), if the ro
226a0 77 20 73 65 70 61 72 61 74 6f 72 20 69 73 20 73  w separator is s
226b0 65 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  et to the.      
226c0 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75  ** default outpu
226d0 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c  t row separator,
226e0 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68   change it to th
226f0 65 20 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a  e default input.
22700 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70        ** row sep
22710 61 72 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76  arator.  This av
22720 6f 69 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d  oids having to m
22730 61 69 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e  aintain differen
22740 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
22750 20 61 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20   and output row 
22760 73 65 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20  separators. */. 
22770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22780 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
22790 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
227a0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
227b0 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20  SEP_Row);.      
227c0 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
227d0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
227e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
227f0 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
22800 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
22810 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
22820 2d 63 68 61 72 61 63 74 65 72 20 72 6f 77 20 73  -character row s
22830 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
22840 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
22860 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
22870 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22880 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46     }.    sCtx.zF
22890 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20  ile = zFile;.   
228a0 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b   sCtx.nLine = 1;
228b0 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46  .    if( sCtx.zF
228c0 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23  ile[0]=='|' ){.#
228d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
228e0 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61  T_POPEN.      ra
228f0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
22900 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61   "Error: pipes a
22910 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
22920 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b   in this OS\n");
22930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
22940 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74  .#else.      sCt
22950 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74  x.in = popen(sCt
22960 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b  x.zFile+1, "r");
22970 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c  .      sCtx.zFil
22980 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20  e = "<pipe>";.  
22990 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63      xCloser = pc
229a0 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  lose;.#endif.   
229b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43   }else{.      sC
229c0 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43  tx.in = fopen(sC
229d0 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  tx.zFile, "rb");
229e0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
229f0 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20   fclose;.    }. 
22a00 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
22a10 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20  MODE_Ascii ){.  
22a20 20 20 20 20 78 52 65 61 64 20 3d 20 61 73 63 69      xRead = asci
22a30 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
22a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22a50 20 20 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72     xRead = csv_r
22a60 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
22a70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74     }.    if( sCt
22a80 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x.in==0 ){.     
22a90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22aa0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
22ab0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
22ac0 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
22ad0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22ae0 7d 0a 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53  }.    sCtx.cColS
22af0 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72  ep = p->colSepar
22b00 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74  ator[0];.    sCt
22b10 78 2e 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72  x.cRowSep = p->r
22b20 6f 77 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  owSeparator[0];.
22b30 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
22b40 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
22b50 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a  CT * FROM %s", z
22b60 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
22b70 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
22b80 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
22b90 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
22ba0 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
22bb0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
22bc0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  x.in);.      ret
22bd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
22be0 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
22bf0 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
22c00 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
22c10 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
22c20 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
22c30 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70  ;.    import_app
22c40 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20  end_char(&sCtx, 
22c50 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73  0);    /* To ens
22c60 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c  ure sCtx.z is al
22c70 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
22c80 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33  f( rc && sqlite3
22c90 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63  _strglob("no suc
22ca0 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c  h table: *", sql
22cb0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
22cc0 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))==0 ){.      
22cd0 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
22ce0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
22cf0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
22d00 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
22d10 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
22d20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ';.      while( 
22d30 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a  xRead(&sCtx) ){.
22d40 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20          zCreate 
22d50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22d60 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c  f("%z%c\n  \"%w\
22d70 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65  " TEXT", zCreate
22d80 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b  , cSep, sCtx.z);
22d90 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d 20  .        cSep = 
22da0 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
22db0 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
22dc0 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61  x.cColSep ) brea
22dd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
22de0 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29   if( cSep=='(' )
22df0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22e00 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
22e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22e20 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
22e30 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73         xCloser(s
22e40 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20  Ctx.in);.       
22e50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22e60 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66  err,"%s: empty f
22e70 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69  ile\n", sCtx.zFi
22e80 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  le);.        ret
22e90 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
22ea0 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
22eb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
22ec0 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29  %z\n)", zCreate)
22ed0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
22ee0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
22ef0 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
22f00 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
22f10 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
22f20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
22f30 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
22f40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52  intf(stderr, "CR
22f50 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e  EATE TABLE %s(..
22f60 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  .) failed: %s\n"
22f70 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  , zTable,.      
22f80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22f90 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
22fa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22fb0 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
22fc0 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
22fd0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
22fe0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22ff0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
23000 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
23010 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
23020 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
23030 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23040 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
23050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23060 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
23070 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
23080 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  mt);.      utf8_
23090 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
230a0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
230b0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
230c0 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b));.      xClos
230d0 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
230e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
230f0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
23100 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
23110 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
23120 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
23130 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
23140 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
23150 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
23160 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
23170 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
23180 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
23190 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65  _malloc64( nByte
231a0 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  *2 + 20 + nCol*2
231b0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
231c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
231d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
231e0 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
231f0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
23200 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
23210 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23220 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
23230 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
23240 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+20, zSql, "I
23250 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
23260 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
23270 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
23280 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
23290 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
232a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
232b0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
232c0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
232d0 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
232e0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
232f0 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
23300 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
23310 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
23320 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
23330 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
23340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
23350 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
23360 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
23370 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
23380 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
23390 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
233a0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  );.      if (pSt
233b0 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
233c0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
233d0 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
233e0 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
233f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
23400 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69  eedCommit = sqli
23410 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
23420 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  it(p->db);.    i
23430 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
23440 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
23450 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
23460 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  0, 0);.    do{. 
23470 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69       int startLi
23480 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b  ne = sCtx.nLine;
23490 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
234a0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
234b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
234c0 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
234d0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
234e0 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
234f0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66   end-of-file bef
23500 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20  ore finding any 
23510 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20  columns?.       
23520 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20   ** If so, stop 
23530 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20  instead of NULL 
23540 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61  filling the rema
23550 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
23560 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23570 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d    if( z==0 && i=
23580 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23590 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
235a0 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
235b0 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e  nd-of-file OR en
235c0 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65  d-of-line before
235d0 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20   finding any.   
235e0 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
235f0 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20  in ASCII mode?  
23600 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
23610 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
23620 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
23630 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
23640 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
23650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
23660 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69  mode==MODE_Ascii
23670 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30   && (z==0 || z[0
23680 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20  ]==0) && i==0 ) 
23690 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
236a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
236b0 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20  (pStmt, i+1, z, 
236c0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
236d0 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69  IENT);.        i
236e0 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73  f( i<nCol-1 && s
236f0 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
23700 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20  cColSep ){.     
23710 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23720 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
23730 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
23740 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
23750 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73  "filling the res
23780 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a  t with NULL\n",.
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
237b0 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
237c0 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
237d0 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
237e0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
237f0 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74  i<=nCol ){ sqlit
23800 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
23810 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20  mt, i); i++; }. 
23820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23830 0a 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e  .      if( sCtx.
23840 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c  cTerm==sCtx.cCol
23850 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64  Sep ){.        d
23860 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78 52 65  o{.          xRe
23870 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
23880 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
23890 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
238a0 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53  Term==sCtx.cColS
238b0 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74  ep );.        ut
238c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
238d0 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
238e0 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
238f0 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69         "extras i
23920 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20  gnored\n",.     
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
23950 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
23960 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
23970 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b    if( i>=nCol ){
23980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23990 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
239a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
239b0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
239c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
239d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
239e0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
239f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
23a00 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65  %d: INSERT faile
23a10 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a  d: %s\n", sCtx.z
23a20 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
23a30 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72              star
23a40 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65  tLine, sqlite3_e
23a50 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
23a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23a70 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74  .    }while( sCt
23a80 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a  x.cTerm!=EOF );.
23a90 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74  .    xCloser(sCt
23aa0 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  x.in);.    sqlit
23ab0 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
23ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
23ad0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
23ae0 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
23af0 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
23b00 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  p->db, "COMMIT",
23b10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
23b20 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
23b30 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
23b40 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
23b50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
23b60 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d  "imposter", n)==
23b70 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
23b80 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sql;.    char *z
23b90 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Collist = 0;.   
23ba0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
23bb0 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e  Stmt;.    int tn
23bc0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  um = 0;.    int 
23bd0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  i;.    if( nArg!
23be0 3d 33 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =3 ){.      utf8
23bf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23c00 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65  "Usage: .imposte
23c10 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52  r INDEX IMPOSTER
23c20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
23c30 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
23c40 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
23c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
23c60 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a  _db(p, 0);.    z
23c70 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
23c80 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f  rintf("SELECT ro
23c90 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
23ca0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
23cd0 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
23ce0 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67  ='index'", azArg
23cf0 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
23d00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
23d10 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
23d20 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
23d30 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
23d40 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
23d50 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
23d60 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
23d70 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65     tnum = sqlite
23d80 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
23d90 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 0);.    }.  
23da0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
23db0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
23dc0 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  f( tnum==0 ){.  
23dd0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23de0 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68  stderr, "no such
23df0 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e   index: \"%s\"\n
23e00 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
23e10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
23e20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
23e30 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
23e40 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
23e50 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
23e60 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27  MA index_xinfo='
23e70 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  %q'", azArg[1]);
23e80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23e90 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
23ea0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
23eb0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
23ec0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
23ed0 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20  ;.    i = 0;.   
23ee0 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
23ef0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
23f00 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
23f10 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d   char zLabel[20]
23f20 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
23f30 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  ar *zCol = (cons
23f40 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
23f50 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
23f60 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  t,2);.      i++;
23f70 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d  .      if( zCol=
23f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
23f90 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
23fa0 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d  _int(pStmt,1)==-
23fb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  1 ){.          z
23fc0 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
23fd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23fe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ff0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
24000 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c  f(zLabel),zLabel
24010 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20  ,"expr%d",i);.  
24020 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a          zCol = z
24030 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Label;.        }
24040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24050 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29  f( zCollist==0 )
24060 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69  {.        zColli
24070 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
24080 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
24090 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
240a0 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  e{.        zColl
240b0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ist = sqlite3_mp
240c0 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22  rintf("%z,\"%w\"
240d0 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ", zCollist, zCo
240e0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
240f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
24100 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
24110 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
24120 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
24130 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
24140 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49  LE \"%w\"(%s,PRI
24150 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57 49 54  MARY KEY(%s))WIT
24160 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20  HOUT ROWID",.   
24170 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c         azArg[2],
24180 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c   zCollist, zColl
24190 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
241a0 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29  3_free(zCollist)
241b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
241c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
241d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
241e0 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
241f0 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d   "main", 1, tnum
24200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
24230 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
24240 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
24250 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
24260 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
24270 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
24280 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30  p->db, "main", 0
24290 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
242a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
242b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
242c0 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d  , "Error in [%s]
242d0 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73  : %s\n", zSql, s
242e0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
242f0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >db));.      }el
24300 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
24310 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
24320 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  "%s;\n", zSql);.
24330 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
24340 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20  tf(stdout,.     
24350 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20        "WARNING: 
24360 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d  writing to an im
24370 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c  poster table wil
24380 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e  l corrupt the in
24390 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20  dex!\n".        
243a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
243b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
243c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
243d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
243e0 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73  IMPOSTER returns
243f0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
24400 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
24410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24420 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65  e(zSql);.  }else
24430 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
24440 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24450 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f  TEST_CONTROL) */
24460 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
24470 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
24480 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
24490 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
244a0 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d   "iotrace", n)==
244b0 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f  0 ){.    SQLITE_
244c0 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20  API extern void 
244d0 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73  (SQLITE_CDECL *s
244e0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63  qlite3IoTrace)(c
244f0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29  onst char*, ...)
24500 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63  ;.    if( iotrac
24510 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74  e && iotrace!=st
24520 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f  dout ) fclose(io
24530 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72  trace);.    iotr
24540 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ace = 0;.    if(
24550 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
24560 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
24570 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
24580 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
24590 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20  1], "-")==0 ){. 
245a0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
245b0 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
245c0 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61  ntf;.      iotra
245d0 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ce = stdout;.   
245e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
245f0 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a  trace = fopen(az
24600 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20  Arg[1], "w");.  
24610 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d      if( iotrace=
24620 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
24630 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24640 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
24650 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
24660 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
24670 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
24680 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
24690 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
246a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
246b0 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
246c0 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
246d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
246e0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
246f0 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20   c=='l' && n>=5 
24700 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
24710 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e  [0], "limits", n
24720 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
24730 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
24740 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {.       const c
24750 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b  har *zLimitName;
24760 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
24770 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20  limit */.       
24780 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20  int limitCode;  
24790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
247a0 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68  eger code for th
247b0 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  at limit */.    
247c0 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  } aLimit[] = {. 
247d0 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c       { "length",
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
24800 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
24810 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
24820 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20  { "sql_length", 
24830 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
24840 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
24850 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
24860 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f    },.      { "co
24870 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lumn",          
24880 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
24890 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
248b0 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65        { "expr_de
248c0 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  pth",           
248d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58   SQLITE_LIMIT_EX
248e0 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  PR_DEPTH        
248f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
24900 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c   { "compound_sel
24910 65 63 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ect",       SQLI
24920 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
24930 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  D_SELECT        
24940 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
24950 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20  dbe_op",        
24960 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
24970 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20  MIT_VDBE_OP     
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
24990 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69  .      { "functi
249a0 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20  on_arg",        
249b0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
249c0 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
249d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
249e0 20 20 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20    { "attached", 
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
24a00 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
24a10 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
24a20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
24a30 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e  like_pattern_len
24a40 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c  gth",   SQLITE_L
24a50 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
24a60 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d  N_LENGTH       }
24a70 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72 69 61  ,.      { "varia
24a80 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20  ble_number",    
24a90 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24aa0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
24ab0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24ac0 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65     { "trigger_de
24ad0 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 53 51  pth",         SQ
24ae0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
24af0 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
24b00 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
24b10 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22  "worker_threads"
24b20 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
24b30 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
24b40 45 41 44 53 20 20 20 20 20 20 20 20 20 20 20 20  EADS            
24b50 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
24b60 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65  t i, n2;.    ope
24b70 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
24b80 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
24b90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24ba0 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74  ArraySize(aLimit
24bb0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
24bc0 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64   printf("%20s %d
24bd0 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a  \n", aLimit[i].z
24be0 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
24bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24c00 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
24c10 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f  Limit[i].limitCo
24c20 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  de, -1));.      
24c30 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
24c40 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20  nArg>3 ){.      
24c50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
24c60 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69  r, "Usage: .limi
24c70 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55  t NAME ?NEW-VALU
24c80 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  E?\n");.      rc
24c90 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
24ca0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
24cb0 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  it;.    }else{. 
24cc0 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20       int iLimit 
24cd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d  = -1;.      n2 =
24ce0 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
24cf0 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  1]);.      for(i
24d00 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
24d10 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
24d20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
24d30 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d  e3_strnicmp(aLim
24d40 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  it[i].zLimitName
24d50 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d  , azArg[1], n2)=
24d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24d70 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a  if( iLimit<0 ){.
24d80 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d              iLim
24d90 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  it = i;.        
24da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24db0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24dc0 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75  (stderr, "ambigu
24dd0 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  ous limit: \"%s\
24de0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
24df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24e00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
24e10 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
24e20 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
24e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24e50 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
24e60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24e70 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
24e80 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  n limit: \"%s\"\
24e90 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
24ea0 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 74 65             "ente
24eb0 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69  r \".limits\" wi
24ec0 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
24ed0 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a  for a list.\n",.
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
24f00 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
24f10 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
24f20 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
24f30 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
24f40 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
24f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24f60 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c  _limit(p->db, aL
24f70 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d  imit[iLimit].lim
24f80 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  itCode,.        
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
24fa0 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
24fb0 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20  azArg[2]));.    
24fc0 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
24fd0 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
24fe0 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69  imit[iLimit].zLi
24ff0 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
25000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
25010 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
25020 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
25030 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ode, -1));.    }
25040 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
25050 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26  c=='l' && n>2 &&
25060 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
25070 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30  ], "lint", n)==0
25080 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
25090 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44  p, 0);.    lintD
250a0 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
250b0 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
250c0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
250d0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
250e0 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d  ENSION.  if( c==
250f0 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
25100 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c  zArg[0], "load",
25110 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
25120 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
25130 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61   *zProc;.    cha
25140 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
25150 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
25160 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
25170 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
25180 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45  e: .load FILE ?E
25190 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a  NTRYPOINT?\n");.
251a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
251b0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
251c0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
251d0 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
251e0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f  Arg[1];.    zPro
251f0 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  c = nArg>=3 ? az
25200 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20  Arg[2] : 0;.    
25210 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
25220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
25230 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
25240 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
25250 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
25260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74  E_OK ){.      ut
25280 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
25290 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
252a0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
252b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
252c0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
252d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
252e0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
252f0 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
25300 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
25310 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  og", n)==0 ){.  
25320 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
25330 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
25340 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
25350 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c  : .log FILENAME\
25360 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
25370 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
25380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25390 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
253a0 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66  ;.      output_f
253b0 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f  ile_close(p->pLo
253c0 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f  g);.      p->pLo
253d0 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  g = output_file_
253e0 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20  open(zFile);.   
253f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
25400 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e  ( c=='m' && strn
25410 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d  cmp(azArg[0], "m
25420 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ode", n)==0 ){. 
25430 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25440 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  Mode = nArg>=2 ?
25450 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a   azArg[1] : "";.
25460 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 28 69 6e      int n2 = (in
25470 74 29 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b  t)strlen(zMode);
25480 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d  .    int c2 = zM
25490 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ode[0];.    if( 
254a0 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
254b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
254c0 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d  [1],"lines",n2)=
254d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
254e0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b  ode = MODE_Line;
254f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25500 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
25510 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
25520 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
25530 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
25540 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63  }else if( c2=='c
25550 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
25560 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
25570 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
25580 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
25590 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c  olumn;.      sql
255a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
255b0 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
255c0 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
255d0 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
255e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
255f0 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
25600 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25610 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
25620 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
25630 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
25640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
25650 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
25660 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
25670 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
25680 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20   SEP_Column);.  
25690 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
256a0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
256b0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
256c0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
256d0 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
256e0 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26  se if( c2=='h' &
256f0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
25700 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30  1],"html",n2)==0
25710 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
25720 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20  e = MODE_Html;. 
25730 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
25740 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
25750 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e  azArg[1],"tcl",n
25760 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
25770 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63  ->mode = MODE_Tc
25780 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
25790 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
257a0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
257b0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
257c0 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a  or, SEP_Space);.
257d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
257e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
257f0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
25800 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
25810 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
25820 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27  else if( c2=='c'
25830 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
25840 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d  g[1],"csv",n2)==
25850 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
25860 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
25870 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
25880 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
25890 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
258a0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
258b0 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
258c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
258d0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
258e0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
258f0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
25900 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73  _CrLf);.    }els
25910 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
25920 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
25930 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20  ],"tabs",n2)==0 
25940 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
25950 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
25960 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
25970 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
25980 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
25990 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
259a0 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c  EP_Tab);.    }el
259b0 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26  se if( c2=='i' &
259c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
259d0 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d  1],"insert",n2)=
259e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
259f0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
25a00 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62  t;.      set_tab
25a10 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e  le_name(p, nArg>
25a20 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
25a30 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65  "table");.    }e
25a40 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20  lse if( c2=='q' 
25a50 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25a60 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d  [1],"quote",n2)=
25a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
25a80 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65  ode = MODE_Quote
25a90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25aa0 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63  c2=='a' && strnc
25ab0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63  mp(azArg[1],"asc
25ac0 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ii",n2)==0 ){.  
25ad0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
25ae0 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20  DE_Ascii;.      
25af0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
25b00 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
25b10 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
25b20 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55  Separator, SEP_U
25b30 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nit);.      sqli
25b40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
25b50 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
25b60 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
25b70 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72  rator, SEP_Recor
25b80 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
25b90 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
25ba0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
25bb0 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f  >out, "current o
25bc0 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e  utput mode: %s\n
25bd0 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e  ", modeDescr[p->
25be0 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  mode]);.    }els
25bf0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
25c00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
25c10 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20  or: mode should 
25c20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
25c30 20 20 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c        "ascii col
25c40 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
25c50 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75  ert line list qu
25c60 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29  ote tabs tcl\n")
25c70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
25c80 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f      }.    p->cMo
25c90 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
25ca0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
25cb0 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
25cc0 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
25cd0 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  lue", n)==0 ){. 
25ce0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
25cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
25d00 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
25d10 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70  p->nullValue), p
25d20 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20  ->nullValue,.   
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
25d50 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
25d60 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llValue)-1, azAr
25d70 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
25d80 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
25d90 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
25da0 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54  e: .nullvalue ST
25db0 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20  RING\n");.      
25dc0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
25dd0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
25de0 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'o' && strncmp(a
25df0 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c  zArg[0], "open",
25e00 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29   n)==0 && n>=2 )
25e10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
25e20 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61  Filename;  /* Na
25e30 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
25e40 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
25e50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65  */.    int iName
25e60 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 1;       /* I
25e70 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ndex in azArg[] 
25e80 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
25e90 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c  */.    int newFl
25ea0 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ag = 0;     /* T
25eb0 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69  rue to delete fi
25ec0 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e  le before openin
25ed0 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g */.    /* Clos
25ee0 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  e the existing d
25ef0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73  atabase */.    s
25f00 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
25f10 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
25f20 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
25f30 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
25f40 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
25f50 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
25f60 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f  3_free(p->zFreeO
25f70 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e  nClose);.    p->
25f80 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  zFreeOnClose = 0
25f90 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ;.    /* Check f
25fa0 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  or command-line 
25fb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
25fc0 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e   for(iName=1; iN
25fd0 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a 41 72  ame<nArg && azAr
25fe0 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27  g[iName][0]=='-'
25ff0 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20  ; iName++){.    
26000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
26010 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a  = azArg[iName];.
26020 20 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e        if( option
26030 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29 20 29  Match(z,"new") )
26040 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46 6c 61  {.        newFla
26050 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 1;.      }el
26060 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  se if( z[0]=='-'
26070 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
26080 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26090 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
260a0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
260b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
260c0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
260d0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
260e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
260f0 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69   If a filename i
26100 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72 79  s specified, try
26110 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73   to open it firs
26120 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c  t */.    zNewFil
26130 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61  ename = nArg>iNa
26140 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72  me ? sqlite3_mpr
26150 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67  intf("%s", azArg
26160 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20  [iName]) : 0;.  
26170 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61    if( zNewFilena
26180 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  me ){.      if( 
26190 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44  newFlag ) shellD
261a0 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69  eleteFile(zNewFi
261b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  lename);.      p
261c0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
261d0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
261e0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31      open_db(p, 1
261f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
26200 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  db==0 ){.       
26210 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
26220 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
26230 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22  not open '%s'\n"
26240 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  , zNewFilename);
26250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26260 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
26270 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
26280 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72  {.        p->zFr
26290 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77  eeOnClose = zNew
262a0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
262b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
262c0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
262d0 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62    /* As a fall-b
262e0 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20  ack open a TEMP 
262f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
26300 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
26310 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
26320 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  _db(p, 0);.    }
26330 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
26340 63 3d 3d 27 6f 27 0a 20 20 20 26 26 20 28 73 74  c=='o'.   && (st
26350 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
26360 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20  "output", n)==0 
26370 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
26380 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
26390 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
263a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
263b0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
263c0 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
263d0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29      if( nArg>2 )
263e0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
263f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
26400 67 65 3a 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c  ge: .%s FILE\n",
26410 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
26420 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
26430 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
26440 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
26450 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
26460 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26470 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
26480 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
26490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
264a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
264b0 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c  Usage: .once FIL
264c0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  E\n");.        r
264d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
264e0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
264f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
26500 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
26510 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 2;.    }else{
26520 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
26530 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nt = 0;.    }.  
26540 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
26550 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  );.    if( zFile
26560 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
26570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
26580 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
26590 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
265a0 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
265b0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
265c0 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
265d0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
265e0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
265f0 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  t;.#else.      p
26600 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46  ->out = popen(zF
26610 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20  ile + 1, "w");. 
26620 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
26630 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
26640 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26650 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
26660 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22  open pipe \"%s\"
26670 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b  \n", zFile + 1);
26680 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
26690 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
266a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
266b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
266c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
266d0 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
266e0 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
266f0 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
26700 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
26720 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69  >out = output_fi
26730 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a  le_open(zFile);.
26740 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74        if( p->out
26750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
26760 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
26770 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20  "off")!=0 ){.   
26780 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
26790 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
267a0 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  : cannot write t
267b0 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  o \"%s\"\n", zFi
267c0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
267d0 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20         p->out = 
267e0 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  stdout;.        
267f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20  rc = 1;.      } 
26800 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
26810 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26820 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
26830 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
26840 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
26850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
26860 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70  lse..  if( c=='p
26870 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
26880 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26890 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  print", n)==0 ){
268a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
268b0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b  for(i=1; i<nArg;
268c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
268d0 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74   i>1 ) raw_print
268e0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a  f(p->out, " ");.
268f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
26900 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
26910 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  azArg[i]);.    }
26920 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
26930 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
26940 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
26950 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='p' && strncmp(
26960 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70  azArg[0], "promp
26970 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
26980 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20   if( nArg >= 2) 
26990 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
269a0 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67  mainPrompt,azArg
269b0 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [1],(int)ArraySi
269c0 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31  ze(mainPrompt)-1
269d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
269e0 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20   nArg >= 3) {.  
269f0 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74      strncpy(cont
26a00 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67  inuePrompt,azArg
26a10 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [2],(int)ArraySi
26a20 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  ze(continuePromp
26a30 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t)-1);.    }.  }
26a40 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
26a50 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
26a60 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20  Arg[0], "quit", 
26a70 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
26a80 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
26a90 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e  if( c=='r' && n>
26aa0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
26ab0 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20  Arg[0], "read", 
26ac0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c  n)==0 ){.    FIL
26ad0 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20  E *alt;.    if( 
26ae0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
26af0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26b00 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61  rr, "Usage: .rea
26b10 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  d FILE\n");.    
26b20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
26b30 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
26b40 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
26b50 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a    alt = fopen(az
26b60 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20  Arg[1], "rb");. 
26b70 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b     if( alt==0 ){
26b80 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
26b90 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
26ba0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
26bb0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
26bc0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
26bd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26be0 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
26bf0 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20  input(p, alt);. 
26c00 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29       fclose(alt)
26c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
26c20 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
26c30 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
26c40 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74  (azArg[0], "rest
26c50 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ore", n)==0 ){. 
26c60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26c70 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  SrcFile;.    con
26c80 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
26c90 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b    sqlite3 *pSrc;
26ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
26cb0 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
26cc0 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d    int nTimeout =
26cd0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72   0;..    if( nAr
26ce0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53  g==2 ){.      zS
26cf0 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  rcFile = azArg[1
26d00 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22  ];.      zDb = "
26d10 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  main";.    }else
26d20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
26d30 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
26d40 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20   azArg[2];.     
26d50 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b   zDb = azArg[1];
26d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26d70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
26d80 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65  err, "Usage: .re
26d90 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c  store ?DB? FILE\
26da0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
26db0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
26dc0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
26dd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
26de0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72  sqlite3_open(zSr
26df0 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20  cFile, &pSrc);. 
26e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74  E_OK ){.      ut
26e20 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26e30 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
26e40 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
26e50 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20   zSrcFile);.    
26e60 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
26e70 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
26e80 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
26e90 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
26ea0 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
26eb0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
26ec0 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
26ed0 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
26ee0 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
26ef0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
26f00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
26f10 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
26f20 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
26f30 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
26f40 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
26f50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
26f60 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
26f70 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
26f80 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
26f90 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
26fa0 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  OK.          || 
26fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
26fc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
26fd0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
26fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69  .        if( nTi
26ff0 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62  meout++ >= 3 ) b
27000 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
27010 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
27020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27030 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
27040 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
27050 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
27060 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
27070 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
27080 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
27090 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
270a0 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  ==SQLITE_LOCKED 
270b0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
270c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
270d0 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
270e0 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
270f0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
27100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27110 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27120 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
27130 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
27140 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
27150 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
27160 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
27170 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a  (pSrc);.  }else.
27180 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
27190 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
271a0 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c  0], "scanstats",
271b0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
271c0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
271d0 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f     p->scanstatsO
271e0 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
271f0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e  (azArg[1]);.#ifn
27200 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27210 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
27220 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  S.      raw_prin
27230 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
27240 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  ing: .scanstats 
27250 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
27260 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29   this build.\n")
27270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
27280 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
27290 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
272a0 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  age: .scanstats 
272b0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
272c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
272d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
272e0 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
272f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65  (azArg[0], "sche
27300 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ma", n)==0 ){.  
27310 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c    ShellText sSel
27320 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74  ect;.    ShellSt
27330 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
27340 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
27350 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
27360 2a 7a 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 69  *zDiv = 0;.    i
27370 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a  nt iSchema = 0;.
27380 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
27390 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
273a0 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
273b0 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
273c0 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
273d0 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
273e0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
273f0 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69  DE_Semi;.    ini
27400 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  tText(&sSelect);
27410 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
27420 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28   && optionMatch(
27430 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e  azArg[1], "inden
27440 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74  t") ){.      dat
27450 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
27460 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74  ode = MODE_Prett
27470 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 2d 2d 3b  y;.      nArg--;
27480 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d  .      if( nArg=
27490 3d 32 20 29 20 61 7a 41 72 67 5b 31 5d 20 3d 20  =2 ) azArg[1] = 
274a0 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 7d 0a  azArg[2];.    }.
274b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
274c0 26 26 20 61 7a 41 72 67 5b 31 5d 5b 30 5d 21 3d  && azArg[1][0]!=
274d0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '-' ){.      int
274e0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
274f0 30 3b 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20  0; azArg[1][i]; 
27500 69 2b 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d  i++) azArg[1][i]
27510 20 3d 20 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67   = ToLower(azArg
27520 5b 31 5d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  [1][i]);.      i
27530 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
27540 31 5d 2c 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  1],"sqlite_maste
27550 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
27560 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76    char *new_argv
27570 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32  [2], *new_colv[2
27580 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ];.        new_a
27590 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45  rgv[0] = "CREATE
275a0 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61   TABLE sqlite_ma
275b0 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20  ster (\n".      
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22  "  type text,\n"
275e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
275f0 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74         "  name t
27600 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
27620 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
27630 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
27640 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74           "  root
27650 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
27660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27670 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65         "  sql te
27680 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  xt\n".          
27690 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b              ")";
276a0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
276b0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
276c0 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20    new_colv[0] = 
276d0 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e  "sql";.        n
276e0 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a  ew_colv[1] = 0;.
276f0 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
27700 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61  (&data, 1, new_a
27710 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a  rgv, new_colv);.
27720 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
27740 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
27750 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
27760 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30  temp_master")==0
27770 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
27780 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
27790 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
277a0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
277b0 20 3d 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   = "CREATE TEMP 
277c0 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d  TABLE sqlite_tem
277d0 70 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20 20  p_master (\n".  
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
27800 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
27810 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e 61             "  na
27820 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65    "  tbl_name te
27850 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
27870 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72  rootpage integer
27880 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
27890 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73 71             "  sq
278a0 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20  l text\n".      
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ")";.        new
278d0 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _argv[1] = 0;.  
278e0 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30        new_colv[0
278f0 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20  ] = "sql";.     
27900 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d     new_colv[1] =
27910 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c   0;.        call
27920 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e  back(&data, 1, n
27930 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c  ew_argv, new_col
27940 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
27950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27970 20 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20   zDiv = "(";.   
27980 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
27990 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
279a0 20 20 20 20 7a 44 69 76 20 3d 20 22 28 22 3b 0a      zDiv = "(";.
279b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
279c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
279d0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 68  rr, "Usage: .sch
279e0 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 3f  ema ?--indent? ?
279f0 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
27a00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
27a10 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
27a20 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
27a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
27a40 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  v ){.      sqlit
27a50 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
27a60 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
27a70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
27a80 32 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  2(p->db, "SELECT
27a90 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d   name FROM pragm
27aa0 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22  a_database_list"
27ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ad0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
27ae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27af0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
27b00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
27b10 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
27b20 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
27b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27b40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
27b50 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
27b60 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
27b70 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
27b80 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
27b90 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
27ba0 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73  elect, "SELECT s
27bb0 71 6c 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20  ql FROM", 0);.  
27bc0 20 20 20 20 69 53 63 68 65 6d 61 20 3d 20 30 3b      iSchema = 0;
27bd0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
27be0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
27bf0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
27c00 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
27c10 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73  har *zDb = (cons
27c20 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
27c30 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
27c40 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 0);.        c
27c50 68 61 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a  har zScNum[30];.
27c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27c70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
27c80 7a 53 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c  zScNum), zScNum,
27c90 20 22 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61   "%d", ++iSchema
27ca0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
27cb0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
27cc0 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 20 20  zDiv, 0);.      
27cd0 20 20 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e    zDiv = " UNION
27ce0 20 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20   ALL ";.        
27cf0 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 20  if( strcmp(zDb, 
27d00 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
27d10 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
27d20 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
27d30 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73  LECT shell_add_s
27d40 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b  chema(sql,", 0);
27d50 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
27d60 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
27d70 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  zDb, '"');.     
27d80 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
27d90 26 73 53 65 6c 65 63 74 2c 20 22 29 20 41 53 20  &sSelect, ") AS 
27da0 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
27db0 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
27dc0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
27dd0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
27de0 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c 20 30  elect, zScNum, 0
27df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  );.          app
27e00 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
27e10 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
27e20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  0);.          ap
27e30 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
27e40 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20  t, zDb, '\'');. 
27e50 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
27e60 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
27e70 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  AS sname FROM ",
27e80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61   0);.          a
27e90 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
27ea0 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
27eb0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
27ec0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e  ext(&sSelect, ".
27ed0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
27ee0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
27ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
27f00 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
27f10 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 2c 20 74  , "SELECT sql, t
27f20 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  ype, tbl_name, n
27f30 61 6d 65 2c 20 72 6f 77 69 64 2c 20 22 2c 20 30  ame, rowid, ", 0
27f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  );.          app
27f50 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
27f60 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20  , zScNum, 0);.  
27f70 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
27f80 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
27f90 53 20 73 6e 75 6d 2c 20 27 6d 61 69 6e 27 20 41  S snum, 'main' A
27fa0 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  S sname FROM sql
27fb0 69 74 65 5f 6d 61 73 74 65 72 22 2c 30 29 3b 0a  ite_master",0);.
27fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27fd0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
27fe0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
27ff0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
28000 74 28 26 73 53 65 6c 65 63 74 2c 20 22 29 20 57  t(&sSelect, ") W
28010 48 45 52 45 20 22 2c 20 30 29 3b 0a 20 20 20 20  HERE ", 0);.    
28020 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
28030 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51          char *zQ
28040 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  arg = sqlite3_mp
28050 72 69 6e 74 66 28 22 25 51 22 2c 20 61 7a 41 72  rintf("%Q", azAr
28060 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  g[1]);.        i
28070 66 28 20 73 74 72 63 68 72 28 61 7a 41 72 67 5b  f( strchr(azArg[
28080 31 5d 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20  1], '.') ){.    
28090 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
280a0 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65  (&sSelect, "lowe
280b0 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27  r(printf('%s.%s'
280c0 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29  ,sname,tbl_name)
280d0 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  )", 0);.        
280e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
280f0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
28100 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c  lect, "lower(tbl
28110 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20  _name)", 0);.   
28120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28130 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
28140 63 74 2c 20 73 74 72 63 68 72 28 61 7a 41 72 67  ct, strchr(azArg
28150 5b 31 5d 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c  [1], '*') ? " GL
28160 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c  OB " : " LIKE ",
28170 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
28180 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
28190 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20  , zQarg, 0);.   
281a0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
281b0 26 73 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20  &sSelect, " AND 
281c0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  ", 0);.        s
281d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72  qlite3_free(zQar
281e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
281f0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
28200 65 6c 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d  elect, "type!='m
28210 65 74 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20  eta' AND sql IS 
28220 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
28250 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29  snum, rowid", 0)
28260 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
28270 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
28280 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c   sSelect.z, call
28290 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
282a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 66 72  rrMsg);.      fr
282b0 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
282c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
282d0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
282e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
282f0 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
28300 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
28310 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28320 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
28330 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
28340 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49  e if( rc != SQLI
28350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28360 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28370 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e  ,"Error: queryin
28380 67 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61  g schema informa
28390 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tion\n");.      
283a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
283b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  e{.      rc = 0;
283c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
283d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
283e0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
283f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
28400 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
28410 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
28420 6e 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70  n==11 && strncmp
28430 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65  (azArg[0], "sele
28440 63 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20  cttrace", n)==0 
28450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
28460 6c 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74  lectTrace = (int
28470 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
28480 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  Arg[1]);.  }else
28490 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
284a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
284b0 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66  LE_SESSION).  if
284c0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
284d0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65  cmp(azArg[0],"se
284e0 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20  ssion",n)==0 && 
284f0 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e  n>=3 ){.    Open
28500 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
28510 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
28520 5b 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  [0];.    char **
28530 61 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31  azCmd = &azArg[1
28540 5d 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20  ];.    int iSes 
28550 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d  = 0;.    int nCm
28560 64 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20  d = nArg - 1;.  
28570 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
28580 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20   nArg<=1 ) goto 
28590 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
285a0 72 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  rror;.    open_d
285b0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
285c0 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20   nArg>=3 ){.    
285d0 20 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53    for(iSes=0; iS
285e0 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20  es<p->nSession; 
285f0 69 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSes++){.       
28600 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61   if( strcmp(p->a
28610 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e  Session[iSes].zN
28620 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d  ame, azArg[1])==
28630 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
28640 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65   }.      if( iSe
28650 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  s<p->nSession ){
28660 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
28670 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
28680 5b 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20  [iSes];.        
28690 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20  azCmd++;.       
286a0 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d   nCmd--;.      }
286b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53  else{.        pS
286c0 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65  ession = &p->aSe
286d0 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20  ssion[0];.      
286e0 20 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20    iSes = 0;.    
286f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
28700 2a 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63  * .session attac
28710 68 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49  h TABLE.    ** I
28720 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
28730 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28  3session_attach(
28740 29 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61  ) interface to a
28750 74 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c  ttach a particul
28760 61 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ar.    ** table 
28770 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65  so that it is ne
28780 76 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20  ver filtered..  
28790 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
287a0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74  cmp(azCmd[0],"at
287b0 74 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tach")==0 ){.   
287c0 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29     if( nCmd!=2 )
287d0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
287e0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
287f0 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
28800 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
28810 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e  session_not_open
28820 3a 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  :.        raw_pr
28830 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
28840 52 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73  ROR: No sessions
28850 20 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20   are open\n");. 
28860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28880 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70  session_attach(p
28890 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d  Session->p, azCm
288a0 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  d[1]);.        i
288b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
288c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
288d0 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71  derr, "ERROR: sq
288e0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74  lite3session_att
288f0 61 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64  ach() returns %d
28900 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
28910 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
28920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28930 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
28940 2e 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73  .session changes
28950 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e  et FILE.    ** .
28960 73 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74  session patchset
28970 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69   FILE.    ** Wri
28980 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f  te a changeset o
28990 72 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20  r patchset into 
289a0 61 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c  a file.  The fil
289b0 65 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  e is overwritten
289c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
289d0 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
289e0 2c 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30  ,"changeset")==0
289f0 20 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64   || strcmp(azCmd
28a00 5b 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d  [0],"patchset")=
28a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45  =0 ){.      FILE
28a20 20 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   *out = 0;.     
28a30 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67   if( nCmd!=2 ) g
28a40 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
28a50 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
28a60 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d  if( pSession->p=
28a70 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =0 ) goto sessio
28a80 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20  n_not_open;.    
28a90 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a    out = fopen(az
28aa0 43 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20  Cmd[1], "wb");. 
28ab0 20 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20       if( out==0 
28ac0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
28ad0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28ae0 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70  ERROR: cannot op
28af0 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72  en \"%s\" for wr
28b00 69 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b  iting\n", azCmd[
28b10 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1]);.      }else
28b20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
28b30 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f  Chng;.        vo
28b40 69 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20  id *pChng;.     
28b50 20 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b     if( azCmd[0][
28b60 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20  0]=='c' ){.     
28b70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28b80 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
28b90 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  et(pSession->p, 
28ba0 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29  &szChng, &pChng)
28bb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28bc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28bd0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70  sqlite3session_p
28be0 61 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e  atchset(pSession
28bf0 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70  ->p, &szChng, &p
28c00 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Chng);.        }
28c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
28c30 6e 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f  ntf("Error: erro
28c40 72 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63  r code %d\n", rc
28c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28c60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
28c70 20 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67         if( pChng
28c80 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77  .          && fw
28c90 72 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68  rite(pChng, szCh
28ca0 6e 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29  ng, 1, out)!=1 )
28cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
28cc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28cd0 45 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f  ERROR: Failed to
28ce0 20 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64   write entire %d
28cf0 2d 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c  -byte output\n",
28d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28d10 20 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20     szChng);.    
28d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
28d30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67  lite3_free(pChng
28d40 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73  );.        fclos
28d50 65 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  e(out);.      }.
28d60 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
28d70 2a 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65  * .session close
28d80 0a 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68  .    ** Close th
28d90 65 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73  e identified ses
28da0 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sion.    */.    
28db0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
28dc0 5b 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30  [0], "close")==0
28dd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43   ){.      if( nC
28de0 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
28df0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
28e00 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
28e10 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
28e20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
28e30 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20  e(pSession);.   
28e40 20 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e       p->aSession
28e50 5b 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73  [iSes] = p->aSes
28e60 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69  sion[--p->nSessi
28e70 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on];.      }.   
28e80 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
28e90 73 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f  session enable ?
28ea0 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20  BOOLEAN?.    ** 
28eb0 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65  Query or set the
28ec0 20 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20   enable flag.   
28ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
28ee0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e  mp(azCmd[0], "en
28ef0 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
28f00 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
28f10 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f   if( nCmd>2 ) go
28f20 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
28f30 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
28f40 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31  i = nCmd==1 ? -1
28f50 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   : booleanValue(
28f60 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20  azCmd[1]);.     
28f70 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
28f80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d   ){.        ii =
28f90 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
28fa0 65 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d  enable(pSession-
28fb0 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20  >p, ii);.       
28fc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
28fd0 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73  out, "session %s
28fe0 20 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25   enable flag = %
28ff0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
29000 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
29010 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a  on->zName, ii);.
29020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29030 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
29040 6f 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e  on filter GLOB .
29050 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61  ....    ** Set a
29060 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61   list of GLOB pa
29070 74 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20  tterns of table 
29080 6e 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c  names to be excl
29090 75 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uded..    */.   
290a0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
290b0 64 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d  d[0], "filter")=
290c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
290d0 69 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  ii, nByte;.     
290e0 20 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f   if( nCmd<2 ) go
290f0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
29100 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
29110 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
29120 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  {.        for(ii
29130 3d 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d  =0; ii<pSession-
29140 3e 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b  >nFilter; ii++){
29150 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29160 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
29170 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b  ->azFilter[ii]);
29180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29190 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
291a0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
291b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79  er);.        nBy
291c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73  te = sizeof(pSes
291d0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30  sion->azFilter[0
291e0 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20  ])*(nCmd-1);.   
291f0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61       pSession->a
29200 7a 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65  zFilter = sqlite
29210 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  3_malloc( nByte 
29220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
29230 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
29240 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
29250 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29260 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
29270 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   or memory\n");.
29280 20 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31            exit(1
29290 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
292a0 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69       for(ii=1; i
292b0 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20  i<nCmd; ii++){. 
292c0 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
292d0 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31  n->azFilter[ii-1
292e0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
292f0 6e 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b  ntf("%s", azCmd[
29300 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ii]);.        }.
29310 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
29320 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31  ->nFilter = ii-1
29330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
29340 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
29350 73 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42  sion indirect ?B
29360 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
29370 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
29380 69 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20  indirect flag.  
29390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
293a0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69  cmp(azCmd[0], "i
293b0 6e 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a  ndirect")==0 ){.
293c0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
293d0 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29      if( nCmd>2 )
293e0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
293f0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
29400 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f    ii = nCmd==1 ?
29410 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c   -1 : booleanVal
29420 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  ue(azCmd[1]);.  
29430 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
29440 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ion ){.        i
29450 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  i = sqlite3sessi
29460 6f 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73  on_indirect(pSes
29470 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20  sion->p, ii);.  
29480 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29490 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
294a0 6f 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66  on %s indirect f
294b0 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20  lag = %d\n",.   
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
294e0 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , ii);.      }. 
294f0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
29500 20 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74   .session isempt
29510 79 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69  y.    ** Determi
29520 6e 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f  ne if the sessio
29530 6e 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a  n is empty.    *
29540 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
29550 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d  (azCmd[0], "isem
29560 70 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pty")==0 ){.    
29570 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
29580 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f  if( nCmd!=1 ) go
29590 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
295a0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
295b0 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
295c0 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
295d0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73  qlite3session_is
295e0 65 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e  empty(pSession->
295f0 70 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  p);.        utf8
29600 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
29610 22 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d  "session %s isem
29620 70 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22  pty flag = %d\n"
29630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29640 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
29650 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20  zName, ii);.    
29660 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
29670 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c     /* .session l
29680 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20  ist.    ** List 
29690 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  all currently op
296a0 65 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20  en sessions.    
296b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
296c0 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74  p(azCmd[0],"list
296d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ")==0 ){.      f
296e0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65  or(i=0; i<p->nSe
296f0 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ssion; i++){.   
29700 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
29710 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c  (p->out, "%d %s\
29720 6e 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69  n", i, p->aSessi
29730 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  on[i].zName);.  
29740 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
29750 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
29760 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20   open DB NAME.  
29770 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20    ** Open a new 
29780 73 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  session called N
29790 41 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63  AME on the attac
297a0 68 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e  hed database DB.
297b0 0a 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f  .    ** DB is no
297c0 72 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20  rmally "main".. 
297d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
297e0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f  rcmp(azCmd[0],"o
297f0 70 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pen")==0 ){.    
29800 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
29810 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33       if( nCmd!=3
29820 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
29830 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
29840 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d      zName = azCm
29850 64 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  d[2];.      if( 
29860 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f  zName[0]==0 ) go
29870 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
29880 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66  x_error;.      f
29890 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65  or(i=0; i<p->nSe
298a0 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ssion; i++){.   
298b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
298c0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a  p->aSession[i].z
298d0 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29  Name,zName)==0 )
298e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
298f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29900 22 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20  "Session \"%s\" 
29910 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e  already exists\n
29920 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
29930 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
29940 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
29950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29960 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73       if( p->nSes
29970 73 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28  sion>=ArraySize(
29980 70 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a  p->aSession) ){.
29990 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
299a0 74 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69  tf(stderr, "Maxi
299b0 6d 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f  mum of %d sessio
299c0 6e 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65  ns\n", ArraySize
299d0 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a  (p->aSession));.
299e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
299f0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
29a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
29a10 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65  ession = &p->aSe
29a20 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f  ssion[p->nSessio
29a30 6e 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  n];.      rc = s
29a40 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72  qlite3session_cr
29a50 65 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d  eate(p->db, azCm
29a60 64 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d  d[1], &pSession-
29a70 3e 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  >p);.      if( r
29a80 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  c ){.        raw
29a90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29aa0 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73  "Cannot open ses
29ab0 73 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65  sion: error code
29ac0 3d 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20  =%d\n", rc);.   
29ad0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
29ae0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
29af0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
29b00 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73     }.      pSess
29b10 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30  ion->nFilter = 0
29b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73  ;.      sqlite3s
29b30 65 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c  ession_table_fil
29b40 74 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c  ter(pSession->p,
29b50 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c   session_filter,
29b60 20 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20   pSession);.    
29b70 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b    p->nSession++;
29b80 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  .      pSession-
29b90 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
29ba0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
29bb0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
29bc0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f  .    /* If no co
29bd0 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68  mmand name match
29be0 65 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61  es, show a synta
29bf0 78 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73  x error */.    s
29c00 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
29c10 72 6f 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e  ror:.    session
29c20 5f 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73  _help(p);.  }els
29c30 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  e.#endif..#ifdef
29c40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29c50 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20  /* Undocumented 
29c60 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74  commands for int
29c70 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20  ernal testing.  
29c80 53 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67  Subject to chang
29c90 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e  e.  ** without n
29ca0 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20  otice. */.  if( 
29cb0 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20  c=='s' && n>=10 
29cc0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29cd0 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22  [0], "selftest-"
29ce0 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , 9)==0 ){.    i
29cf0 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
29d00 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22  [0]+9, "boolean"
29d10 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20  , n-9)==0 ){.   
29d20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20     int i, v;.   
29d30 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
29d40 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
29d50 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c    v = booleanVal
29d60 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ue(azArg[i]);.  
29d70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29d80 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25  f(p->out, "%s: %
29d90 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67  d 0x%x\n", azArg
29da0 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20  [i], v, v);.    
29db0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
29dc0 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
29dd0 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c  0]+9, "integer",
29de0 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20   n-9)==0 ){.    
29df0 20 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33    int i; sqlite3
29e00 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20  _int64 v;.      
29e10 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b  for(i=1; i<nArg;
29e20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
29e30 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
29e40 20 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67         v = integ
29e50 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d  erValue(azArg[i]
29e60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29e70 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
29e80 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
29e90 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e  s: %lld 0x%llx\n
29ea0 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29  ", azArg[i],v,v)
29eb0 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
29ec0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
29ed0 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  s", zBuf);.     
29ee0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
29ef0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
29f00 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26  =='s' && n>=4 &&
29f10 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
29f20 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d  ],"selftest",n)=
29f30 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49  =0 ){.    int bI
29f40 73 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20  sInit = 0;      
29f50 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
29f60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c  itialize the SEL
29f70 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20  FTEST table */. 
29f80 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
29f90 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  = 0;        /* V
29fa0 65 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f  erbose output */
29fb0 0a 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65  .    int bSelfte
29fc0 73 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a  stExists;     /*
29fd0 20 54 72 75 65 20 69 66 20 53 45 4c 46 54 45 53   True if SELFTES
29fe0 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
29ff0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b   */.    int i, k
2a000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a010 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2a020 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  s */.    int nTe
2a030 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2a040 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2a050 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20  ests runs */.   
2a060 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
2a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a080 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
2a090 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54  en */.    ShellT
2a0a0 65 78 74 20 73 74 72 3b 20 20 20 20 20 20 20 20  ext str;        
2a0b0 20 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72     /* Answer for
2a0c0 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20   a query */.    
2a0d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2a0e0 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72  tmt = 0; /* Quer
2a0f0 79 20 61 67 61 69 6e 73 74 20 74 68 65 20 53 45  y against the SE
2a100 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a  LFTEST table */.
2a110 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30  .    open_db(p,0
2a120 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
2a130 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2a140 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a150 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
2a160 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2a170 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29  ' && z[1]=='-' )
2a180 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
2a190 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22  strcmp(z,"-init"
2a1a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a1b0 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  bIsInit = 1;.   
2a1c0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
2a1d0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22  f( strcmp(z,"-v"
2a1e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a1f0 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20  bVerbose++;.    
2a200 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a    }else.      {.
2a210 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2a220 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
2a230 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
2a240 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c  \" on \"%s\"\n",
2a250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a260 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61       azArg[i], a
2a270 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
2a280 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2a290 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20  err, "Should be 
2a2a0 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d  one of: --init -
2a2b0 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  v\n");.        r
2a2c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2a2d0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2a2e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2a2f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
2a300 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
2a310 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
2a320 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73  ,"main","selftes
2a330 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a  t",0,0,0,0,0,0).
2a340 20 20 20 20 20 20 20 20 20 20 20 21 3d 20 53 51             != SQ
2a350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a360 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
2a370 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2a380 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74  .      bSelftest
2a390 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2a3a0 7d 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e 69  }.    if( bIsIni
2a3b0 74 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74  t ){.      creat
2a3c0 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70  eSelftestTable(p
2a3d0 29 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65  );.      bSelfte
2a3e0 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  stExists = 1;.  
2a3f0 20 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74    }.    initText
2a400 28 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65  (&str);.    appe
2a410 6e 64 54 65 78 74 28 26 73 74 72 2c 20 22 78 22  ndText(&str, "x"
2a420 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  , 0);.    for(k=
2a430 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b  bSelftestExists;
2a440 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20   k>=0; k--){.   
2a450 20 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20     if( k==1 ){. 
2a460 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a470 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2a480 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2a490 20 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70    "SELECT tno,op
2a4a0 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65  ,cmd,ans FROM se
2a4b0 6c 66 74 65 73 74 20 4f 52 44 45 52 20 42 59 20  lftest ORDER BY 
2a4c0 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  tno",.          
2a4d0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
2a4e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a4f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a500 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2a510 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2a520 22 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27  "VALUES(0,'memo'
2a530 2c 27 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45  ,'Missing SELFTE
2a540 53 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75  ST table - defau
2a550 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c  lt checks only',
2a560 27 27 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ''),".          
2a570 22 20 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c  "      (1,'run',
2a580 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
2a590 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c  y_check','ok')",
2a5a0 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26  .          -1, &
2a5b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
2a5c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2a5d0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2a5e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2a5f0 72 72 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68  rror querying th
2a600 65 20 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65  e selftest table
2a610 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
2a620 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2a630 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2a640 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67  Stmt);.        g
2a650 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2a660 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2a670 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71       for(i=1; sq
2a680 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2a690 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69  )==SQLITE_ROW; i
2a6a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2a6b0 20 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63   tno = sqlite3_c
2a6c0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2a6d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   0);.        con
2a6e0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
2a6f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2a700 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2a710 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
2a720 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a730 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
2a740 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
2a750 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29  n_text(pStmt, 2)
2a760 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
2a770 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f  char *zAns = (co
2a780 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2a790 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2a7a0 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20  tmt, 3);..      
2a7b0 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
2a7c0 20 69 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20   if( bVerbose>0 
2a7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
2a7e0 72 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69  r *zQuote = sqli
2a7f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22  te3_mprintf("%q"
2a800 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
2a810 20 20 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25     printf("%d: %
2a820 73 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f  s %s\n", tno, zO
2a830 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  p, zSql);.      
2a840 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a850 28 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20  (zQuote);.      
2a860 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2a870 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f  strcmp(zOp,"memo
2a880 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2a890 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2a8a0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
2a8b0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Sql);.        }e
2a8c0 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
2a8d0 73 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22  strcmp(zOp,"run"
2a8e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a8f0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2a900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
2a910 74 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  tr.n = 0;.      
2a920 20 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30      str.z[0] = 0
2a930 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2a940 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2a950 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75  >db, zSql, captu
2a960 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b  reOutputCallback
2a970 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67  , &str, &zErrMsg
2a980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65  );.          nTe
2a990 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  st++;.          
2a9a0 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
2a9c0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2a9d0 22 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20  "Result: %s\n", 
2a9e0 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  str.z);.        
2a9f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2aa00 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20  ( rc || zErrMsg 
2aa10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
2aa20 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
2aa30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2aa40 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2aa50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
2aa60 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25  error-code-%d: %
2aa70 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a  s\n", tno, rc, z
2aa80 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
2aa90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2aaa0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
2aab0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2aac0 73 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e  strcmp(zAns,str.
2aad0 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)!=0 ){.       
2aae0 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
2aaf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
2ab00 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
2ab10 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2ab20 20 22 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20   "%d: Expected: 
2ab30 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41  [%s]\n", tno, zA
2ab40 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ns);.           
2ab50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2ab60 6f 75 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47  out, "%d:      G
2ab70 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f  ot: [%s]\n", tno
2ab80 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20  , str.z);.      
2ab90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2aba0 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
2abb0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2abc0 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
2abd0 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
2abe0 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c   operation \"%s\
2abf0 22 20 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69  " on selftest li
2ac00 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74  ne %d\n", zOp, t
2ac10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
2ac20 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2ac30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ac40 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64  }.      } /* End
2ac50 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20   loop over rows 
2ac60 6f 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  of content from 
2ac70 53 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20  SELFTEST */.    
2ac80 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2ac90 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
2aca0 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
2acb0 72 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54  r k */.    freeT
2acc0 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75  ext(&str);.    u
2acd0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2ace0 74 2c 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75  t, "%d errors ou
2acf0 74 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22  t of %d tests\n"
2ad00 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a  , nErr, nTest);.
2ad10 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2ad20 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
2ad30 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61  (azArg[0], "sepa
2ad40 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b  rator", n)==0 ){
2ad50 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
2ad60 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20  || nArg>3 ){.   
2ad70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2ad80 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
2ad90 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f  eparator COL ?RO
2ada0 57 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  W?\n");.      rc
2adb0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2adc0 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
2add0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2ade0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2adf0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2ae00 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a  ->colSeparator,.
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
2ae30 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
2ae40 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31  >colSeparator)-1
2ae50 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2ae60 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
2ae70 3d 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =3 ){.      sqli
2ae80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2ae90 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2aea0 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2aeb0 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  rator,.         
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
2aed0 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79  .*s", (int)Array
2aee0 53 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72  Size(p->rowSepar
2aef0 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32  ator)-1, azArg[2
2af00 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
2af10 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
2af20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
2af30 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61  mp(azArg[0],"sha
2af40 33 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  3sum",n)==0 ){. 
2af50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2af60 4c 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57  Like = 0;   /* W
2af70 68 69 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68  hich table to ch
2af80 65 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20  ecksum. 0 means 
2af90 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20  everything */.  
2afa0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2afb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2afc0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2afd0 20 20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20    int bSchema = 
2afe0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  0;         /* Al
2aff0 73 6f 20 68 61 73 68 20 74 68 65 20 73 63 68 65  so hash the sche
2b000 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53  ma */.    int bS
2b010 65 70 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20  eparate = 0;    
2b020 20 20 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20     /* Hash each 
2b030 74 61 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79  table separately
2b040 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a   */.    int iSiz
2b050 65 20 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20  e = 224;        
2b060 20 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74   /* Hash algorit
2b070 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  hm to use */.   
2b080 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b   int bDebug = 0;
2b090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
2b0a0 79 20 73 68 6f 77 20 74 68 65 20 71 75 65 72 79  y show the query
2b0b0 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65   that would have
2b0c0 20 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69   run */.    sqli
2b0d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
2b0e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72       /* For quer
2b0f0 79 69 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65  ying tables name
2b100 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
2b110 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2b120 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72    /* SQL to be r
2b130 75 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  un */.    char *
2b140 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  zSep;           
2b150 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20     /* Separator 
2b160 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  */.    ShellText
2b170 20 73 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20   sSql;          
2b180 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20  /* Complete SQL 
2b190 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
2b1a0 20 72 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f   run the hash */
2b1b0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
2b1c0 51 75 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Query;        /*
2b1d0 20 53 65 74 20 6f 66 20 71 75 65 72 69 65 73 20   Set of queries 
2b1e0 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c  used to read all
2b1f0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
2b200 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2b210 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
2b220 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2b230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2b240 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2b250 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
2b260 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  .        z++;.  
2b270 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
2b280 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
2b290 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2b2a0 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a  "schema")==0 ){.
2b2b0 20 20 20 20 20 20 20 20 20 20 62 53 63 68 65 6d            bSchem
2b2c0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  a = 1;.        }
2b2d0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
2b2e0 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d   strcmp(z,"sha3-
2b2f0 32 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  224")==0 || strc
2b300 6d 70 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29  mp(z,"sha3-256")
2b310 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
2b320 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33  strcmp(z,"sha3-3
2b330 38 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  84")==0 || strcm
2b340 70 28 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d  p(z,"sha3-512")=
2b350 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2b360 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
2b370 61 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20  atoi(&z[5]);.   
2b380 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2b390 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2b3a0 22 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20  "debug")==0 ){. 
2b3b0 20 20 20 20 20 20 20 20 20 62 44 65 62 75 67 20           bDebug 
2b3c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
2b3d0 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
2b3e0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b3f0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
2b400 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
2b410 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  " on \"%s\"\n",.
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20        azArg[i], 
2b440 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
2b450 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2b460 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20  stderr, "Should 
2b470 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68  be one of: --sch
2b480 65 6d 61 22 0a 20 20 20 20 20 20 20 20 20 20 20  ema".           
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 20 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d    " --sha3-224 -
2b4b0 2d 73 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33  -sha3-255 --sha3
2b4c0 2d 33 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c  -384 --sha3-512\
2b4d0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
2b4e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2b4f0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2b500 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
2b510 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2b520 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
2b530 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2b540 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2b550 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53  sha3sum ?OPTIONS
2b560 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  ? ?LIKE-PATTERN?
2b570 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
2b580 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
2b590 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2b5a0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  exit;.      }els
2b5b0 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65  e{.        zLike
2b5c0 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53   = z;.        bS
2b5d0 65 70 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20  eparate = 1;.   
2b5e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2b5f0 5f 73 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65  _strlike("sqlite
2b600 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d  _%", zLike, 0)==
2b610 30 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b  0 ) bSchema = 1;
2b620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b630 20 20 20 69 66 28 20 62 53 63 68 65 6d 61 20 29     if( bSchema )
2b640 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22  {.      zSql = "
2b650 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d  SELECT lower(nam
2b660 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  e) FROM sqlite_m
2b670 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
2b680 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65      " WHERE type
2b690 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61  ='table' AND coa
2b6a0 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
2b6b0 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  )>1".           
2b6c0 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
2b6d0 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73  LECT 'sqlite_mas
2b6e0 74 65 72 27 22 0a 20 20 20 20 20 20 20 20 20 20  ter'".          
2b6f0 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
2b700 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
2b710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b720 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
2b730 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
2b740 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
2b750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
2b760 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
2b770 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
2b780 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
2b790 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e              " AN
2b7a0 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
2b7b0 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20  'sqlite_%'".    
2b7c0 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
2b7d0 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f   BY 1 collate no
2b7e0 63 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  case";.    }.   
2b7f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2b800 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2b810 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2b820 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
2b830 51 75 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74  Query);.    init
2b840 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20  Text(&sSql);.   
2b850 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
2b860 6c 2c 20 22 57 49 54 48 20 5b 73 68 61 33 73 75  l, "WITH [sha3su
2b870 6d 24 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53  m$query](a,b) AS
2b880 28 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20  (",0);.    zSep 
2b890 3d 20 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20  = "VALUES(";.   
2b8a0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
2b8b0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2b8c0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
2b8d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2b8e0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
2b8f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2b900 74 65 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20  text(pStmt,0);. 
2b910 20 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26       if( zLike &
2b920 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
2b930 65 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30  e(zLike, zTab, 0
2b940 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b950 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
2b960 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
2b970 5f 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",7)!=0 ){.    
2b980 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2b990 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a  sQuery,"SELECT *
2b9a0 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20   FROM ", 0);.   
2b9b0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2b9c0 26 73 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27  &sQuery,zTab,'"'
2b9d0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2b9e0 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 20  dText(&sQuery," 
2b9f0 4e 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30  NOT INDEXED;", 0
2ba00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2ba10 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20  f( strcmp(zTab, 
2ba20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  "sqlite_master")
2ba30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2ba40 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
2ba50 79 2c 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  y,"SELECT type,n
2ba60 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
2ba70 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2ba80 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
2bab0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
2bac0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
2bad0 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  ab, "sqlite_sequ
2bae0 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
2baf0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2bb00 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20  &sQuery,"SELECT 
2bb10 6e 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71  name,seq FROM sq
2bb20 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20  lite_sequence". 
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb40 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
2bb50 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
2bb60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2bb70 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
2bb80 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30  qlite_stat1")==0
2bb90 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
2bba0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
2bbb0 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73  SELECT tbl,idx,s
2bbc0 74 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  tat FROM sqlite_
2bbd0 73 74 61 74 31 22 0a 20 20 20 20 20 20 20 20 20  stat1".         
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbf0 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c    " ORDER BY tbl
2bc00 2c 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20  ,idx;", 0);.    
2bc10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2bc20 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
2bc30 5f 73 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20  _stat3")==0.    
2bc40 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
2bc50 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
2bc60 5f 73 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20  _stat4")==0 ){. 
2bc70 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2bc80 74 28 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45  t(&sQuery, "SELE
2bc90 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b  CT * FROM ", 0);
2bca0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2bcb0 65 78 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61  ext(&sQuery, zTa
2bcc0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
2bcd0 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
2bce0 79 2c 20 22 20 4f 52 44 45 52 20 42 59 20 74 62  y, " ORDER BY tb
2bcf0 6c 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e  l, idx, rowid;\n
2bd00 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
2bd10 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2bd20 26 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b  &sSql, zSep, 0);
2bd30 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
2bd40 74 28 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e  t(&sSql, sQuery.
2bd50 7a 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20  z, '\'');.      
2bd60 73 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20  sQuery.n = 0;.  
2bd70 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2bd80 73 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  sSql, ",", 0);. 
2bd90 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2bda0 26 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27  &sSql, zTab, '\'
2bdb0 27 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ');.      zSep =
2bdc0 20 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20   "),(";.    }.  
2bdd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2bde0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
2bdf0 66 28 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a  f( bSeparate ){.
2be00 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
2be10 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2be20 20 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20          "%s))". 
2be30 20 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43           " SELEC
2be40 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33  T lower(hex(sha3
2be50 5f 71 75 65 72 79 28 61 2c 25 64 29 29 29 20 41  _query(a,%d))) A
2be60 53 20 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62  S hash, b AS lab
2be70 65 6c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  el".          " 
2be80 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24    FROM [sha3sum$
2be90 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20  query]",.       
2bea0 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65     sSql.z, iSize
2beb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bec0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2bed0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2bee0 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20        "%s))".   
2bef0 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20         " SELECT 
2bf00 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71  lower(hex(sha3_q
2bf10 75 65 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61  uery(group_conca
2bf20 74 28 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53  t(a,''),%d))) AS
2bf30 20 68 61 73 68 22 0a 20 20 20 20 20 20 20 20 20   hash".         
2bf40 20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73   "   FROM [sha3s
2bf50 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20  um$query]",.    
2bf60 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53        sSql.z, iS
2bf70 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
2bf80 66 72 65 65 54 65 78 74 28 26 73 51 75 65 72 79  freeText(&sQuery
2bf90 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  );.    freeText(
2bfa0 26 73 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  &sSql);.    if( 
2bfb0 62 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20  bDebug ){.      
2bfc0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2bfd0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c  ut, "%s\n", zSql
2bfe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bff0 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
2c000 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c  ->db, zSql, shel
2c010 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30  l_callback, p, 0
2c020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2c030 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2c040 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2c050 63 3d 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74  c=='s'.   && (st
2c060 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c070 22 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c  "shell", n)==0 |
2c080 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  | strncmp(azArg[
2c090 30 5d 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d  0],"system",n)==
2c0a0 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0).  ){.    char
2c0b0 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20   *zCmd;.    int 
2c0c0 69 2c 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41  i, x;.    if( nA
2c0d0 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61  rg<2 ){.      ra
2c0e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c0f0 20 22 55 73 61 67 65 3a 20 2e 73 79 73 74 65 6d   "Usage: .system
2c100 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20   COMMAND\n");.  
2c110 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2c120 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2c130 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2c140 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
2c150 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68  e3_mprintf(strch
2c160 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29 3d  r(azArg[1],' ')=
2c170 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22 22  =0?"%s":"\"%s\""
2c180 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2c190 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67   for(i=2; i<nArg
2c1a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43  ; i++){.      zC
2c1b0 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
2c1c0 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41 72  intf(strchr(azAr
2c1d0 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 7a  g[i],' ')==0?"%z
2c1e0 20 25 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22 22   %s":"%z \"%s\""
2c1f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2c210 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  Cmd, azArg[i]);.
2c220 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 79      }.    x = sy
2c230 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20  stem(zCmd);.    
2c240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
2c250 64 29 3b 0a 20 20 20 20 69 66 28 20 78 20 29 20  d);.    if( x ) 
2c260 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c270 72 2c 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61  r, "System comma
2c280 6e 64 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22  nd returns %d\n"
2c290 2c 20 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  , x);.  }else.. 
2c2a0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
2c2b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2c2c0 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29   "show", n)==0 )
2c2d0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
2c2e0 73 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b  st char *azBool[
2c2f0 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e  ] = { "off", "on
2c300 22 2c 20 22 66 75 6c 6c 22 2c 20 22 75 6e 6b 22  ", "full", "unk"
2c310 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
2c320 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29     if( nArg!=1 )
2c330 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c340 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c350 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20  e: .show\n");.  
2c360 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2c370 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2c380 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2c390 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c3a0 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
2c3b0 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 0a  : %s\n","echo",.
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48 61    azBool[ShellHa
2c3f0 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45  sFlag(p, SHFLG_E
2c400 63 68 6f 29 5d 29 3b 0a 20 20 20 20 75 74 66 38  cho)]);.    utf8
2c410 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2c420 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c  "%12.12s: %s\n",
2c430 22 65 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d  "eqp", azBool[p-
2c440 3e 61 75 74 6f 45 51 50 26 33 5d 29 3b 0a 20 20  >autoEQP&3]);.  
2c450 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2c460 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
2c470 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c  %s\n","explain",
2c480 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64  .         p->mod
2c490 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
2c4a0 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e 61 75 74 6f  ? "on" : p->auto
2c4b0 45 78 70 6c 61 69 6e 20 3f 20 22 61 75 74 6f 22  Explain ? "auto"
2c4c0 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 75   : "off");.    u
2c4d0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2c4e0 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  t,"%12.12s: %s\n
2c4f0 22 2c 22 68 65 61 64 65 72 73 22 2c 20 61 7a 42  ","headers", azB
2c500 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48 65 61 64 65  ool[p->showHeade
2c510 72 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66 38  r!=0]);.    utf8
2c520 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2c530 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c  "%12.12s: %s\n",
2c540 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73 63  "mode", modeDesc
2c550 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20  r[p->mode]);.   
2c560 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2c570 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 22  out, "%12.12s: "
2c580 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
2c590 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
2c5a0 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
2c5b0 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
2c5c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2c5d0 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
2c5e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2c5f0 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73  out,"%12.12s: %s
2c600 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20 20  \n","output",.  
2c610 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
2c620 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f  30(p->outfile) ?
2c630 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73   p->outfile : "s
2c640 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 75 74 66  tdout");.    utf
2c650 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2c660 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 63 6f  "%12.12s: ", "co
2c670 6c 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20  lseparator");.  
2c680 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
2c690 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 63  ing(p->out, p->c
2c6a0 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
2c6b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2c6c0 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
2c6d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2c6e0 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22  >out,"%12.12s: "
2c6f0 2c 20 22 72 6f 77 73 65 70 61 72 61 74 6f 72 22  , "rowseparator"
2c700 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  );.      output_
2c710 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
2c720 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2c730 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2c740 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
2c750 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
2c760 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
2c770 31 32 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74  12s: %s\n","stat
2c780 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 74  s", azBool[p->st
2c790 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20 20  atsOn!=0]);.    
2c7a0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2c7b0 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c  ut, "%12.12s: ",
2c7c0 20 22 77 69 64 74 68 22 29 3b 0a 20 20 20 20 66   "width");.    f
2c7d0 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41  or (i=0;i<(int)A
2c7e0 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
2c7f0 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57  idth) && p->colW
2c800 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b  idth[i] != 0;i++
2c810 29 20 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ) {.      raw_pr
2c820 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
2c830 20 22 2c 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b   ", p->colWidth[
2c840 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  i]);.    }.    r
2c850 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2c860 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66  , "\n");.    utf
2c870 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2c880 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
2c890 2c 20 22 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20  , "filename",.  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2c8b0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3f 20 70  >zDbFilename ? p
2c8c0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3a 20  ->zDbFilename : 
2c8d0 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  "");.  }else..  
2c8e0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
2c8f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c900 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29  "stats", n)==0 )
2c910 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2c920 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74  2 ){.      p->st
2c930 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56  atsOn = booleanV
2c940 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2c950 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2c960 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 64  rg==1 ){.      d
2c970 69 73 70 6c 61 79 5f 73 74 61 74 73 28 70 2d 3e  isplay_stats(p->
2c980 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  db, p, 0);.    }
2c990 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2c9a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2c9b0 55 73 61 67 65 3a 20 2e 73 74 61 74 73 20 3f 6f  Usage: .stats ?o
2c9c0 6e 7c 6f 66 66 3f 5c 6e 22 29 3b 0a 20 20 20 20  n|off?\n");.    
2c9d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2c9e0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 28    }else..  if( (
2c9f0 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26 26  c=='t' && n>1 &&
2ca00 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2ca10 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d  ], "tables", n)=
2ca20 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 69  =0).   || (c=='i
2ca30 27 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a  ' && (strncmp(az
2ca40 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73  Arg[0], "indices
2ca50 22 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  ", n)==0.       
2ca60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
2ca70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2ca80 69 6e 64 65 78 65 73 22 2c 20 6e 29 3d 3d 30 29  indexes", n)==0)
2ca90 20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69   ).  ){.    sqli
2caa0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
2cab0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  .    char **azRe
2cac0 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52  sult;.    int nR
2cad0 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ow, nAlloc;.    
2cae0 69 6e 74 20 69 69 3b 0a 20 20 20 20 53 68 65 6c  int ii;.    Shel
2caf0 6c 54 65 78 74 20 73 3b 0a 20 20 20 20 69 6e 69  lText s;.    ini
2cb00 74 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20 6f  tText(&s);.    o
2cb10 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2cb20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2cb30 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2cb40 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73   "PRAGMA databas
2cb50 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70 53  e_list", -1, &pS
2cb60 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
2cb70 20 72 63 20 29 20 72 65 74 75 72 6e 20 73 68 65   rc ) return she
2cb80 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28  llDatabaseError(
2cb90 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 69 66 28  p->db);..    if(
2cba0 20 6e 41 72 67 3e 32 20 26 26 20 63 3d 3d 27 69   nArg>2 && c=='i
2cbb0 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ' ){.      /* It
2cbc0 20 69 73 20 61 6e 20 68 69 73 74 6f 72 69 63 61   is an historica
2cbd0 6c 20 61 63 63 69 64 65 6e 74 20 74 68 61 74 20  l accident that 
2cbe0 74 68 65 20 2e 69 6e 64 65 78 65 73 20 63 6f 6d  the .indexes com
2cbf0 6d 61 6e 64 20 73 68 6f 77 73 20 61 6e 20 65 72  mand shows an er
2cc00 72 6f 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  ror.      ** whe
2cc10 6e 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  n called with th
2cc20 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  e wrong number o
2cc30 66 20 61 72 67 75 6d 65 6e 74 73 20 77 68 65 72  f arguments wher
2cc40 65 61 73 20 74 68 65 20 2e 74 61 62 6c 65 73 0a  eas the .tables.
2cc50 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64        ** command
2cc60 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20   does not. */.  
2cc70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cc80 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2cc90 69 6e 64 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41  indexes ?LIKE-PA
2cca0 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20  TTERN?\n");.    
2ccb0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ccc0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2ccd0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2cce0 20 20 66 6f 72 28 69 69 3d 30 3b 20 73 71 6c 69    for(ii=0; sqli
2ccf0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2cd00 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 69 2b  =SQLITE_ROW; ii+
2cd10 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
2cd20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
2cd30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2cd40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2cd50 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2cd60 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30    if( zDbName==0
2cd70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cd80 20 20 20 69 66 28 20 73 2e 7a 20 26 26 20 73 2e     if( s.z && s.
2cd90 7a 5b 30 5d 20 29 20 61 70 70 65 6e 64 54 65 78  z[0] ) appendTex
2cda0 74 28 26 73 2c 20 22 20 55 4e 49 4f 4e 20 41 4c  t(&s, " UNION AL
2cdb0 4c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  L ", 0);.      i
2cdc0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2cdd0 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 22 6d 61 69  mp(zDbName, "mai
2cde0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
2cdf0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
2ce00 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
2ce10 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  OM ", 0);.      
2ce20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
2ce30 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 53  ppendText(&s, "S
2ce40 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
2ce50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2ce60 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 5c 27  &s, zDbName, '\'
2ce70 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
2ce80 6e 64 54 65 78 74 28 26 73 2c 20 22 7c 7c 27 2e  ndText(&s, "||'.
2ce90 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20  '||name FROM ", 
2cea0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2ceb0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
2cec0 20 7a 44 62 4e 61 6d 65 2c 20 27 22 27 29 3b 0a   zDbName, '"');.
2ced0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2cee0 28 26 73 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61  (&s, ".sqlite_ma
2cef0 73 74 65 72 20 22 2c 20 30 29 3b 0a 20 20 20 20  ster ", 0);.    
2cf00 20 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a    if( c=='t' ){.
2cf10 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2cf20 78 74 28 26 73 2c 22 20 57 48 45 52 45 20 74 79  xt(&s," WHERE ty
2cf30 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
2cf40 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20  view')".        
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2cf60 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c    AND name NOT L
2cf70 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a  IKE 'sqlite_%'".
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf90 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61        "   AND na
2cfa0 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b  me LIKE ?1", 0);
2cfb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cfc0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2cfd0 28 26 73 2c 22 20 57 48 45 52 45 20 74 79 70 65  (&s," WHERE type
2cfe0 3d 27 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20  ='index'".      
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 22 20 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  "   AND tbl_name
2d010 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20   LIKE ?1", 0);. 
2d020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
2d040 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2d050 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2d060 2c 20 22 20 4f 52 44 45 52 20 42 59 20 31 22 2c  , " ORDER BY 1",
2d070 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2d080 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2d090 28 70 2d 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31 2c  (p->db, s.z, -1,
2d0a0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2d0b0 20 66 72 65 65 54 65 78 74 28 26 73 29 3b 0a 20   freeText(&s);. 
2d0c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2d0d0 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  rn shellDatabase
2d0e0 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20  Error(p->db);.. 
2d0f0 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51     /* Run the SQ
2d100 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 72 65 70  L statement prep
2d110 61 72 65 64 20 62 79 20 74 68 65 20 61 62 6f 76  ared by the abov
2d120 65 20 62 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74  e block. Store t
2d130 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a  he results.    *
2d140 2a 20 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * as an array of
2d150 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2d160 73 74 72 69 6e 67 73 20 69 6e 20 61 7a 52 65 73  strings in azRes
2d170 75 6c 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e  ult[].  */.    n
2d180 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30  Row = nAlloc = 0
2d190 3b 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d  ;.    azResult =
2d1a0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
2d1b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >1 ){.      sqli
2d1c0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
2d1d0 74 6d 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d  tmt, 1, azArg[1]
2d1e0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
2d1f0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
2d200 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2d210 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
2d220 74 2c 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53  t, 1, "%", -1, S
2d230 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
2d240 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
2d250 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2d260 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
2d270 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f  ){.      if( nRo
2d280 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  w>=nAlloc ){.   
2d290 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65       char **azNe
2d2a0 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  w;.        int n
2d2b0 32 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31  2 = nAlloc*2 + 1
2d2c0 30 3b 0a 20 20 20 20 20 20 20 20 61 7a 4e 65 77  0;.        azNew
2d2d0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
2d2e0 6f 63 36 34 28 61 7a 52 65 73 75 6c 74 2c 20 73  oc64(azResult, s
2d2f0 69 7a 65 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30  izeof(azResult[0
2d300 5d 29 2a 6e 32 29 3b 0a 20 20 20 20 20 20 20 20  ])*n2);.        
2d310 69 66 28 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a  if( azNew==0 ){.
2d320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d330 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29  hellNomemError()
2d340 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d350 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2d360 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32       nAlloc = n2
2d370 3b 0a 20 20 20 20 20 20 20 20 61 7a 52 65 73 75  ;.        azResu
2d380 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20  lt = azNew;.    
2d390 20 20 7d 0a 20 20 20 20 20 20 61 7a 52 65 73 75    }.      azResu
2d3a0 6c 74 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74  lt[nRow] = sqlit
2d3b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
2d3c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2d3d0 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
2d3e0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 61 7a  .      if( 0==az
2d3f0 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a  Result[nRow] ){.
2d400 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
2d410 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a  llNomemError();.
2d420 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f       }.      nRo
2d440 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w++;.    }.    i
2d450 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  f( sqlite3_final
2d460 69 7a 65 28 70 53 74 6d 74 29 21 3d 53 51 4c 49  ize(pStmt)!=SQLI
2d470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2d480 63 20 3d 20 73 68 65 6c 6c 44 61 74 61 62 61 73  c = shellDatabas
2d490 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20  eError(p->db);. 
2d4a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65     }..    /* Pre
2d4b0 74 74 79 2d 70 72 69 6e 74 20 74 68 65 20 63 6f  tty-print the co
2d4c0 6e 74 65 6e 74 73 20 6f 66 20 61 72 72 61 79 20  ntents of array 
2d4d0 61 7a 52 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68  azResult[] to th
2d4e0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
2d4f0 69 66 28 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f  if( rc==0 && nRo
2d500 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  w>0 ){.      int
2d510 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30   len, maxlen = 0
2d520 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2d530 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 69  ;.      int nPri
2d540 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77  ntCol, nPrintRow
2d550 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2d560 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20   i<nRow; i++){. 
2d570 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72         len = str
2d580 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69  len30(azResult[i
2d590 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
2d5a0 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78  len>maxlen ) max
2d5b0 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  len = len;.     
2d5c0 20 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43   }.      nPrintC
2d5d0 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b  ol = 80/(maxlen+
2d5e0 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50  2);.      if( nP
2d5f0 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69  rintCol<1 ) nPri
2d600 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20  ntCol = 1;.     
2d610 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52   nPrintRow = (nR
2d620 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d  ow + nPrintCol -
2d630 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20   1)/nPrintCol;. 
2d640 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2d650 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b  nPrintRow; i++){
2d660 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69  .        for(j=i
2d670 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72  ; j<nRow; j+=nPr
2d680 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20  intRow){.       
2d690 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a     char *zSp = j
2d6a0 3c 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20  <nPrintRow ? "" 
2d6b0 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20  : "  ";.        
2d6c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2d6d0 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20  >out, "%s%-*s", 
2d6e0 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20  zSp, maxlen,.   
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 20 20 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f     azResult[j] ?
2d710 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29   azResult[j]:"")
2d720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d730 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2d740 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
2d750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2d760 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52   for(ii=0; ii<nR
2d770 6f 77 3b 20 69 69 2b 2b 29 20 73 71 6c 69 74 65  ow; ii++) sqlite
2d780 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74 5b  3_free(azResult[
2d790 69 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ii]);.    sqlite
2d7a0 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74 29  3_free(azResult)
2d7b0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
2d7c0 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e  Begin redirectin
2d7d0 67 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  g output to the 
2d7e0 66 69 6c 65 20 22 74 65 73 74 63 61 73 65 2d 6f  file "testcase-o
2d7f0 75 74 2e 74 78 74 22 20 2a 2f 0a 20 20 69 66 28  ut.txt" */.  if(
2d800 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72 63 6d   c=='t' && strcm
2d810 70 28 61 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74  p(azArg[0],"test
2d820 63 61 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  case")==0 ){.   
2d830 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
2d840 3b 0a 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f  ;.    p->out = o
2d850 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
2d860 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  "testcase-out.tx
2d870 74 22 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t");.    if( p->
2d880 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
2d890 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2d8a0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2d8b0 74 20 6f 70 65 6e 20 27 74 65 73 74 63 61 73 65  t open 'testcase
2d8c0 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20  -out.txt'\n");. 
2d8d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
2d8e0 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  g>=2 ){.      sq
2d8f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2d900 69 7a 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61  izeof(p->zTestca
2d910 73 65 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73  se), p->zTestcas
2d920 65 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 31  e, "%s", azArg[1
2d930 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2d940 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d950 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2d960 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a  zTestcase), p->z
2d970 54 65 73 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a  Testcase, "?");.
2d980 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
2d990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  ifndef SQLITE_UN
2d9a0 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63  TESTABLE.  if( c
2d9b0 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38 20 26 26  =='t' && n>=8 &&
2d9c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2d9d0 5d 2c 20 22 74 65 73 74 63 74 72 6c 22 2c 20 6e  ], "testctrl", n
2d9e0 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20  )==0 && nArg>=2 
2d9f0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
2da00 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
2da10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2da20 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20 2f 2a 20  zCtrlName;   /* 
2da30 4e 61 6d 65 20 6f 66 20 61 20 74 65 73 74 2d 63  Name of a test-c
2da40 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e 20 2a 2f  ontrol option */
2da50 0a 20 20 20 20 20 20 20 69 6e 74 20 63 74 72 6c  .       int ctrl
2da60 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
2da70 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65   /* Integer code
2da80 20 66 6f 72 20 74 68 61 74 20 6f 70 74 69 6f 6e   for that option
2da90 20 2a 2f 0a 20 20 20 20 7d 20 61 43 74 72 6c 5b   */.    } aCtrl[
2daa0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 70  ] = {.      { "p
2dab0 72 6e 67 5f 73 61 76 65 22 2c 20 20 20 20 20 20  rng_save",      
2dac0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
2dad0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2daf0 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72  .      { "prng_r
2db00 65 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20  estore",        
2db10 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2db20 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 20 20  L_PRNG_RESTORE  
2db30 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2db40 20 20 7b 20 22 70 72 6e 67 5f 72 65 73 65 74 22    { "prng_reset"
2db50 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
2db60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
2db70 47 5f 52 45 53 45 54 20 20 20 20 20 20 20 20 20  G_RESET         
2db80 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2db90 62 69 74 76 65 63 5f 74 65 73 74 22 2c 20 20 20  bitvec_test",   
2dba0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
2dbb0 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
2dbc0 45 53 54 20 20 20 20 20 20 20 20 20 20 20 20 7d  EST            }
2dbd0 2c 0a 20 20 20 20 20 20 7b 20 22 66 61 75 6c 74  ,.      { "fault
2dbe0 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20  _install",      
2dbf0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2dc00 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  RL_FAULT_INSTALL
2dc10 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2dc20 20 20 20 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c     { "benign_mal
2dc30 6c 6f 63 5f 68 6f 6f 6b 73 22 2c 20 20 20 53 51  loc_hooks",   SQ
2dc40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
2dc50 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
2dc60 53 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  S    },.      { 
2dc70 22 70 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 20  "pending_byte", 
2dc80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2dc90 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
2dca0 5f 42 59 54 45 20 20 20 20 20 20 20 20 20 20 20  _BYTE           
2dcb0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 73 73 65  },.      { "asse
2dcc0 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
2dcd0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
2dce0 54 52 4c 5f 41 53 53 45 52 54 20 20 20 20 20 20  TRL_ASSERT      
2dcf0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2dd00 20 20 20 20 7b 20 22 61 6c 77 61 79 73 22 2c 20      { "always", 
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2dd20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
2dd30 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
2dd40 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2dd50 20 22 72 65 73 65 72 76 65 22 2c 20 20 20 20 20   "reserve",     
2dd60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2dd70 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
2dd80 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
2dd90 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6f 70 74   },.      { "opt
2dda0 69 6d 69 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20  imizations",    
2ddb0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
2ddc0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
2ddd0 4e 53 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  NS          },. 
2dde0 20 20 20 20 20 7b 20 22 69 73 6b 65 79 77 6f 72       { "iskeywor
2ddf0 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
2de00 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2de10 49 53 4b 45 59 57 4f 52 44 20 20 20 20 20 20 20  ISKEYWORD       
2de20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2de30 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c 20 20  { "byteorder",  
2de40 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2de50 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
2de60 52 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  RDER            
2de70 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6e 65    },.      { "ne
2de80 76 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20  ver_corrupt",   
2de90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
2dea0 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
2deb0 55 50 54 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  UPT          },.
2dec0 20 20 20 20 20 20 7b 20 22 69 6d 70 6f 73 74 65        { "imposte
2ded0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2dee0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2def0 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20  _IMPOSTER       
2df00 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
2df10 3b 0a 20 20 20 20 69 6e 74 20 74 65 73 74 63 74  ;.    int testct
2df20 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  rl = -1;.    int
2df30 20 72 63 32 20 3d 20 30 3b 0a 20 20 20 20 69 6e   rc2 = 0;.    in
2df40 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65  t i, n2;.    ope
2df50 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20 20 20  n_db(p, 0);..   
2df60 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65 73 74   /* convert test
2df70 63 74 72 6c 20 74 65 78 74 20 6f 70 74 69 6f 6e  ctrl text option
2df80 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c 6f 77   to value. allow
2df90 20 61 6e 79 20 75 6e 69 71 75 65 20 70 72 65 66   any unique pref
2dfa0 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ix.    ** of the
2dfb0 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72   option name, or
2dfc0 20 61 20 6e 75 6d 65 72 69 63 61 6c 20 76 61 6c   a numerical val
2dfd0 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 32 20 3d 20  ue. */.    n2 = 
2dfe0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
2dff0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
2e000 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 43 74   i<ArraySize(aCt
2e010 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rl); i++){.     
2e020 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
2e030 72 67 5b 31 5d 2c 20 61 43 74 72 6c 5b 69 5d 2e  rg[1], aCtrl[i].
2e040 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e 32 29 3d 3d  zCtrlName, n2)==
2e050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
2e060 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b 0a 20   testctrl<0 ){. 
2e070 20 20 20 20 20 20 20 20 20 74 65 73 74 63 74 72           testctr
2e080 6c 20 3d 20 61 43 74 72 6c 5b 69 5d 2e 63 74 72  l = aCtrl[i].ctr
2e090 6c 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  lCode;.        }
2e0a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e0b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2e0c0 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6f  rr, "ambiguous o
2e0d0 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c 22 25 73  ption name: \"%s
2e0e0 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2e0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2e100 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ctrl = -1;.     
2e110 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e130 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74    }.    if( test
2e140 63 74 72 6c 3c 30 20 29 20 74 65 73 74 63 74 72  ctrl<0 ) testctr
2e150 6c 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  l = (int)integer
2e160 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
2e170 0a 20 20 20 20 69 66 28 20 28 74 65 73 74 63 74  .    if( (testct
2e180 72 6c 3c 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl<SQLITE_TESTCT
2e190 52 4c 5f 46 49 52 53 54 29 20 7c 7c 20 28 74 65  RL_FIRST) || (te
2e1a0 73 74 63 74 72 6c 3e 53 51 4c 49 54 45 5f 54 45  stctrl>SQLITE_TE
2e1b0 53 54 43 54 52 4c 5f 4c 41 53 54 29 20 29 7b 0a  STCTRL_LAST) ){.
2e1c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2e1d0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2e1e0 20 69 6e 76 61 6c 69 64 20 74 65 73 74 63 74 72   invalid testctr
2e1f0 6c 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  l option: %s\n",
2e200 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2e210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69  }else{.      swi
2e220 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a  tch(testctrl){..
2e230 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2e240 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2e250 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f  int, db, int) */
2e260 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
2e270 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2e280 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20  TIMIZATIONS:.   
2e290 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2e2a0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
2e2b0 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  E:.          if(
2e2c0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
2e2d0 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20          int opt 
2e2e0 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a  = (int)strtol(az
2e2f0 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20  Arg[2], 0, 0);. 
2e300 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
2e310 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2e320 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
2e330 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20 20 20  p->db, opt);.   
2e340 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
2e350 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20  ntf(p->out, "%d 
2e360 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 32  (0x%08x)\n", rc2
2e370 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20 20  , rc2);.        
2e380 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2e390 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2e3a0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2e3b0 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61  : testctrl %s ta
2e3c0 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  kes a single int
2e3d0 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20   option\n",.    
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2e400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e410 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
2e420 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
2e430 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a 2f  _control(int) */
2e440 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
2e450 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
2e460 4e 47 5f 53 41 56 45 3a 0a 20 20 20 20 20 20 20  NG_SAVE:.       
2e470 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
2e480 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
2e490 52 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  RE:.        case
2e4a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2e4b0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20 20  _PRNG_RESET:.   
2e4c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2e4d0 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
2e4e0 44 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69  DER:.          i
2e4f0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2e500 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
2e510 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2e520 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a  trol(testctrl);.
2e530 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
2e540 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2e550 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20  %d (0x%08x)\n", 
2e560 72 63 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20  rc2, rc2);.     
2e570 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
2e580 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2e590 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
2e5a0 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
2e5b0 20 74 61 6b 65 73 20 6e 6f 20 6f 70 74 69 6f 6e   takes no option
2e5c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
2e5e0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2e5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2e600 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
2e610 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2e620 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74  ontrol(int, uint
2e630 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  ) */.        cas
2e640 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
2e650 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 0a  L_PENDING_BYTE:.
2e660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
2e670 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
2e680 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
2e690 74 20 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e 65  t opt = (unsigne
2e6a0 64 20 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c  d int)integerVal
2e6b0 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ue(azArg[2]);.  
2e6c0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
2e6d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2e6e0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
2e6f0 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
2e700 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2e710 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29  ut, "%d (0x%08x)
2e720 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29 3b 0a  \n", rc2, rc2);.
2e730 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2e740 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75   {.            u
2e750 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e760 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74  r,"Error: testct
2e770 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69  rl %s takes a si
2e780 6e 67 6c 65 20 75 6e 73 69 67 6e 65 64 22 0a 20  ngle unsigned". 
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 20 20 20 20 20 20 20 22 20 69 6e 74 20            " int 
2e7b0 6f 70 74 69 6f 6e 5c 6e 22 2c 20 61 7a 41 72 67  option\n", azArg
2e7c0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
2e7d0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2e7e0 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
2e7f0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2e800 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f  rol(int, int) */
2e810 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
2e820 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
2e830 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 63 61  SERT:.        ca
2e840 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
2e850 52 4c 5f 41 4c 57 41 59 53 3a 0a 20 20 20 20 20  RL_ALWAYS:.     
2e860 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
2e870 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
2e880 52 52 55 50 54 3a 0a 20 20 20 20 20 20 20 20 20  RRUPT:.         
2e890 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2e8b0 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  opt = booleanVal
2e8c0 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ue(azArg[2]);.  
2e8d0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
2e8e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2e8f0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
2e900 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
2e910 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2e920 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29  ut, "%d (0x%08x)
2e930 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29 3b 0a  \n", rc2, rc2);.
2e940 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2e950 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75   {.            u
2e960 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e970 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74  r,"Error: testct
2e980 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69  rl %s takes a si
2e990 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f 6e 5c  ngle int option\
2e9a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2e9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e9e0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
2e9f0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
2ea00 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 63 68  _control(int, ch
2ea10 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20  ar *) */.#ifdef 
2ea20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
2ea30 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
2ea40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
2ea50 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 20  KEYWORD:.       
2ea60 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29     if( nArg==3 )
2ea70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2ea80 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 20 3d 20  nst char *opt = 
2ea90 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20  azArg[2];.      
2eaa0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
2eab0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2eac0 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b  (testctrl, opt);
2ead0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
2eae0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2eaf0 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c  "%d (0x%08x)\n",
2eb00 20 72 63 32 2c 20 72 63 32 29 3b 0a 20 20 20 20   rc2, rc2);.    
2eb10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2eb20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
2eb30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 74         "Error: t
2eb60 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73  estctrl %s takes
2eb70 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 20 2a   a single char *
2eb80 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20   option\n",.    
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20      azArg[1]);. 
2ebb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ebc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64       break;.#end
2ebd0 69 66 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65  if..        case
2ebe0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2ebf0 5f 49 4d 50 4f 53 54 45 52 3a 0a 20 20 20 20 20  _IMPOSTER:.     
2ec00 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 35       if( nArg==5
2ec10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ec20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
2ec30 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
2ec40 74 72 6c 2c 20 70 2d 3e 64 62 2c 0a 20 20 20 20  trl, p->db,.    
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec60 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 0a        azArg[2],.
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec80 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 65            intege
2ec90 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 33 5d 29  rValue(azArg[3])
2eca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
2ecc0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 34  gerValue(azArg[4
2ecd0 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ]));.           
2ece0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2ecf0 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29  ut, "%d (0x%08x)
2ed00 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29 3b 0a  \n", rc2, rc2);.
2ed10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
2ed30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2ed40 55 73 61 67 65 3a 20 2e 74 65 73 74 63 74 72 6c  Usage: .testctrl
2ed50 20 69 6d 70 6f 73 74 65 72 20 64 62 4e 61 6d 65   imposter dbName
2ed60 20 6f 6e 6f 66 66 20 74 6e 75 6d 5c 6e 22 29 3b   onoff tnum\n");
2ed70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ed80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2ed90 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
2eda0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
2edb0 45 43 5f 54 45 53 54 3a 0a 20 20 20 20 20 20 20  EC_TEST:.       
2edc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
2edd0 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
2ede0 41 4c 4c 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ALL:.        cas
2edf0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
2ee00 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
2ee10 48 4f 4f 4b 53 3a 0a 20 20 20 20 20 20 20 20 64  HOOKS:.        d
2ee20 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
2ee30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2ee40 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2ee50 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
2ee60 6f 72 3a 20 43 4c 49 20 73 75 70 70 6f 72 74 20  or: CLI support 
2ee70 66 6f 72 20 74 65 73 74 63 74 72 6c 20 25 73 20  for testctrl %s 
2ee80 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 5c  not implemented\
2ee90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2eea0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2eeb0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  1]);.          b
2eec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2eed0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
2eee0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2eef0 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
2ef00 29 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ) */..  if( c=='
2ef10 74 27 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72  t' && n>4 && str
2ef20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2ef30 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20  timeout", n)==0 
2ef40 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
2ef50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2ef60 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  3_busy_timeout(p
2ef70 2d 3e 64 62 2c 20 6e 41 72 67 3e 3d 32 20 3f 20  ->db, nArg>=2 ? 
2ef80 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
2ef90 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  e(azArg[1]) : 0)
2efa0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2efb0 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20   c=='t' && n>=5 
2efc0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2efd0 5b 30 5d 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29  [0], "timer", n)
2efe0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2eff0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2f000 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f  enableTimer = bo
2f010 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2f020 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
2f030 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 21  enableTimer && !
2f040 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20  HAS_TIMER ){.   
2f050 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f060 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2f070 74 69 6d 65 72 20 6e 6f 74 20 61 76 61 69 6c 61  timer not availa
2f080 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 79 73 74  ble on this syst
2f090 65 6d 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  em.\n");.       
2f0a0 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30   enableTimer = 0
2f0b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2f0c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2f0d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f0e0 73 61 67 65 3a 20 2e 74 69 6d 65 72 20 6f 6e 7c  sage: .timer on|
2f0f0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2f100 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2f110 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2f120 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
2f130 41 72 67 5b 30 5d 2c 20 22 74 72 61 63 65 22 2c  Arg[0], "trace",
2f140 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
2f150 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2f160 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
2f170 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f180 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f190 20 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66   .trace FILE|off
2f1a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2f1b0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2f1c0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70  ;.    }.    outp
2f1e0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
2f1f0 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20  >traceOut);.    
2f200 70 2d 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f 75  p->traceOut = ou
2f210 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61  tput_file_open(a
2f220 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64  zArg[1]);.#if !d
2f230 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2f240 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
2f250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2f260 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2f270 29 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  ).    if( p->tra
2f280 63 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ceOut==0 ){.    
2f290 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f    sqlite3_trace_
2f2a0 76 32 28 70 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  v2(p->db, 0, 0, 
2f2b0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
2f2c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
2f2d0 63 65 5f 76 32 28 70 2d 3e 64 62 2c 20 53 51 4c  ce_v2(p->db, SQL
2f2e0 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 2c 20  ITE_TRACE_STMT, 
2f2f0 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61  sql_trace_callba
2f300 63 6b 2c 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b  ck,p->traceOut);
2f310 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f320 7d 65 6c 73 65 0a 0a 23 69 66 20 53 51 4c 49 54  }else..#if SQLIT
2f330 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2f340 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27  ATION.  if( c=='
2f350 75 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  u' && strncmp(az
2f360 41 72 67 5b 30 5d 2c 20 22 75 73 65 72 22 2c 20  Arg[0], "user", 
2f370 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2f380 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
2f390 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f3a0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65  rr, "Usage: .use
2f3b0 72 20 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e  r SUBCOMMAND ...
2f3c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2f3d0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2f3e0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f3f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2f400 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
2f410 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
2f420 31 5d 2c 22 6c 6f 67 69 6e 22 29 3d 3d 30 20 29  1],"login")==0 )
2f430 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2f440 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=4 ){.        r
2f450 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2f460 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
2f470 6c 6f 67 69 6e 20 55 53 45 52 20 50 41 53 53 57  login USER PASSW
2f480 4f 52 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ORD\n");.       
2f490 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2f4a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f4b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2f4c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f4d0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
2f4e0 69 63 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41  icate(p->db, azA
2f4f0 72 67 5b 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c  rg[2], azArg[3],
2f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 20 20 20 28 69 6e 74 29 73 74 72 6c 65 6e       (int)strlen
2f530 28 61 7a 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20  (azArg[3]));.   
2f540 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f550 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f560 28 73 74 64 65 72 72 2c 20 22 41 75 74 68 65 6e  (stderr, "Authen
2f570 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  tication failed 
2f580 66 6f 72 20 75 73 65 72 20 25 73 5c 6e 22 2c 20  for user %s\n", 
2f590 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
2f5a0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f5b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2f5c0 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2f5d0 2c 22 61 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"add")==0 ){.  
2f5e0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20      if( nArg!=5 
2f5f0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2f600 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f610 73 61 67 65 3a 20 2e 75 73 65 72 20 61 64 64 20  sage: .user add 
2f620 55 53 45 52 20 50 41 53 53 57 4f 52 44 20 49 53  USER PASSWORD IS
2f630 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  ADMIN\n");.     
2f640 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f650 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2f660 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2f670 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2f680 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 70  lite3_user_add(p
2f690 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a  ->db, azArg[2],.
2f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
2f6c0 67 5b 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65  g[3], (int)strle
2f6d0 6e 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20  n(azArg[3]),.   
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6f0 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e           boolean
2f700 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29  Value(azArg[4]))
2f710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f720 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2f730 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2f740 65 72 2d 41 64 64 20 66 61 69 6c 65 64 3a 20 25  er-Add failed: %
2f750 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2f760 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f770 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2f780 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2f790 2c 22 65 64 69 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"edit")==0 ){. 
2f7a0 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35       if( nArg!=5
2f7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
2f7c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f7d0 55 73 61 67 65 3a 20 2e 75 73 65 72 20 65 64 69  Usage: .user edi
2f7e0 74 20 55 53 45 52 20 50 41 53 53 57 4f 52 44 20  t USER PASSWORD 
2f7f0 49 53 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20  ISADMIN\n");.   
2f800 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f810 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f820 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f830 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2f840 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
2f850 6e 67 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67  nge(p->db, azArg
2f860 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [2],.           
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e     azArg[3], (in
2f890 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33  t)strlen(azArg[3
2f8a0 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61    booleanValue(a
2f8d0 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20  zArg[4]));.     
2f8e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
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 65 72 2d 45 64 69 74  derr, "User-Edit
2f910 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20   failed: %d\n", 
2f920 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rc);.        rc 
2f930 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2f940 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2f950 70 28 61 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65  p(azArg[1],"dele
2f960 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
2f970 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
2f980 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2f990 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2f9a0 65 3a 20 2e 75 73 65 72 20 64 65 6c 65 74 65 20  e: .user delete 
2f9b0 55 53 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20  USER\n");.      
2f9c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2f9d0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2f9e0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2f9f0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2fa00 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
2fa10 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d  (p->db, azArg[2]
2fa20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2fa30 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2fa40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2fa50 73 65 72 2d 44 65 6c 65 74 65 20 66 61 69 6c 65  ser-Delete faile
2fa60 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  d: %d\n", rc);. 
2fa70 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2fa80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2fa90 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2faa0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2fab0 65 3a 20 2e 75 73 65 72 20 6c 6f 67 69 6e 7c 61  e: .user login|a
2fac0 64 64 7c 65 64 69 74 7c 64 65 6c 65 74 65 20 2e  dd|edit|delete .
2fad0 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ..\n");.      rc
2fae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2faf0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2fb00 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
2fb10 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
2fb20 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2fb30 43 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28  CATION */..  if(
2fb40 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
2fb50 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65  mp(azArg[0], "ve
2fb60 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  rsion", n)==0 ){
2fb70 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2fb80 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65  (p->out, "SQLite
2fb90 20 25 73 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72   %s %s\n" /*extr
2fba0 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f  a-version-info*/
2fbb0 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
2fbc0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
2fbd0 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
2fbe0 28 29 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ());.  }else..  
2fbf0 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74  if( c=='v' && st
2fc00 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2fc10 22 76 66 73 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30  "vfsinfo", n)==0
2fc20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2fc30 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41  ar *zDbName = nA
2fc40 72 67 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg==2 ? azArg[1]
2fc50 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73   : "main";.    s
2fc60 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2fc70 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
2fc80 3e 64 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >db ){.      sql
2fc90 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2fca0 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65  l(p->db, zDbName
2fcb0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  , SQLITE_FCNTL_V
2fcc0 46 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70 56 66  FS_POINTER, &pVf
2fcd0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56  s);.      if( pV
2fce0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  fs ){.        ut
2fcf0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2fd00 2c 20 22 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20  , "vfs.zName    
2fd10 20 20 3d 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70    = \"%s\"\n", p
2fd20 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
2fd30 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2fd40 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 69 56 65  p->out, "vfs.iVe
2fd50 72 73 69 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c  rsion   = %d\n",
2fd60 20 70 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29   pVfs->iVersion)
2fd70 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
2fd80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
2fd90 73 2e 73 7a 4f 73 46 69 6c 65 20 20 20 3d 20 25  s.szOsFile   = %
2fda0 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 73 7a 4f 73  d\n", pVfs->szOs
2fdb0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
2fdc0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2fdd0 2c 20 22 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  , "vfs.mxPathnam
2fde0 65 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d  e = %d\n", pVfs-
2fdf0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  >mxPathname);.  
2fe00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2fe10 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76  lse..  if( c=='v
2fe20 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2fe30 72 67 5b 30 5d 2c 20 22 76 66 73 6c 69 73 74 22  rg[0], "vfslist"
2fe40 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
2fe50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2fe60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
2fe70 73 20 2a 70 43 75 72 72 65 6e 74 20 3d 20 30 3b  s *pCurrent = 0;
2fe80 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29  .    if( p->db )
2fe90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2fea0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
2feb0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
2fec0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49  TE_FCNTL_VFS_POI
2fed0 4e 54 45 52 2c 20 26 70 43 75 72 72 65 6e 74 29  NTER, &pCurrent)
2fee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2fef0 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73  pVfs=sqlite3_vfs
2ff00 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20  _find(0); pVfs; 
2ff10 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74  pVfs=pVfs->pNext
2ff20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2ff30 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
2ff40 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c  s.zName      = \
2ff50 22 25 73 5c 22 25 73 5c 6e 22 2c 20 70 56 66 73  "%s\"%s\n", pVfs
2ff60 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
2ff70 20 20 20 20 70 56 66 73 3d 3d 70 43 75 72 72 65      pVfs==pCurre
2ff80 6e 74 20 3f 20 22 20 20 3c 2d 2d 2d 20 43 55 52  nt ? "  <--- CUR
2ff90 52 45 4e 54 22 20 3a 20 22 22 29 3b 0a 20 20 20  RENT" : "");.   
2ffa0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2ffb0 3e 6f 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73  >out, "vfs.iVers
2ffc0 69 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70  ion   = %d\n", p
2ffd0 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a  Vfs->iVersion);.
2ffe0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2fff0 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a  (p->out, "vfs.sz
30000 4f 73 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22  OsFile   = %d\n"
30010 2c 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  , pVfs->szOsFile
30020 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
30030 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73  ntf(p->out, "vfs
30040 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 25 64  .mxPathname = %d
30050 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  \n", pVfs->mxPat
30060 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  hname);.      if
30070 28 20 70 56 66 73 2d 3e 70 4e 65 78 74 20 29 7b  ( pVfs->pNext ){
30080 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
30090 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  ntf(p->out, "---
300a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
300b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
300c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
300d0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
300e0 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72  f( c=='v' && str
300f0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
30100 76 66 73 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20  vfsname", n)==0 
30110 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
30120 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72  r *zDbName = nAr
30130 67 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g==2 ? azArg[1] 
30140 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68  : "main";.    ch
30150 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30  ar *zVfsName = 0
30160 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20  ;.    if( p->db 
30170 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30180 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
30190 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  >db, zDbName, SQ
301a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
301b0 4d 45 2c 20 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  ME, &zVfsName);.
301c0 20 20 20 20 20 20 69 66 28 20 7a 56 66 73 4e 61        if( zVfsNa
301d0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  me ){.        ut
301e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
301f0 2c 20 22 25 73 5c 6e 22 2c 20 7a 56 66 73 4e 61  , "%s\n", zVfsNa
30200 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
30210 69 74 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61  ite3_free(zVfsNa
30220 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
30230 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20   }.  }else..#if 
30240 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
30250 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
30260 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
30270 48 45 52 45 54 52 41 43 45 29 0a 20 20 69 66 28  HERETRACE).  if(
30280 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63   c=='w' && strnc
30290 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 68  mp(azArg[0], "wh
302a0 65 72 65 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30  eretrace", n)==0
302b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
302c0 68 65 72 65 54 72 61 63 65 20 3d 20 6e 41 72 67  hereTrace = nArg
302d0 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c  >=2 ? booleanVal
302e0 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30  ue(azArg[1]) : 0
302f0 78 66 66 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  xff;.  }else.#en
30300 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 77  dif..  if( c=='w
30310 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30320 72 67 5b 30 5d 2c 20 22 77 69 64 74 68 22 2c 20  rg[0], "width", 
30330 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
30340 20 6a 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   j;.    assert( 
30350 6e 41 72 67 3c 3d 41 72 72 61 79 53 69 7a 65 28  nArg<=ArraySize(
30360 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 66 6f  azArg) );.    fo
30370 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26  r(j=1; j<nArg &&
30380 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   j<ArraySize(p->
30390 63 6f 6c 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b  colWidth); j++){
303a0 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
303b0 74 68 5b 6a 2d 31 5d 20 3d 20 28 69 6e 74 29 69  th[j-1] = (int)i
303c0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
303d0 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[j]);.    }.  }
303e0 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 75 74  else..  {.    ut
303f0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
30400 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  , "Error: unknow
30410 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e 76  n command or inv
30420 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a 20  alid arguments: 
30430 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22  ".      " \"%s\"
30440 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c  . Enter \".help\
30450 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61  " for help\n", a
30460 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 72 63  zArg[0]);.    rc
30470 20 3d 20 31 3b 0a 20 20 7d 0a 0a 6d 65 74 61 5f   = 1;.  }..meta_
30480 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3a 0a 20 20  command_exit:.  
30490 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20  if( p->outCount 
304a0 29 7b 0a 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  ){.    p->outCou
304b0 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  nt--;.    if( p-
304c0 3e 6f 75 74 43 6f 75 6e 74 3d 3d 30 20 29 20 6f  >outCount==0 ) o
304d0 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
304e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
304f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
30500 20 54 52 55 45 20 69 66 20 61 20 73 65 6d 69 63   TRUE if a semic
30510 6f 6c 6f 6e 20 6f 63 63 75 72 73 20 61 6e 79 77  olon occurs anyw
30520 68 65 72 65 20 69 6e 20 74 68 65 20 66 69 72 73  here in the firs
30530 74 20 4e 20 63 68 61 72 61 63 74 65 72 73 0a 2a  t N characters.*
30540 2a 20 6f 66 20 73 74 72 69 6e 67 20 7a 5b 5d 2e  * of string z[].
30550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
30560 69 6e 65 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d  ine_contains_sem
30570 69 63 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  icolon(const cha
30580 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  r *z, int N){.  
30590 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
305a0 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20 69 66  ; i<N; i++){  if
305b0 28 20 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20 72 65  ( z[i]==';' ) re
305c0 74 75 72 6e 20 31 3b 20 7d 0a 20 20 72 65 74 75  turn 1; }.  retu
305d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
305e0 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 61 20  est to see if a 
305f0 6c 69 6e 65 20 63 6f 6e 73 69 73 74 73 20 65 6e  line consists en
30600 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65 73  tirely of whites
30610 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
30620 69 6e 74 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70  int _all_whitesp
30630 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ace(const char *
30640 7a 29 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a 3b 20  z){.  for(; *z; 
30650 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 49 73  z++){.    if( Is
30660 53 70 61 63 65 28 7a 5b 30 5d 29 20 29 20 63 6f  Space(z[0]) ) co
30670 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30680 2a 7a 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d  *z=='/' && z[1]=
30690 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20  ='*' ){.      z 
306a0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
306b0 65 28 20 2a 7a 20 26 26 20 28 2a 7a 21 3d 27 2a  e( *z && (*z!='*
306c0 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2f 27 29 20  ' || z[1]!='/') 
306d0 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ z++; }.      
306e0 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75  if( *z==0 ) retu
306f0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  rn 0;.      z++;
30700 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
30710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a  .    }.    if( *
30720 7a 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  z=='-' && z[1]==
30730 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b  '-' ){.      z +
30740 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 2;.      while
30750 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27  ( *z && *z!='\n'
30760 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
30770 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74   if( *z==0 ) ret
30780 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  urn 1;.      con
30790 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
307a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
307b0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
307c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
307d0 69 66 20 74 68 65 20 6c 69 6e 65 20 74 79 70 65  if the line type
307e0 64 20 69 6e 20 69 73 20 61 6e 20 53 51 4c 20 63  d in is an SQL c
307f0 6f 6d 6d 61 6e 64 20 74 65 72 6d 69 6e 61 74 6f  ommand terminato
30800 72 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20  r other.** than 
30810 61 20 73 65 6d 69 2d 63 6f 6c 6f 6e 2e 20 20 54  a semi-colon.  T
30820 68 65 20 53 51 4c 20 53 65 72 76 65 72 20 73 74  he SQL Server st
30830 79 6c 65 20 22 67 6f 22 20 63 6f 6d 6d 61 6e 64  yle "go" command
30840 20 69 73 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a   is understood.*
30850 2a 20 61 73 20 69 73 20 74 68 65 20 4f 72 61 63  * as is the Orac
30860 6c 65 20 22 2f 22 2e 0a 2a 2f 0a 73 74 61 74 69  le "/"..*/.stati
30870 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f  c int line_is_co
30880 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72  mmand_terminator
30890 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
308a0 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 49 73  ne){.  while( Is
308b0 53 70 61 63 65 28 7a 4c 69 6e 65 5b 30 5d 29 20  Space(zLine[0]) 
308c0 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20  ){ zLine++; };. 
308d0 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
308e0 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  /' && _all_white
308f0 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d 29  space(&zLine[1])
30900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
30910 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a  ;  /* Oracle */.
30920 20 20 7d 0a 20 20 69 66 28 20 54 6f 4c 6f 77 65    }.  if( ToLowe
30930 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27  r(zLine[0])=='g'
30940 20 26 26 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e   && ToLower(zLin
30950 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20  e[1])=='o'.     
30960 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74      && _all_whit
30970 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d  espace(&zLine[2]
30980 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
30990 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65  1;  /* SQL Serve
309a0 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  r */.  }.  retur
309b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
309c0 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53 71  turn true if zSq
309d0 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  l is a complete 
309e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
309f0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
30a00 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74 68  it.** ends in th
30a10 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73 74  e middle of a st
30a20 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72 20  ring literal or 
30a30 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 2e  C-style comment.
30a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
30a50 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28  ine_is_complete(
30a60 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e 74 20  char *zSql, int 
30a70 6e 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nSql){.  int rc;
30a80 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
30a90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 53 71   return 1;.  zSq
30aa0 6c 5b 6e 53 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20  l[nSql] = ';';. 
30ab0 20 7a 53 71 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20   zSql[nSql+1] = 
30ac0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
30ad0 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29  3_complete(zSql)
30ae0 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d  ;.  zSql[nSql] =
30af0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
30b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  .}../*.** Run a 
30b10 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 53  single line of S
30b20 51 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  QL.*/.static int
30b30 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 53   runOneSqlLine(S
30b40 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 68  hellState *p, ch
30b50 61 72 20 2a 7a 53 71 6c 2c 20 46 49 4c 45 20 2a  ar *zSql, FILE *
30b60 69 6e 2c 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  in, int startlin
30b70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
30b80 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
30b90 30 3b 0a 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0;..  open_db(p,
30ba0 20 30 29 3b 0a 20 20 69 66 28 20 53 68 65 6c 6c   0);.  if( Shell
30bb0 48 61 73 46 6c 61 67 28 70 2c 53 48 46 4c 47 5f  HasFlag(p,SHFLG_
30bc0 42 61 63 6b 73 6c 61 73 68 29 20 29 20 72 65 73  Backslash) ) res
30bd0 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
30be0 28 7a 53 71 6c 29 3b 0a 20 20 42 45 47 49 4e 5f  (zSql);.  BEGIN_
30bf0 54 49 4d 45 52 3b 0a 20 20 72 63 20 3d 20 73 68  TIMER;.  rc = sh
30c00 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
30c10 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
30c20 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73  back, p, &zErrMs
30c30 67 29 3b 0a 20 20 45 4e 44 5f 54 49 4d 45 52 3b  g);.  END_TIMER;
30c40 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72  .  if( rc || zEr
30c50 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
30c60 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 0a 20   zPrefix[100];. 
30c70 20 20 20 69 66 28 20 69 6e 21 3d 30 20 7c 7c 20     if( in!=0 || 
30c80 21 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61  !stdin_is_intera
30c90 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
30ca0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30cb0 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
30cc0 20 7a 50 72 65 66 69 78 2c 0a 20 20 20 20 20 20   zPrefix,.      
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69   "Error: near li
30cf0 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69  ne %d:", startli
30d00 6e 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ne);.    }else{.
30d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30d20 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50  printf(sizeof(zP
30d30 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c  refix), zPrefix,
30d40 20 22 45 72 72 6f 72 3a 22 29 3b 0a 20 20 20 20   "Error:");.    
30d50 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
30d60 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  g!=0 ){.      ut
30d70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
30d80 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72  , "%s %s\n", zPr
30d90 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  efix, zErrMsg);.
30da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30db0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
30dc0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
30dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30de0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
30df0 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20  err, "%s %s\n", 
30e00 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74 65 33  zPrefix, sqlite3
30e10 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
30e20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
30e30 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 1;.  }else if(
30e40 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
30e50 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e   SHFLG_CountChan
30e60 67 65 73 29 20 29 7b 0a 20 20 20 20 72 61 77 5f  ges) ){.    raw_
30e70 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
30e80 63 68 61 6e 67 65 73 3a 20 25 33 64 20 20 20 74  changes: %3d   t
30e90 6f 74 61 6c 5f 63 68 61 6e 67 65 73 3a 20 25 64  otal_changes: %d
30ea0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30eb0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
30ec0 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
30ed0 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
30ee0 2d 3e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 72 65  ->db));.  }.  re
30ef0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
30f00 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
30f10 6d 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73  m *in and proces
30f20 73 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30  s it.  If *in==0
30f30 20 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69   then input.** i
30f40 73 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20  s interactive - 
30f50 74 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69  the user is typi
30f60 6e 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72  ng it it.  Other
30f70 77 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69  wise, input.** i
30f80 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
30f90 66 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20  file or device. 
30fa0 20 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73   A prompt is iss
30fb0 75 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a  ued and history.
30fc0 2a 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79  ** is saved only
30fd0 20 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74   if input is int
30fe0 65 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e  eractive.  An in
30ff0 74 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77  terrupt signal w
31000 69 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69  ill.** cause thi
31010 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69  s routine to exi
31020 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75  t immediately, u
31030 6e 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69  nless input is i
31040 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  nteractive..**.*
31050 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
31060 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
31070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31080 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c  cess_input(Shell
31090 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a  State *p, FILE *
310a0 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  in){.  char *zLi
310b0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ne = 0;         
310c0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 70   /* A single inp
310d0 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61  ut line */.  cha
310e0 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 20 20 20 20  r *zSql = 0;    
310f0 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
31100 6c 61 74 65 64 20 53 51 4c 20 74 65 78 74 20 2a  lated SQL text *
31110 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31130 20 4c 65 6e 67 74 68 20 6f 66 20 63 75 72 72 65   Length of curre
31140 6e 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  nt line */.  int
31150 20 6e 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20   nSql = 0;      
31160 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
31170 6f 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 2a  of zSql[] used *
31180 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
31190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
311a0 20 41 6c 6c 6f 63 61 74 65 64 20 7a 53 71 6c 5b   Allocated zSql[
311b0 5d 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74  ] space */.  int
311c0 20 6e 53 71 6c 50 72 69 6f 72 20 3d 20 30 3b 20   nSqlPrior = 0; 
311d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
311e0 6f 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 62  of zSql[] used b
311f0 79 20 70 72 69 6f 72 20 6c 69 6e 65 20 2a 2f 0a  y prior line */.
31200 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
31220 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
31230 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b 20 20  nt errCnt = 0;  
31240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31250 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
31260 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  n */.  int linen
31270 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
31280 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65   /* Current line
31290 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
312a0 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 20   startline = 0; 
312b0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
312c0 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
312d0 6f 66 20 63 75 72 72 65 6e 74 20 69 6e 70 75 74  of current input
312e0 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 65 72   */..  while( er
312f0 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c  rCnt==0 || !bail
31300 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e  _on_error || (in
31310 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f 69 73 5f  ==0 && stdin_is_
31320 69 6e 74 65 72 61 63 74 69 76 65 29 20 29 7b 0a  interactive) ){.
31330 20 20 20 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75      fflush(p->ou
31340 74 29 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20  t);.    zLine = 
31350 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 69  one_input_line(i
31360 6e 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c 3e 30  n, zLine, nSql>0
31370 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  );.    if( zLine
31380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
31390 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a  End of input */.
313a0 20 20 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20        if( in==0 
313b0 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  && stdin_is_inte
313c0 72 61 63 74 69 76 65 20 29 20 70 72 69 6e 74 66  ractive ) printf
313d0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ("\n");.      br
313e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
313f0 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
31400 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e   ){.      if( in
31410 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
31420 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
31430 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
31440 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
31450 28 20 6e 53 71 6c 3d 3d 30 20 26 26 20 5f 61 6c  ( nSql==0 && _al
31460 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69  l_whitespace(zLi
31470 6e 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ne) ){.      if(
31480 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
31490 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 20 70   SHFLG_Echo) ) p
314a0 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c  rintf("%s\n", zL
314b0 69 6e 65 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ine);.      cont
314c0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
314d0 69 66 28 20 7a 4c 69 6e 65 20 26 26 20 7a 4c 69  if( zLine && zLi
314e0 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 6e 53  ne[0]=='.' && nS
314f0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ql==0 ){.      i
31500 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  f( ShellHasFlag(
31510 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29  p, SHFLG_Echo) )
31520 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
31530 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 63  zLine);.      rc
31540 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61   = do_meta_comma
31550 6e 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a 20 20  nd(zLine, p);.  
31560 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29 7b      if( rc==2 ){
31570 20 2f 2a 20 65 78 69 74 20 72 65 71 75 65 73 74   /* exit request
31580 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  ed */.        br
31590 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
315a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
315b0 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20     errCnt++;.   
315c0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
315d0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
315e0 66 28 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 6d 61  f( line_is_comma
315f0 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c  nd_terminator(zL
31600 69 6e 65 29 20 26 26 20 6c 69 6e 65 5f 69 73 5f  ine) && line_is_
31610 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 2c 20 6e  complete(zSql, n
31620 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  Sql) ){.      me
31630 6d 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22 2c 32  mcpy(zLine,";",2
31640 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4c 69  );.    }.    nLi
31650 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  ne = strlen30(zL
31660 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ine);.    if( nS
31670 71 6c 2b 6e 4c 69 6e 65 2b 32 3e 3d 6e 41 6c 6c  ql+nLine+2>=nAll
31680 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  oc ){.      nAll
31690 6f 63 20 3d 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b  oc = nSql+nLine+
316a0 31 30 30 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  100;.      zSql 
316b0 3d 20 72 65 61 6c 6c 6f 63 28 7a 53 71 6c 2c 20  = realloc(zSql, 
316c0 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  nAlloc);.      i
316d0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
316e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
316f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
31700 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
31710 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
31720 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
31730 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69 6f 72   }.    nSqlPrior
31740 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28   = nSql;.    if(
31750 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   nSql==0 ){.    
31760 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
31770 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d  or(i=0; zLine[i]
31780 20 26 26 20 49 73 53 70 61 63 65 28 7a 4c 69 6e   && IsSpace(zLin
31790 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  e[i]); i++){}.  
317a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 6c 6c      assert( nAll
317b0 6f 63 3e 30 20 26 26 20 7a 53 71 6c 21 3d 30 20  oc>0 && zSql!=0 
317c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
317d0 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2b 69 2c 20 6e  zSql, zLine+i, n
317e0 4c 69 6e 65 2b 31 2d 69 29 3b 0a 20 20 20 20 20  Line+1-i);.     
317f0 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 6c 69 6e   startline = lin
31800 65 6e 6f 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20  eno;.      nSql 
31810 3d 20 6e 4c 69 6e 65 2d 69 3b 0a 20 20 20 20 7d  = nLine-i;.    }
31820 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
31830 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c 6e 27 3b  [nSql++] = '\n';
31840 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53  .      memcpy(zS
31850 71 6c 2b 6e 53 71 6c 2c 20 7a 4c 69 6e 65 2c 20  ql+nSql, zLine, 
31860 6e 4c 69 6e 65 2b 31 29 3b 0a 20 20 20 20 20 20  nLine+1);.      
31870 6e 53 71 6c 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20  nSql += nLine;. 
31880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 71     }.    if( nSq
31890 6c 20 26 26 20 6c 69 6e 65 5f 63 6f 6e 74 61 69  l && line_contai
318a0 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 26 7a 53  ns_semicolon(&zS
318b0 71 6c 5b 6e 53 71 6c 50 72 69 6f 72 5d 2c 20 6e  ql[nSqlPrior], n
318c0 53 71 6c 2d 6e 53 71 6c 50 72 69 6f 72 29 0a 20  Sql-nSqlPrior). 
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
318e0 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  & sqlite3_comple
318f0 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20  te(zSql) ){.    
31900 20 20 65 72 72 43 6e 74 20 2b 3d 20 72 75 6e 4f    errCnt += runO
31910 6e 65 53 71 6c 4c 69 6e 65 28 70 2c 20 7a 53 71  neSqlLine(p, zSq
31920 6c 2c 20 69 6e 2c 20 73 74 61 72 74 6c 69 6e 65  l, in, startline
31930 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  );.      nSql = 
31940 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
31950 6f 75 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  outCount ){.    
31960 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
31970 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
31980 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  outCount = 0;.  
31990 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
319a0 69 66 28 20 6e 53 71 6c 20 26 26 20 5f 61 6c 6c  if( nSql && _all
319b0 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
319c0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  ) ){.      if( S
319d0 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
319e0 48 46 4c 47 5f 45 63 68 6f 29 20 29 20 70 72 69  HFLG_Echo) ) pri
319f0 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 53 71 6c  ntf("%s\n", zSql
31a00 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  );.      nSql = 
31a10 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
31a20 66 28 20 6e 53 71 6c 20 26 26 20 21 5f 61 6c 6c  f( nSql && !_all
31a30 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
31a40 29 20 29 7b 0a 20 20 20 20 72 75 6e 4f 6e 65 53  ) ){.    runOneS
31a50 71 6c 4c 69 6e 65 28 70 2c 20 7a 53 71 6c 2c 20  qlLine(p, zSql, 
31a60 69 6e 2c 20 73 74 61 72 74 6c 69 6e 65 29 3b 0a  in, startline);.
31a70 20 20 7d 0a 20 20 66 72 65 65 28 7a 53 71 6c 29    }.  free(zSql)
31a80 3b 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b  ;.  free(zLine);
31a90 0a 20 20 72 65 74 75 72 6e 20 65 72 72 43 6e 74  .  return errCnt
31aa0 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  >0;.}../*.** Ret
31ab0 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77  urn a pathname w
31ac0 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72  hich is the user
31ad0 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  's home director
31ae0 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72  y.  A.** 0 retur
31af0 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65  n indicates an e
31b00 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  rror of some kin
31b10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
31b20 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72  r *find_home_dir
31b30 28 69 6e 74 20 63 6c 65 61 72 46 6c 61 67 29 7b  (int clearFlag){
31b40 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
31b50 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b  home_dir = NULL;
31b60 0a 20 20 69 66 28 20 63 6c 65 61 72 46 6c 61 67  .  if( clearFlag
31b70 20 29 7b 0a 20 20 20 20 66 72 65 65 28 68 6f 6d   ){.    free(hom
31b80 65 5f 64 69 72 29 3b 0a 20 20 20 20 68 6f 6d 65  e_dir);.    home
31b90 5f 64 69 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  _dir = 0;.    re
31ba0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
31bb0 28 20 68 6f 6d 65 5f 64 69 72 20 29 20 72 65 74  ( home_dir ) ret
31bc0 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 0a 23  urn home_dir;..#
31bd0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
31be0 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
31bf0 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
31c00 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 5c  ed(_WIN32_WCE) \
31c10 0a 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65  .     && !define
31c20 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64  d(__RTP__) && !d
31c30 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
31c40 45 4c 29 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  EL).  {.    stru
31c50 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74  ct passwd *pwent
31c60 3b 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 20  ;.    uid_t uid 
31c70 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 20 20  = getuid();.    
31c80 69 66 28 20 28 70 77 65 6e 74 3d 67 65 74 70 77  if( (pwent=getpw
31c90 75 69 64 28 75 69 64 29 29 20 21 3d 20 4e 55 4c  uid(uid)) != NUL
31ca0 4c 29 20 7b 0a 20 20 20 20 20 20 68 6f 6d 65 5f  L) {.      home_
31cb0 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f  dir = pwent->pw_
31cc0 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dir;.    }.  }.#
31cd0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
31ce0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20  ed(_WIN32_WCE). 
31cf0 20 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28   /* Windows CE (
31d00 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33  arm-wince-mingw3
31d10 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f  2ce-gcc) does no
31d20 74 20 70 72 6f 76 69 64 65 20 67 65 74 65 6e 76  t provide getenv
31d30 28 29 0a 20 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f  ().   */.  home_
31d40 64 69 72 20 3d 20 22 2f 22 3b 0a 23 65 6c 73 65  dir = "/";.#else
31d50 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
31d60 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
31d70 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68  (WIN32).  if (!h
31d80 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
31d90 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
31da0 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
31db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
31dc0 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
31dd0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
31de0 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20  etenv("HOME");. 
31df0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
31e00 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
31e10 65 64 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28  ed(WIN32).  if (
31e20 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
31e30 20 63 68 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a   char *zDrive, *
31e40 7a 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e  zPath;.    int n
31e50 3b 0a 20 20 20 20 7a 44 72 69 76 65 20 3d 20 67  ;.    zDrive = g
31e60 65 74 65 6e 76 28 22 48 4f 4d 45 44 52 49 56 45  etenv("HOMEDRIVE
31e70 22 29 3b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  ");.    zPath = 
31e80 67 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48  getenv("HOMEPATH
31e90 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 72 69  ");.    if( zDri
31ea0 76 65 20 26 26 20 7a 50 61 74 68 20 29 7b 0a 20  ve && zPath ){. 
31eb0 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
31ec0 30 28 7a 44 72 69 76 65 29 20 2b 20 73 74 72 6c  0(zDrive) + strl
31ed0 65 6e 33 30 28 7a 50 61 74 68 29 20 2b 20 31 3b  en30(zPath) + 1;
31ee0 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  .      home_dir 
31ef0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  = malloc( n );. 
31f00 20 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69       if( home_di
31f10 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
31f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
31f30 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f  nprintf(n, home_
31f40 64 69 72 2c 20 22 25 73 25 73 22 2c 20 7a 44 72  dir, "%s%s", zDr
31f50 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  ive, zPath);.   
31f60 20 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64     return home_d
31f70 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f  ir;.    }.    ho
31f80 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b  me_dir = "c:\\";
31f90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  .  }.#endif..#en
31fa0 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57  dif /* !_WIN32_W
31fb0 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d  CE */..  if( hom
31fc0 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 69 6e 74  e_dir ){.    int
31fd0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f   n = strlen30(ho
31fe0 6d 65 5f 64 69 72 29 20 2b 20 31 3b 0a 20 20 20  me_dir) + 1;.   
31ff0 20 63 68 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f   char *z = mallo
32000 63 28 20 6e 20 29 3b 0a 20 20 20 20 69 66 28 20  c( n );.    if( 
32010 7a 20 29 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f  z ) memcpy(z, ho
32020 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20  me_dir, n);.    
32030 68 6f 6d 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20  home_dir = z;.  
32040 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68 6f 6d 65  }..  return home
32050 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _dir;.}../*.** R
32060 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 74  ead input from t
32070 68 65 20 66 69 6c 65 20 67 69 76 65 6e 20 62 79  he file given by
32080 20 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69   sqliterc_overri
32090 64 65 2e 20 20 4f 72 20 69 66 20 74 68 61 74 0a  de.  Or if that.
320a0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
320b0 4e 55 4c 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74  NULL, take input
320c0 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72   from ~/.sqliter
320d0 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  c.**.** Returns 
320e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
320f0 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
32100 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 73 71 6c  void process_sql
32110 69 74 65 72 63 28 0a 20 20 53 68 65 6c 6c 53 74  iterc(.  ShellSt
32120 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
32130 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
32140 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 20 2a  iguration data *
32150 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
32160 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64  sqliterc_overrid
32170 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e   /* Name of c
32180 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55 4c 4c  onfig file. NULL
32190 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
321a0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 68 6f  */.){.  char *ho
321b0 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20  me_dir = NULL;. 
321c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
321d0 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65 72 63  iterc = sqliterc
321e0 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63 68 61  _override;.  cha
321f0 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 46  r *zBuf = 0;.  F
32200 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a  ILE *in = NULL;.
32210 0a 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20  .  if (sqliterc 
32220 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68  == NULL) {.    h
32230 6f 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68  ome_dir = find_h
32240 6f 6d 65 5f 64 69 72 28 30 29 3b 0a 20 20 20 20  ome_dir(0);.    
32250 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20  if( home_dir==0 
32260 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
32270 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20  ntf(stderr, "-- 
32280 77 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20  warning: cannot 
32290 66 69 6e 64 20 68 6f 6d 65 20 64 69 72 65 63 74  find home direct
322a0 6f 72 79 3b 22 0a 20 20 20 20 20 20 20 20 20 20  ory;".          
322b0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 61              " ca
322c0 6e 6e 6f 74 20 72 65 61 64 20 7e 2f 2e 73 71 6c  nnot read ~/.sql
322d0 69 74 65 72 63 5c 6e 22 29 3b 0a 20 20 20 20 20  iterc\n");.     
322e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
322f0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69     sqlite3_initi
32300 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7a 42 75  alize();.    zBu
32310 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  f = sqlite3_mpri
32320 6e 74 66 28 22 25 73 2f 2e 73 71 6c 69 74 65 72  ntf("%s/.sqliter
32330 63 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20  c",home_dir);.  
32340 20 20 73 71 6c 69 74 65 72 63 20 3d 20 7a 42 75    sqliterc = zBu
32350 66 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  f;.  }.  in = fo
32360 70 65 6e 28 73 71 6c 69 74 65 72 63 2c 22 72 62  pen(sqliterc,"rb
32370 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a  ");.  if( in ){.
32380 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73      if( stdin_is
32390 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
323a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
323b0 66 28 73 74 64 65 72 72 2c 22 2d 2d 20 4c 6f 61  f(stderr,"-- Loa
323c0 64 69 6e 67 20 72 65 73 6f 75 72 63 65 73 20 66  ding resources f
323d0 72 6f 6d 20 25 73 5c 6e 22 2c 73 71 6c 69 74 65  rom %s\n",sqlite
323e0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rc);.    }.    p
323f0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69  rocess_input(p,i
32400 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
32410 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
32420 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 7d 0a  3_free(zBuf);.}.
32430 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69  ./*.** Show avai
32440 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  lable command li
32450 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  ne options.*/.st
32460 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
32470 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 0a 20 20 22  zOptions[] =.  "
32480 20 20 20 2d 61 73 63 69 69 20 20 20 20 20 20 20     -ascii       
32490 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
324a0 75 74 20 6d 6f 64 65 20 74 6f 20 27 61 73 63 69  ut mode to 'asci
324b0 69 27 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69  i'\n".  "   -bai
324c0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
324d0 20 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74   stop after hitt
324e0 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a  ing an error\n".
324f0 20 20 22 20 20 20 2d 62 61 74 63 68 20 20 20 20    "   -batch    
32500 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65             force
32510 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22 0a 20 20   batch I/O\n".  
32520 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20  "   -column     
32530 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
32540 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c  put mode to 'col
32550 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 63  umn'\n".  "   -c
32560 6d 64 20 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20  md COMMAND      
32570 20 20 20 72 75 6e 20 5c 22 43 4f 4d 4d 41 4e 44     run \"COMMAND
32580 5c 22 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  \" before readin
32590 67 20 73 74 64 69 6e 5c 6e 22 0a 20 20 22 20 20  g stdin\n".  "  
325a0 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20   -csv           
325b0 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
325c0 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e   mode to 'csv'\n
325d0 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
325e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
325f0 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo
32600 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a  re execution\n".
32610 20 20 22 20 20 20 2d 69 6e 69 74 20 46 49 4c 45    "   -init FILE
32620 4e 41 4d 45 20 20 20 20 20 20 20 72 65 61 64 2f  NAME       read/
32630 70 72 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69  process named fi
32640 6c 65 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f  le\n".  "   -[no
32650 5d 68 65 61 64 65 72 20 20 20 20 20 20 20 20 20  ]header         
32660 20 74 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e   turn headers on
32670 20 6f 72 20 6f 66 66 5c 6e 22 0a 23 69 66 20 64   or off\n".#if d
32680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
32690 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
326a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
326b0 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
326c0 20 20 22 20 20 20 2d 68 65 61 70 20 53 49 5a 45    "   -heap SIZE
326d0 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
326e0 6f 66 20 68 65 61 70 20 66 6f 72 20 6d 65 6d 73  of heap for mems
326f0 79 73 33 20 6f 72 20 6d 65 6d 73 79 73 35 5c 6e  ys3 or memsys5\n
32700 22 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d  ".#endif.  "   -
32710 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20  help            
32720 20 20 20 20 73 68 6f 77 20 74 68 69 73 20 6d 65      show this me
32730 73 73 61 67 65 5c 6e 22 0a 20 20 22 20 20 20 2d  ssage\n".  "   -
32740 68 74 6d 6c 20 20 20 20 20 20 20 20 20 20 20 20  html            
32750 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
32760 6f 64 65 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20  ode to HTML\n". 
32770 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76   "   -interactiv
32780 65 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20  e         force 
32790 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c  interactive I/O\
327a0 6e 22 0a 20 20 22 20 20 20 2d 6c 69 6e 65 20 20  n".  "   -line  
327b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
327c0 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
327d0 20 27 6c 69 6e 65 27 5c 6e 22 0a 20 20 22 20 20   'line'\n".  "  
327e0 20 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   -list          
327f0 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
32800 20 6d 6f 64 65 20 74 6f 20 27 6c 69 73 74 27 5c   mode to 'list'\
32810 6e 22 0a 20 20 22 20 20 20 2d 6c 6f 6f 6b 61 73  n".  "   -lookas
32820 69 64 65 20 53 49 5a 45 20 4e 20 20 20 20 75 73  ide SIZE N    us
32830 65 20 4e 20 65 6e 74 72 69 65 73 20 6f 66 20 53  e N entries of S
32840 5a 20 62 79 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  Z bytes for look
32850 61 73 69 64 65 20 6d 65 6d 6f 72 79 5c 6e 22 0a  aside memory\n".
32860 20 20 22 20 20 20 2d 6d 6d 61 70 20 4e 20 20 20    "   -mmap N   
32870 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
32880 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 73 65 74  lt mmap size set
32890 20 74 6f 20 4e 5c 6e 22 0a 23 69 66 64 65 66 20   to N\n".#ifdef 
328a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55  SQLITE_ENABLE_MU
328b0 4c 54 49 50 4c 45 58 0a 20 20 22 20 20 20 2d 6d  LTIPLEX.  "   -m
328c0 75 6c 74 69 70 6c 65 78 20 20 20 20 20 20 20 20  ultiplex        
328d0 20 20 20 65 6e 61 62 6c 65 20 74 68 65 20 6d 75     enable the mu
328e0 6c 74 69 70 6c 65 78 6f 72 20 56 46 53 5c 6e 22  ltiplexor VFS\n"
328f0 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d 6e  .#endif.  "   -n
32900 65 77 6c 69 6e 65 20 53 45 50 20 20 20 20 20 20  ewline SEP      
32910 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 72 6f     set output ro
32920 77 20 73 65 70 61 72 61 74 6f 72 2e 20 44 65 66  w separator. Def
32930 61 75 6c 74 3a 20 27 5c 5c 6e 27 5c 6e 22 0a 20  ault: '\\n'\n". 
32940 20 22 20 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20   "   -nullvalue 
32950 54 45 58 54 20 20 20 20 20 20 73 65 74 20 74 65  TEXT      set te
32960 78 74 20 73 74 72 69 6e 67 20 66 6f 72 20 4e 55  xt string for NU
32970 4c 4c 20 76 61 6c 75 65 73 2e 20 44 65 66 61 75  LL values. Defau
32980 6c 74 20 27 27 5c 6e 22 0a 20 20 22 20 20 20 2d  lt ''\n".  "   -
32990 70 61 67 65 63 61 63 68 65 20 53 49 5a 45 20 4e  pagecache SIZE N
329a0 20 20 20 20 75 73 65 20 4e 20 73 6c 6f 74 73 20      use N slots 
329b0 6f 66 20 53 5a 20 62 79 74 65 73 20 65 61 63 68  of SZ bytes each
329c0 20 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20   for page cache 
329d0 6d 65 6d 6f 72 79 5c 6e 22 0a 20 20 22 20 20 20  memory\n".  "   
329e0 2d 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  -quote          
329f0 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
32a00 6d 6f 64 65 20 74 6f 20 27 71 75 6f 74 65 27 5c  mode to 'quote'\
32a10 6e 22 0a 20 20 22 20 20 20 2d 73 65 70 61 72 61  n".  "   -separa
32a20 74 6f 72 20 53 45 50 20 20 20 20 20 20 20 73 65  tor SEP       se
32a30 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20  t output column 
32a40 73 65 70 61 72 61 74 6f 72 2e 20 44 65 66 61 75  separator. Defau
32a50 6c 74 3a 20 27 7c 27 5c 6e 22 0a 20 20 22 20 20  lt: '|'\n".  "  
32a60 20 2d 73 74 61 74 73 20 20 20 20 20 20 20 20 20   -stats         
32a70 20 20 20 20 20 20 70 72 69 6e 74 20 6d 65 6d 6f        print memo
32a80 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  ry stats before 
32a90 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 5c 6e 22  each finalize\n"
32aa0 0a 20 20 22 20 20 20 2d 76 65 72 73 69 6f 6e 20  .  "   -version 
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
32ac0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 5c   SQLite version\
32ad0 6e 22 0a 20 20 22 20 20 20 2d 76 66 73 20 4e 41  n".  "   -vfs NA
32ae0 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ME            us
32af0 65 20 4e 41 4d 45 20 61 73 20 74 68 65 20 64 65  e NAME as the de
32b00 66 61 75 6c 74 20 56 46 53 5c 6e 22 0a 23 69 66  fault VFS\n".#if
32b10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
32b20 45 5f 56 46 53 54 52 41 43 45 0a 20 20 22 20 20  E_VFSTRACE.  "  
32b30 20 2d 76 66 73 74 72 61 63 65 20 20 20 20 20 20   -vfstrace      
32b40 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74 72 61        enable tra
32b50 63 69 6e 67 20 6f 66 20 61 6c 6c 20 56 46 53 20  cing of all VFS 
32b60 63 61 6c 6c 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  calls\n".#endif.
32b70 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  ;.static void us
32b80 61 67 65 28 69 6e 74 20 73 68 6f 77 44 65 74 61  age(int showDeta
32b90 69 6c 29 7b 0a 20 20 75 74 66 38 5f 70 72 69 6e  il){.  utf8_prin
32ba0 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
32bb0 20 22 55 73 61 67 65 3a 20 25 73 20 5b 4f 50 54   "Usage: %s [OPT
32bc0 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d 45 20 5b  IONS] FILENAME [
32bd0 53 51 4c 5d 5c 6e 22 0a 20 20 20 20 20 20 22 46  SQL]\n".      "F
32be0 49 4c 45 4e 41 4d 45 20 69 73 20 74 68 65 20 6e  ILENAME is the n
32bf0 61 6d 65 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ame of an SQLite
32c00 20 64 61 74 61 62 61 73 65 2e 20 41 20 6e 65 77   database. A new
32c10 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
32c20 61 74 65 64 5c 6e 22 0a 20 20 20 20 20 20 22 69  ated\n".      "i
32c30 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
32c40 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65  not previously e
32c50 78 69 73 74 2e 5c 6e 22 2c 20 41 72 67 76 30 29  xist.\n", Argv0)
32c60 3b 0a 20 20 69 66 28 20 73 68 6f 77 44 65 74 61  ;.  if( showDeta
32c70 69 6c 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  il ){.    utf8_p
32c80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f  rintf(stderr, "O
32c90 50 54 49 4f 4e 53 20 69 6e 63 6c 75 64 65 3a 5c  PTIONS include:\
32ca0 6e 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b  n%s", zOptions);
32cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
32cc0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32cd0 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70 20   "Use the -help 
32ce0 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  option for addit
32cf0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
32d00 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78 69  n\n");.  }.  exi
32d10 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(1);.}../*.** I
32d20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
32d30 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
32d40 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69  in data.*/.stati
32d50 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74  c void main_init
32d60 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 64 61 74  (ShellState *dat
32d70 61 29 20 7b 0a 20 20 6d 65 6d 73 65 74 28 64 61  a) {.  memset(da
32d80 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 64  ta, 0, sizeof(*d
32d90 61 74 61 29 29 3b 0a 20 20 64 61 74 61 2d 3e 6e  ata));.  data->n
32da0 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 64 61 74 61  ormalMode = data
32db0 2d 3e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2d 3e  ->cMode = data->
32dc0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
32dd0 3b 0a 20 20 64 61 74 61 2d 3e 61 75 74 6f 45 78  ;.  data->autoEx
32de0 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 6d 65 6d  plain = 1;.  mem
32df0 63 70 79 28 64 61 74 61 2d 3e 63 6f 6c 53 65 70  cpy(data->colSep
32e00 61 72 61 74 6f 72 2c 53 45 50 5f 43 6f 6c 75 6d  arator,SEP_Colum
32e10 6e 2c 20 32 29 3b 0a 20 20 6d 65 6d 63 70 79 28  n, 2);.  memcpy(
32e20 64 61 74 61 2d 3e 72 6f 77 53 65 70 61 72 61 74  data->rowSeparat
32e30 6f 72 2c 53 45 50 5f 52 6f 77 2c 20 32 29 3b 0a  or,SEP_Row, 2);.
32e40 20 20 64 61 74 61 2d 3e 73 68 6f 77 48 65 61 64    data->showHead
32e50 65 72 20 3d 20 30 3b 0a 20 20 64 61 74 61 2d 3e  er = 0;.  data->
32e60 73 68 65 6c 6c 46 6c 67 73 20 3d 20 53 48 46 4c  shellFlgs = SHFL
32e70 47 5f 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 73  G_Lookaside;.  s
32e80 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
32e90 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
32ea0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   1);.  sqlite3_c
32eb0 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
32ec0 46 49 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c 4c 6f  FIG_LOG, shellLo
32ed0 67 2c 20 64 61 74 61 29 3b 0a 20 20 73 71 6c 69  g, data);.  sqli
32ee0 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
32ef0 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
32f00 52 45 41 44 29 3b 0a 20 20 73 71 6c 69 74 65 33  READ);.  sqlite3
32f10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
32f20 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2c 20 6d 61  (mainPrompt), ma
32f30 69 6e 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65  inPrompt,"sqlite
32f40 3e 20 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  > ");.  sqlite3_
32f50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32f60 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2c  continuePrompt),
32f70 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c   continuePrompt,
32f80 22 20 20 20 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a  "   ...> ");.}..
32f90 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 65 78  /*.** Output tex
32fa0 74 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f 6c 65  t to the console
32fb0 20 69 6e 20 61 20 66 6f 6e 74 20 74 68 61 74 20   in a font that 
32fc0 61 74 74 72 61 63 74 73 20 65 78 74 72 61 20 61  attracts extra a
32fd0 74 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  ttention..*/.#if
32fe0 64 65 66 20 5f 57 49 4e 33 32 0a 73 74 61 74 69  def _WIN32.stati
32ff0 63 20 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64  c void printBold
33000 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
33010 78 74 29 7b 0a 20 20 48 41 4e 44 4c 45 20 6f 75  xt){.  HANDLE ou
33020 74 20 3d 20 47 65 74 53 74 64 48 61 6e 64 6c 65  t = GetStdHandle
33030 28 53 54 44 5f 4f 55 54 50 55 54 5f 48 41 4e 44  (STD_OUTPUT_HAND
33040 4c 45 29 3b 0a 20 20 43 4f 4e 53 4f 4c 45 5f 53  LE);.  CONSOLE_S
33050 43 52 45 45 4e 5f 42 55 46 46 45 52 5f 49 4e 46  CREEN_BUFFER_INF
33060 4f 20 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49  O defaultScreenI
33070 6e 66 6f 3b 0a 20 20 47 65 74 43 6f 6e 73 6f 6c  nfo;.  GetConsol
33080 65 53 63 72 65 65 6e 42 75 66 66 65 72 49 6e 66  eScreenBufferInf
33090 6f 28 6f 75 74 2c 20 26 64 65 66 61 75 6c 74 53  o(out, &defaultS
330a0 63 72 65 65 6e 49 6e 66 6f 29 3b 0a 20 20 53 65  creenInfo);.  Se
330b0 74 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72  tConsoleTextAttr
330c0 69 62 75 74 65 28 6f 75 74 2c 0a 20 20 20 20 20  ibute(out,.     
330d0 20 20 20 20 46 4f 52 45 47 52 4f 55 4e 44 5f 52      FOREGROUND_R
330e0 45 44 7c 46 4f 52 45 47 52 4f 55 4e 44 5f 49 4e  ED|FOREGROUND_IN
330f0 54 45 4e 53 49 54 59 0a 20 20 29 3b 0a 20 20 70  TENSITY.  );.  p
33100 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78  rintf("%s", zTex
33110 74 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65  t);.  SetConsole
33120 54 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75  TextAttribute(ou
33130 74 2c 20 64 65 66 61 75 6c 74 53 63 72 65 65 6e  t, defaultScreen
33140 49 6e 66 6f 2e 77 41 74 74 72 69 62 75 74 65 73  Info.wAttributes
33150 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69  );.}.#else.stati
33160 63 20 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64  c void printBold
33170 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
33180 78 74 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 5c  xt){.  printf("\
33190 30 33 33 5b 31 6d 25 73 5c 30 33 33 5b 30 6d 22  033[1m%s\033[0m"
331a0 2c 20 7a 54 65 78 74 29 3b 0a 7d 0a 23 65 6e 64  , zText);.}.#end
331b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  if../*.** Get th
331c0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e  e argument to an
331d0 20 2d 2d 6f 70 74 69 6f 6e 2e 20 20 54 68 72 6f   --option.  Thro
331e0 77 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 64  w an error and d
331f0 69 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e  ie if no argumen
33200 74 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  t.** is availabl
33210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
33220 72 20 2a 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  r *cmdline_optio
33230 6e 5f 76 61 6c 75 65 28 69 6e 74 20 61 72 67 63  n_value(int argc
33240 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69  , char **argv, i
33250 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 69 3d 3d  nt i){.  if( i==
33260 61 72 67 63 20 29 7b 0a 20 20 20 20 75 74 66 38  argc ){.    utf8
33270 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33280 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d 69 73 73  "%s: Error: miss
33290 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ing argument to 
332a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
332b0 20 20 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 76     argv[0], argv
332c0 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 65  [argc-1]);.    e
332d0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65  xit(1);.  }.  re
332e0 74 75 72 6e 20 61 72 67 76 5b 69 5d 3b 0a 7d 0a  turn argv[i];.}.
332f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33300 53 48 45 4c 4c 5f 49 53 5f 55 54 46 38 0a 23 20  SHELL_IS_UTF8.# 
33310 20 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49   if (defined(_WI
33320 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
33330 57 49 4e 33 32 29 29 20 26 26 20 64 65 66 69 6e  WIN32)) && defin
33340 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 23 20 20  ed(_MSC_VER).#  
33350 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
33360 53 48 45 4c 4c 5f 49 53 5f 55 54 46 38 20 20 20  SHELL_IS_UTF8   
33370 20 20 20 20 20 20 20 28 30 29 0a 23 20 20 65 6c         (0).#  el
33380 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
33390 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f 55  QLITE_SHELL_IS_U
333a0 54 46 38 20 20 20 20 20 20 20 20 20 20 28 31 29  TF8          (1)
333b0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
333c0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 53 48 45  ..#if SQLITE_SHE
333d0 4c 4c 5f 49 53 5f 55 54 46 38 0a 69 6e 74 20 53  LL_IS_UTF8.int S
333e0 51 4c 49 54 45 5f 43 44 45 43 4c 20 6d 61 69 6e  QLITE_CDECL main
333f0 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
33400 2a 2a 61 72 67 76 29 7b 0a 23 65 6c 73 65 0a 69  **argv){.#else.i
33410 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  nt SQLITE_CDECL 
33420 77 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20  wmain(int argc, 
33430 77 63 68 61 72 5f 74 20 2a 2a 77 61 72 67 76 29  wchar_t **wargv)
33440 7b 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 3b  {.  char **argv;
33450 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
33460 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 53  zErrMsg = 0;.  S
33470 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a  hellState data;.
33480 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
33490 6e 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  nitFile = 0;.  i
334a0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
334b0 20 30 3b 0a 20 20 69 6e 74 20 77 61 72 6e 49 6e   0;.  int warnIn
334c0 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b 0a 20 20  memoryDb = 0;.  
334d0 69 6e 74 20 72 65 61 64 53 74 64 69 6e 20 3d 20  int readStdin = 
334e0 31 3b 0a 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20  1;.  int nCmd = 
334f0 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d  0;.  char **azCm
33500 64 20 3d 20 30 3b 0a 0a 20 20 73 65 74 42 69 6e  d = 0;..  setBin
33510 61 72 79 4d 6f 64 65 28 73 74 64 69 6e 2c 20 30  aryMode(stdin, 0
33520 29 3b 0a 20 20 73 65 74 76 62 75 66 28 73 74 64  );.  setvbuf(std
33530 65 72 72 2c 20 30 2c 20 5f 49 4f 4e 42 46 2c 20  err, 0, _IONBF, 
33540 30 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  0); /* Make sure
33550 20 73 74 64 65 72 72 20 69 73 20 75 6e 62 75 66   stderr is unbuf
33560 66 65 72 65 64 20 2a 2f 0a 20 20 73 74 64 69 6e  fered */.  stdin
33570 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
33580 3d 20 69 73 61 74 74 79 28 30 29 3b 0a 20 20 73  = isatty(0);.  s
33590 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65  tdout_is_console
335a0 20 3d 20 69 73 61 74 74 79 28 31 29 3b 0a 0a 23   = isatty(1);..#
335b0 69 66 20 55 53 45 5f 53 59 53 54 45 4d 5f 53 51  if USE_SYSTEM_SQ
335c0 4c 49 54 45 2b 30 21 3d 31 0a 20 20 69 66 28 20  LITE+0!=1.  if( 
335d0 73 74 72 6e 63 6d 70 28 73 71 6c 69 74 65 33 5f  strncmp(sqlite3_
335e0 73 6f 75 72 63 65 69 64 28 29 2c 53 51 4c 49 54  sourceid(),SQLIT
335f0 45 5f 53 4f 55 52 43 45 5f 49 44 2c 36 30 29 21  E_SOURCE_ID,60)!
33600 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
33610 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
33620 51 4c 69 74 65 20 68 65 61 64 65 72 20 61 6e 64  QLite header and
33630 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20   source version 
33640 6d 69 73 6d 61 74 63 68 5c 6e 25 73 5c 6e 25 73  mismatch\n%s\n%s
33650 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
33660 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
33670 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52  d(), SQLITE_SOUR
33680 43 45 5f 49 44 29 3b 0a 20 20 20 20 65 78 69 74  CE_ID);.    exit
33690 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
336a0 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74    main_init(&dat
336b0 61 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  a);.#if !SQLITE_
336c0 53 48 45 4c 4c 5f 49 53 5f 55 54 46 38 0a 20 20  SHELL_IS_UTF8.  
336d0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
336e0 7a 65 28 29 3b 0a 20 20 61 72 67 76 20 3d 20 73  ze();.  argv = s
336f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
33700 73 69 7a 65 6f 66 28 61 72 67 76 5b 30 5d 29 2a  sizeof(argv[0])*
33710 61 72 67 63 29 3b 0a 20 20 69 66 28 20 61 72 67  argc);.  if( arg
33720 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  v==0 ){.    raw_
33730 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33740 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
33750 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
33760 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
33770 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
33780 20 61 72 67 76 5b 69 5d 20 3d 20 73 71 6c 69 74   argv[i] = sqlit
33790 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65  e3_win32_unicode
337a0 5f 74 6f 5f 75 74 66 38 28 77 61 72 67 76 5b 69  _to_utf8(wargv[i
337b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 61 72 67 76  ]);.    if( argv
337c0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
337d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
337e0 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
337f0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  y\n");.      exi
33800 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
33810 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
33820 20 61 72 67 63 3e 3d 31 20 26 26 20 61 72 67 76   argc>=1 && argv
33830 20 26 26 20 61 72 67 76 5b 30 5d 20 29 3b 0a 20   && argv[0] );. 
33840 20 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d   Argv0 = argv[0]
33850 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
33860 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
33870 64 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c 65 72  d signal handler
33880 20 65 61 72 6c 79 2c 20 62 65 66 6f 72 65 20 61   early, before a
33890 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 65 6c 73  nything.  ** els
338a0 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
338b0 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a 20 20  #ifdef SIGINT.  
338c0 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 69  signal(SIGINT, i
338d0 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
338e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
338f0 66 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44  f SQLITE_SHELL_D
33900 42 4e 41 4d 45 5f 50 52 4f 43 0a 20 20 7b 0a 20  BNAME_PROC.  {. 
33910 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c     /* If the SQL
33920 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45  ITE_SHELL_DBNAME
33930 5f 50 52 4f 43 20 6d 61 63 72 6f 20 69 73 20 64  _PROC macro is d
33940 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  efined, then it 
33950 69 73 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  is the name.    
33960 2a 2a 20 6f 66 20 61 20 43 2d 66 75 6e 63 74 69  ** of a C-functi
33970 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 72 6f  on that will pro
33980 76 69 64 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  vide the name of
33990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
339a0 6c 65 2e 20 20 55 73 65 0a 20 20 20 20 2a 2a 20  le.  Use.    ** 
339b0 74 68 69 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  this compile-tim
339c0 65 20 6f 70 74 69 6f 6e 20 74 6f 20 65 6d 62 65  e option to embe
339d0 64 20 74 68 69 73 20 73 68 65 6c 6c 20 70 72 6f  d this shell pro
339e0 67 72 61 6d 20 69 6e 20 6c 61 72 67 65 72 0a 20  gram in larger. 
339f0 20 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f     ** applicatio
33a00 6e 73 2e 20 2a 2f 0a 20 20 20 20 65 78 74 65 72  ns. */.    exter
33a10 6e 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 53 48  n void SQLITE_SH
33a20 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f 43 28  ELL_DBNAME_PROC(
33a30 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20  const char**);. 
33a40 20 20 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f     SQLITE_SHELL_
33a50 44 42 4e 41 4d 45 5f 50 52 4f 43 28 26 64 61 74  DBNAME_PROC(&dat
33a60 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  a.zDbFilename);.
33a70 20 20 20 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79      warnInmemory
33a80 44 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Db = 0;.  }.#end
33a90 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69  if..  /* Do an i
33aa0 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f  nitial pass thro
33ab0 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d  ugh the command-
33ac0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  line argument to
33ad0 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65   locate.  ** the
33ae0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
33af0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20  abase file, the 
33b00 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 69 74  name of the init
33b10 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c  ialization file,
33b20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f  .  ** the size o
33b30 66 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  f the alternativ
33b40 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70 2c 0a 20  e malloc heap,. 
33b50 20 2a 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73   ** and the firs
33b60 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65  t command to exe
33b70 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  cute..  */.  for
33b80 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=1; i<argc; i+
33b90 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
33ba0 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d  .    z = argv[i]
33bb0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
33bc0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '-' ){.      if(
33bd0 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d   data.zDbFilenam
33be0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33bf0 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
33c00 20 3d 20 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = z;.      }els
33c10 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
33c20 63 65 73 73 73 20 61 72 67 75 6d 65 6e 74 73 20  cesss arguments 
33c30 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
33c40 61 73 20 53 51 4c 20 28 6f 72 20 64 6f 74 2d 63  as SQL (or dot-c
33c50 6f 6d 6d 61 6e 64 73 29 20 61 6e 64 0a 20 20 20  ommands) and.   
33c60 20 20 20 20 20 2a 2a 20 6d 65 61 6e 20 74 68 61       ** mean tha
33c70 74 20 6e 6f 74 68 69 6e 67 20 69 73 20 72 65 61  t nothing is rea
33c80 64 20 66 72 6f 6d 20 73 74 64 69 6e 20 2a 2f 0a  d from stdin */.
33c90 20 20 20 20 20 20 20 20 72 65 61 64 53 74 64 69          readStdi
33ca0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  n = 0;.        n
33cb0 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Cmd++;.        a
33cc0 7a 43 6d 64 20 3d 20 72 65 61 6c 6c 6f 63 28 61  zCmd = realloc(a
33cd0 7a 43 6d 64 2c 20 73 69 7a 65 6f 66 28 61 7a 43  zCmd, sizeof(azC
33ce0 6d 64 5b 30 5d 29 2a 6e 43 6d 64 29 3b 0a 20 20  md[0])*nCmd);.  
33cf0 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64 3d        if( azCmd=
33d00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33d10 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33d20 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
33d30 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  y\n");.         
33d40 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
33d50 20 20 7d 0a 20 20 20 20 20 20 20 20 61 7a 43 6d    }.        azCm
33d60 64 5b 6e 43 6d 64 2d 31 5d 20 3d 20 7a 3b 0a 20  d[nCmd-1] = z;. 
33d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33d80 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
33d90 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74   z++;.    if( st
33da0 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74  rcmp(z,"-separat
33db0 6f 72 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20  or")==0.     || 
33dc0 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76  strcmp(z,"-nullv
33dd0 61 6c 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c  alue")==0.     |
33de0 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 65 77  | strcmp(z,"-new
33df0 6c 69 6e 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c  line")==0.     |
33e00 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6d 64  | strcmp(z,"-cmd
33e10 22 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ")==0.    ){.   
33e20 20 20 20 28 76 6f 69 64 29 63 6d 64 6c 69 6e 65     (void)cmdline
33e30 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72  _option_value(ar
33e40 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a  gc, argv, ++i);.
33e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
33e60 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d  rcmp(z,"-init")=
33e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 6e 69  =0 ){.      zIni
33e80 74 46 69 6c 65 20 3d 20 63 6d 64 6c 69 6e 65 5f  tFile = cmdline_
33e90 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67  option_value(arg
33ea0 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20  c, argv, ++i);. 
33eb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
33ec0 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d  cmp(z,"-batch")=
33ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
33ee0 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  eed to check for
33ef0 20 62 61 74 63 68 20 6d 6f 64 65 20 68 65 72 65   batch mode here
33f00 20 74 6f 20 73 6f 20 77 65 20 63 61 6e 20 61 76   to so we can av
33f10 6f 69 64 20 70 72 69 6e 74 69 6e 67 0a 20 20 20  oid printing.   
33f20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
33f30 6e 61 6c 20 6d 65 73 73 61 67 65 73 20 28 6c 69  nal messages (li
33f40 6b 65 20 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f  ke from process_
33f50 73 71 6c 69 74 65 72 63 29 20 62 65 66 6f 72 65  sqliterc) before
33f60 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  .      ** we do 
33f70 74 68 65 20 61 63 74 75 61 6c 20 70 72 6f 63 65  the actual proce
33f80 73 73 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e  ssing of argumen
33f90 74 73 20 6c 61 74 65 72 20 69 6e 20 61 20 73 65  ts later in a se
33fa0 63 6f 6e 64 20 70 61 73 73 2e 0a 20 20 20 20 20  cond pass..     
33fb0 20 2a 2f 0a 20 20 20 20 20 20 73 74 64 69 6e 5f   */.      stdin_
33fc0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
33fd0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
33fe0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61  ( strcmp(z,"-hea
33ff0 70 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  p")==0 ){.#if de
34000 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
34010 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
34020 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
34030 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
34040 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34050 2a 7a 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  *zSize;.      sq
34060 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 48 65  lite3_int64 szHe
34070 61 70 3b 0a 0a 20 20 20 20 20 20 7a 53 69 7a 65  ap;..      zSize
34080 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f   = cmdline_optio
34090 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72  n_value(argc, ar
340a0 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 20 20  gv, ++i);.      
340b0 73 7a 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72  szHeap = integer
340c0 56 61 6c 75 65 28 7a 53 69 7a 65 29 3b 0a 20 20  Value(zSize);.  
340d0 20 20 20 20 69 66 28 20 73 7a 48 65 61 70 3e 30      if( szHeap>0
340e0 78 37 66 66 66 30 30 30 30 20 29 20 73 7a 48 65  x7fff0000 ) szHe
340f0 61 70 20 3d 20 30 78 37 66 66 66 30 30 30 30 3b  ap = 0x7fff0000;
34100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
34110 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
34120 46 49 47 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f 63  FIG_HEAP, malloc
34130 28 28 69 6e 74 29 73 7a 48 65 61 70 29 2c 20 28  ((int)szHeap), (
34140 69 6e 74 29 73 7a 48 65 61 70 2c 20 36 34 29 3b  int)szHeap, 64);
34150 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f  .#else.      (vo
34160 69 64 29 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  id)cmdline_optio
34170 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72  n_value(argc, ar
34180 67 76 2c 20 2b 2b 69 29 3b 0a 23 65 6e 64 69 66  gv, ++i);.#endif
34190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
341a0 74 72 63 6d 70 28 7a 2c 22 2d 70 61 67 65 63 61  trcmp(z,"-pageca
341b0 63 68 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  che")==0 ){.    
341c0 20 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20    int n, sz;.   
341d0 20 20 20 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74     sz = (int)int
341e0 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e  egerValue(cmdlin
341f0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
34200 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
34210 20 20 20 20 20 20 69 66 28 20 73 7a 3e 37 30 30        if( sz>700
34220 30 30 20 29 20 73 7a 20 3d 20 37 30 30 30 30 3b  00 ) sz = 70000;
34230 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20  .      if( sz<0 
34240 29 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  ) sz = 0;.      
34250 6e 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  n = (int)integer
34260 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70  Value(cmdline_op
34270 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
34280 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20  argv,++i));.    
34290 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
342a0 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50  (SQLITE_CONFIG_P
342b0 41 47 45 43 41 43 48 45 2c 0a 20 20 20 20 20 20  AGECACHE,.      
342c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
342d0 3e 30 20 26 26 20 73 7a 3e 30 29 20 3f 20 6d 61  >0 && sz>0) ? ma
342e0 6c 6c 6f 63 28 6e 2a 73 7a 29 20 3a 20 30 2c 20  lloc(n*sz) : 0, 
342f0 73 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 64 61  sz, n);.      da
34300 74 61 2e 73 68 65 6c 6c 46 6c 67 73 20 7c 3d 20  ta.shellFlgs |= 
34310 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 3b  SHFLG_Pagecache;
34320 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
34330 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 6f 6b 61 73  trcmp(z,"-lookas
34340 69 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ide")==0 ){.    
34350 20 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20    int n, sz;.   
34360 20 20 20 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74     sz = (int)int
34370 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e  egerValue(cmdlin
34380 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
34390 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
343a0 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29        if( sz<0 )
343b0 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e   sz = 0;.      n
343c0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
343d0 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74  alue(cmdline_opt
343e0 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61  ion_value(argc,a
343f0 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20  rgv,++i));.     
34400 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30   if( n<0 ) n = 0
34410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
34420 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
34430 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c 20  NFIG_LOOKASIDE, 
34440 73 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  sz, n);.      if
34450 28 20 73 7a 2a 6e 3d 3d 30 20 29 20 64 61 74 61  ( sz*n==0 ) data
34460 2e 73 68 65 6c 6c 46 6c 67 73 20 26 3d 20 7e 53  .shellFlgs &= ~S
34470 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 3b 0a  HFLG_Lookaside;.
34480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
34490 41 42 4c 45 5f 56 46 53 54 52 41 43 45 0a 20 20  ABLE_VFSTRACE.  
344a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
344b0 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61 63 65 22  mp(z,"-vfstrace"
344c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78  )==0 ){.      ex
344d0 74 65 72 6e 20 69 6e 74 20 76 66 73 74 72 61 63  tern int vfstrac
344e0 65 5f 72 65 67 69 73 74 65 72 28 0a 20 20 20 20  e_register(.    
344f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34500 2a 7a 54 72 61 63 65 4e 61 6d 65 2c 0a 20 20 20  *zTraceName,.   
34510 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34520 20 2a 7a 4f 6c 64 56 66 73 4e 61 6d 65 2c 0a 20   *zOldVfsName,. 
34530 20 20 20 20 20 20 20 20 69 6e 74 20 28 2a 78 4f          int (*xO
34540 75 74 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ut)(const char*,
34550 76 6f 69 64 2a 29 2c 0a 20 20 20 20 20 20 20 20  void*),.        
34560 20 76 6f 69 64 20 2a 70 4f 75 74 41 72 67 2c 0a   void *pOutArg,.
34570 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 6b           int mak
34580 65 44 65 66 61 75 6c 74 0a 20 20 20 20 20 20 29  eDefault.      )
34590 3b 0a 20 20 20 20 20 20 76 66 73 74 72 61 63 65  ;.      vfstrace
345a0 5f 72 65 67 69 73 74 65 72 28 22 74 72 61 63 65  _register("trace
345b0 22 2c 30 2c 28 69 6e 74 28 2a 29 28 63 6f 6e 73  ",0,(int(*)(cons
345c0 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29 29 66  t char*,void*))f
345d0 70 75 74 73 2c 73 74 64 65 72 72 2c 31 29 3b 0a  puts,stderr,1);.
345e0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
345f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54  LITE_ENABLE_MULT
34600 49 50 4c 45 58 0a 20 20 20 20 7d 65 6c 73 65 20  IPLEX.    }else 
34610 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d  if( strcmp(z,"-m
34620 75 6c 74 69 70 6c 65 78 22 29 3d 3d 30 20 29 7b  ultiplex")==0 ){
34630 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69 6e  .      extern in
34640 74 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70  t sqlite3_multip
34650 6c 65 5f 69 6e 69 74 69 61 6c 69 7a 65 28 63 6f  le_initialize(co
34660 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
34670 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
34680 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69  ltiplex_initiali
34690 7a 65 28 30 2c 20 31 29 3b 0a 23 65 6e 64 69 66  ze(0, 1);.#endif
346a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
346b0 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22 29  trcmp(z,"-mmap")
346c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
346d0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20  ite3_int64 sz = 
346e0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64  integerValue(cmd
346f0 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
34700 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29  e(argc,argv,++i)
34710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34720 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
34730 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 2c  ONFIG_MMAP_SIZE,
34740 20 73 7a 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65   sz, sz);.    }e
34750 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
34760 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20  ,"-vfs")==0 ){. 
34770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
34780 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
34790 5f 76 66 73 5f 66 69 6e 64 28 63 6d 64 6c 69 6e  _vfs_find(cmdlin
347a0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
347b0 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
347c0 20 20 20 20 20 20 69 66 28 20 70 56 66 73 20 29        if( pVfs )
347d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
347e0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
347f0 56 66 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Vfs, 1);.      }
34800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
34810 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
34820 2c 20 22 6e 6f 20 73 75 63 68 20 56 46 53 3a 20  , "no such VFS: 
34830 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 72 67 76 5b  \"%s\"\n", argv[
34840 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  i]);.        exi
34850 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
34860 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 64 61    }.  }.  if( da
34870 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  ta.zDbFilename==
34880 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
34890 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
348a0 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69  B.    data.zDbFi
348b0 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72  lename = ":memor
348c0 79 3a 22 3b 0a 20 20 20 20 77 61 72 6e 49 6e 6d  y:";.    warnInm
348d0 65 6d 6f 72 79 44 62 20 3d 20 61 72 67 63 3d 3d  emoryDb = argc==
348e0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 66  1;.#else.    utf
348f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
34900 22 25 73 3a 20 45 72 72 6f 72 3a 20 6e 6f 20 64  "%s: Error: no d
34910 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
34920 20 73 70 65 63 69 66 69 65 64 5c 6e 22 2c 20 41   specified\n", A
34930 72 67 76 30 29 3b 0a 20 20 20 20 72 65 74 75 72  rgv0);.    retur
34940 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  n 1;.#endif.  }.
34950 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64    data.out = std
34960 6f 75 74 3b 0a 0a 20 20 2f 2a 20 47 6f 20 61 68  out;..  /* Go ah
34970 65 61 64 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  ead and open the
34980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
34990 66 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  f it already exi
349a0 73 74 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  sts.  If the.  *
349b0 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  * file does not 
349c0 65 78 69 73 74 2c 20 64 65 6c 61 79 20 6f 70 65  exist, delay ope
349d0 6e 69 6e 67 20 69 74 2e 20 20 54 68 69 73 20 70  ning it.  This p
349e0 72 65 76 65 6e 74 73 20 65 6d 70 74 79 20 64 61  revents empty da
349f0 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
34a00 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 72 65  s from being cre
34a10 61 74 65 64 20 69 66 20 61 20 75 73 65 72 20 6d  ated if a user m
34a20 69 73 74 79 70 65 73 20 74 68 65 20 64 61 74 61  istypes the data
34a30 62 61 73 65 20 6e 61 6d 65 20 61 72 67 75 6d 65  base name argume
34a40 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  nt.  ** to the s
34a50 71 6c 69 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  qlite command-li
34a60 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20  ne tool..  */.  
34a70 69 66 28 20 61 63 63 65 73 73 28 64 61 74 61 2e  if( access(data.
34a80 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d  zDbFilename, 0)=
34a90 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
34aa0 62 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 7d  b(&data, 0);.  }
34ab0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
34ac0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
34ad0 6e 20 66 69 6c 65 20 69 66 20 74 68 65 72 65 20  n file if there 
34ae0 69 73 20 6f 6e 65 2e 20 20 49 66 20 6e 6f 20 2d  is one.  If no -
34af0 69 6e 69 74 20 6f 70 74 69 6f 6e 0a 20 20 2a 2a  init option.  **
34b00 20 69 73 20 67 69 76 65 6e 20 6f 6e 20 74 68 65   is given on the
34b10 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 6c   command line, l
34b20 6f 6f 6b 20 66 6f 72 20 61 20 66 69 6c 65 20 6e  ook for a file n
34b30 61 6d 65 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63  amed ~/.sqliterc
34b40 20 61 6e 64 0a 20 20 2a 2a 20 74 72 79 20 74 6f   and.  ** try to
34b50 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a   process it..  *
34b60 2f 0a 20 20 70 72 6f 63 65 73 73 5f 73 71 6c 69  /.  process_sqli
34b70 74 65 72 63 28 26 64 61 74 61 2c 7a 49 6e 69 74  terc(&data,zInit
34b80 46 69 6c 65 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  File);..  /* Mak
34b90 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
34ba0 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d  through the comm
34bb0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
34bc0 74 20 61 6e 64 20 73 65 74 0a 20 20 2a 2a 20 6f  t and set.  ** o
34bd0 70 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 65  ptions.  This se
34be0 63 6f 6e 64 20 70 61 73 73 20 69 73 20 64 65 6c  cond pass is del
34bf0 61 79 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72  ayed until after
34c00 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
34c10 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ion.  ** file is
34c20 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 74 68   processed so th
34c30 61 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  at the command-l
34c40 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69  ine arguments wi
34c50 6c 6c 20 6f 76 65 72 72 69 64 65 0a 20 20 2a 2a  ll override.  **
34c60 20 73 65 74 74 69 6e 67 73 20 69 6e 20 74 68 65   settings in the
34c70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
34c80 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  file..  */.  for
34c90 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=1; i<argc; i+
34ca0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
34cb0 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69  = argv[i];.    i
34cc0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63  f( z[0]!='-' ) c
34cd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
34ce0 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b   z[1]=='-' ){ z+
34cf0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72  +; }.    if( str
34d00 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d  cmp(z,"-init")==
34d10 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
34d20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
34d30 72 63 6d 70 28 7a 2c 22 2d 68 74 6d 6c 22 29 3d  rcmp(z,"-html")=
34d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
34d50 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d  .mode = MODE_Htm
34d60 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
34d70 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 73 74   strcmp(z,"-list
34d80 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
34d90 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
34da0 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  List;.    }else 
34db0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 71  if( strcmp(z,"-q
34dc0 75 6f 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uote")==0 ){.   
34dd0 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
34de0 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d  ODE_Quote;.    }
34df0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
34e00 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b  z,"-line")==0 ){
34e10 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
34e20 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
34e30 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
34e40 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d  mp(z,"-column")=
34e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
34e60 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  .mode = MODE_Col
34e70 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  umn;.    }else i
34e80 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73  f( strcmp(z,"-cs
34e90 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  v")==0 ){.      
34ea0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
34eb0 5f 43 73 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63  _Csv;.      memc
34ec0 70 79 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72  py(data.colSepar
34ed0 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a 20 20 20  ator,",",2);.   
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 61 73 63 69 69 22 29 3d 3d 30  p(z,"-ascii")==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 41 73 63 69 69  ode = MODE_Ascii
34f20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
34f30 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
34f40 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f  data.colSeparato
34f50 72 29 2c 20 64 61 74 61 2e 63 6f 6c 53 65 70 61  r), data.colSepa
34f60 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  rator,.         
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45                SE
34f80 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73  P_Unit);.      s
34f90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34fa0 73 69 7a 65 6f 66 28 64 61 74 61 2e 72 6f 77 53  sizeof(data.rowS
34fb0 65 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61 2e  eparator), data.
34fc0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  rowSeparator,.  
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fe0 20 20 20 20 20 53 45 50 5f 52 65 63 6f 72 64 29       SEP_Record)
34ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35000 73 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72  strcmp(z,"-separ
35010 61 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ator")==0 ){.   
35020 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35030 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
35040 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 64  colSeparator), d
35050 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
35060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35070 20 20 20 20 20 20 20 20 20 22 25 73 22 2c 63 6d           "%s",cm
35080 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c  dline_option_val
35090 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69  ue(argc,argv,++i
350a0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
350b0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 65 77  ( strcmp(z,"-new
350c0 6c 69 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  line")==0 ){.   
350d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
350e0 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
350f0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 64  rowSeparator), d
35100 61 74 61 2e 72 6f 77 53 65 70 61 72 61 74 6f 72  ata.rowSeparator
35110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35120 20 20 20 20 20 20 20 20 20 22 25 73 22 2c 63 6d           "%s",cm
35130 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c  dline_option_val
35140 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69  ue(argc,argv,++i
35150 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
35160 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c  ( strcmp(z,"-nul
35170 6c 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20  lvalue")==0 ){. 
35180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
35190 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74  rintf(sizeof(dat
351a0 61 2e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 64 61  a.nullValue), da
351b0 74 61 2e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20  ta.nullValue,.  
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351d0 20 20 20 20 20 22 25 73 22 2c 63 6d 64 6c 69 6e       "%s",cmdlin
351e0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
351f0 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
35200 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
35210 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22  rcmp(z,"-header"
35220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
35230 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
35240 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
35250 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65   strcmp(z,"-nohe
35260 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ader")==0 ){.   
35270 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
35280 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  er = 0;.    }els
35290 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
352a0 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  -echo")==0 ){.  
352b0 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67      ShellSetFlag
352c0 28 26 64 61 74 61 2c 20 53 48 46 4c 47 5f 45 63  (&data, SHFLG_Ec
352d0 68 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ho);.    }else i
352e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65 71  f( strcmp(z,"-eq
352f0 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
35300 64 61 74 61 2e 61 75 74 6f 45 51 50 20 3d 20 31  data.autoEQP = 1
35310 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35320 73 74 72 63 6d 70 28 7a 2c 22 2d 65 71 70 66 75  strcmp(z,"-eqpfu
35330 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
35340 20 64 61 74 61 2e 61 75 74 6f 45 51 50 20 3d 20   data.autoEQP = 
35350 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
35360 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 74 61 74   strcmp(z,"-stat
35370 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
35380 64 61 74 61 2e 73 74 61 74 73 4f 6e 20 3d 20 31  data.statsOn = 1
35390 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
353a0 73 74 72 63 6d 70 28 7a 2c 22 2d 73 63 61 6e 73  strcmp(z,"-scans
353b0 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tats")==0 ){.   
353c0 20 20 20 64 61 74 61 2e 73 63 61 6e 73 74 61 74     data.scanstat
353d0 73 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  sOn = 1;.    }el
353e0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
353f0 22 2d 62 61 63 6b 73 6c 61 73 68 22 29 3d 3d 30  "-backslash")==0
35400 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 64   ){.      /* Und
35410 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
35420 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 3a 20 2d  d-line option: -
35430 62 61 63 6b 73 6c 61 73 68 0a 20 20 20 20 20 20  backslash.      
35440 2a 2a 20 43 61 75 73 65 73 20 43 2d 73 74 79 6c  ** Causes C-styl
35450 65 20 62 61 63 6b 73 6c 61 73 68 20 65 73 63 61  e backslash esca
35460 70 65 73 20 74 6f 20 62 65 20 65 76 61 6c 75 61  pes to be evalua
35470 74 65 64 20 69 6e 20 53 51 4c 20 73 74 61 74 65  ted in SQL state
35480 6d 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 70  ments.      ** p
35490 72 69 6f 72 20 74 6f 20 73 65 6e 64 69 6e 67 20  rior to sending 
354a0 74 68 65 20 53 51 4c 20 69 6e 74 6f 20 53 51 4c  the SQL into SQL
354b0 69 74 65 2e 20 20 55 73 65 66 75 6c 20 66 6f 72  ite.  Useful for
354c0 20 69 6e 6a 65 63 74 69 6e 67 0a 20 20 20 20 20   injecting.     
354d0 20 2a 2a 20 63 72 61 7a 79 20 62 79 74 65 73 20   ** crazy bytes 
354e0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
354f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
35500 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
35510 64 65 62 75 67 67 69 6e 67 2e 0a 20 20 20 20 20  debugging..     
35520 20 2a 2f 0a 20 20 20 20 20 20 53 68 65 6c 6c 53   */.      ShellS
35530 65 74 46 6c 61 67 28 26 64 61 74 61 2c 20 53 48  etFlag(&data, SH
35540 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 29 3b 0a  FLG_Backslash);.
35550 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
35560 72 63 6d 70 28 7a 2c 22 2d 62 61 69 6c 22 29 3d  rcmp(z,"-bail")=
35570 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c  =0 ){.      bail
35580 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 31 3b 0a 20  _on_error = 1;. 
35590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
355a0 63 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22  cmp(z,"-version"
355b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
355c0 69 6e 74 66 28 22 25 73 20 25 73 5c 6e 22 2c 20  intf("%s %s\n", 
355d0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
355e0 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f  on(), sqlite3_so
355f0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 20 20 20  urceid());.     
35600 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
35610 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
35620 7a 2c 22 2d 69 6e 74 65 72 61 63 74 69 76 65 22  z,"-interactive"
35630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  )==0 ){.      st
35640 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
35650 76 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ve = 1;.    }els
35660 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
35670 2d 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20  -batch")==0 ){. 
35680 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e       stdin_is_in
35690 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20  teractive = 0;. 
356a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
356b0 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d 3d  cmp(z,"-heap")==
356c0 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
356d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
356e0 72 63 6d 70 28 7a 2c 22 2d 70 61 67 65 63 61 63  rcmp(z,"-pagecac
356f0 68 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  he")==0 ){.     
35700 20 69 2b 3d 32 3b 0a 20 20 20 20 7d 65 6c 73 65   i+=2;.    }else
35710 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
35720 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d 30 20 29  lookaside")==0 )
35730 7b 0a 20 20 20 20 20 20 69 2b 3d 32 3b 0a 20 20  {.      i+=2;.  
35740 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
35750 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30  mp(z,"-mmap")==0
35760 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
35770 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
35780 63 6d 70 28 7a 2c 22 2d 76 66 73 22 29 3d 3d 30  cmp(z,"-vfs")==0
35790 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23   ){.      i++;.#
357a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
357b0 42 4c 45 5f 56 46 53 54 52 41 43 45 0a 20 20 20  BLE_VFSTRACE.   
357c0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
357d0 70 28 7a 2c 22 2d 76 66 73 74 72 61 63 65 22 29  p(z,"-vfstrace")
357e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
357f0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
35800 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55  SQLITE_ENABLE_MU
35810 4c 54 49 50 4c 45 58 0a 20 20 20 20 7d 65 6c 73  LTIPLEX.    }els
35820 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
35830 2d 6d 75 6c 74 69 70 6c 65 78 22 29 3d 3d 30 20  -multiplex")==0 
35840 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23 65  ){.      i++;.#e
35850 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
35860 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65  f( strcmp(z,"-he
35870 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
35880 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20 20 7d   usage(1);.    }
35890 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
358a0 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30 20 29 7b 0a  z,"-cmd")==0 ){.
358b0 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d        /* Run com
358c0 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  mands that follo
358d0 77 20 2d 63 6d 64 20 66 69 72 73 74 20 61 6e 64  w -cmd first and
358e0 20 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d   separately from
358f0 20 63 6f 6d 6d 61 6e 64 73 0a 20 20 20 20 20 20   commands.      
35900 2a 2a 20 74 68 61 74 20 73 69 6d 70 6c 79 20 61  ** that simply a
35910 70 70 65 61 72 20 6f 6e 20 74 68 65 20 63 6f 6d  ppear on the com
35920 6d 61 6e 64 2d 6c 69 6e 65 2e 20 20 54 68 69 73  mand-line.  This
35930 20 73 65 65 6d 73 20 67 6f 6f 66 79 2e 20 20 49   seems goofy.  I
35940 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 2a 2a  t would.      **
35950 20 62 65 20 62 65 74 74 65 72 20 69 66 20 61 6c   be better if al
35960 6c 20 63 6f 6d 6d 61 6e 64 73 20 72 61 6e 20 69  l commands ran i
35970 6e 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74  n the order that
35980 20 74 68 65 79 20 61 70 70 65 61 72 2e 20 20 42   they appear.  B
35990 75 74 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 72  ut.      ** we r
359a0 65 74 61 69 6e 20 74 68 65 20 67 6f 6f 66 79 20  etain the goofy 
359b0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 68 69 73  behavior for his
359c0 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
359d0 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ility. */.      
359e0 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20  if( i==argc-1 ) 
359f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a 20 3d  break;.      z =
35a00 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f   cmdline_option_
35a10 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
35a20 2b 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ++i);.      if( 
35a30 7a 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  z[0]=='.' ){.   
35a40 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74       rc = do_met
35a50 61 5f 63 6f 6d 6d 61 6e 64 28 7a 2c 20 26 64 61  a_command(z, &da
35a60 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
35a70 20 72 63 20 26 26 20 62 61 69 6c 5f 6f 6e 5f 65   rc && bail_on_e
35a80 72 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72 63  rror ) return rc
35a90 3d 3d 32 20 3f 20 30 20 3a 20 72 63 3b 0a 20 20  ==2 ? 0 : rc;.  
35aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35ab0 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
35ac0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 0);.        rc
35ad0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 64 61   = shell_exec(da
35ae0 74 61 2e 64 62 2c 20 7a 2c 20 73 68 65 6c 6c 5f  ta.db, z, shell_
35af0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
35b00 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
35b10 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 21      if( zErrMsg!
35b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35b30 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35b40 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
35b50 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
35b60 20 20 20 20 20 20 69 66 28 20 62 61 69 6c 5f 6f        if( bail_o
35b70 6e 5f 65 72 72 6f 72 20 29 20 72 65 74 75 72 6e  n_error ) return
35b80 20 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b   rc!=0 ? rc : 1;
35b90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
35ba0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
35bb0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35bc0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
35bd0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65   unable to proce
35be0 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c 6e 22  ss SQL \"%s\"\n"
35bf0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
35c00 69 66 28 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f  if( bail_on_erro
35c10 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  r ) return rc;. 
35c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35c40 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35c50 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a  derr,"%s: Error:
35c60 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a   unknown option:
35c70 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a   %s\n", Argv0, z
35c80 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
35c90 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20  ntf(stderr,"Use 
35ca0 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74  -help for a list
35cb0 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29   of options.\n")
35cc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
35cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 61 74 61  ;.    }.    data
35ce0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
35cf0 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  de;.  }..  if( !
35d00 72 65 61 64 53 74 64 69 6e 20 29 7b 0a 20 20 20  readStdin ){.   
35d10 20 2f 2a 20 52 75 6e 20 61 6c 6c 20 61 72 67 75   /* Run all argu
35d20 6d 65 6e 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  ments that do no
35d30 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 2d 27  t begin with '-'
35d40 20 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65   as if they were
35d50 20 73 65 70 61 72 61 74 65 0a 20 20 20 20 2a 2a   separate.    **
35d60 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 69 6e   command-line in
35d70 70 75 74 73 2c 20 65 78 63 65 70 74 20 66 6f 72  puts, except for
35d80 20 74 68 65 20 61 72 67 54 6f 53 6b 69 70 20 61   the argToSkip a
35d90 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 63 6f  rgument which co
35da0 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 74 68  ntains.    ** th
35db0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
35dc0 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
35dd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 64 3b  for(i=0; i<nCmd;
35de0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
35df0 20 61 7a 43 6d 64 5b 69 5d 5b 30 5d 3d 3d 27 2e   azCmd[i][0]=='.
35e00 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ' ){.        rc 
35e10 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  = do_meta_comman
35e20 64 28 61 7a 43 6d 64 5b 69 5d 2c 20 26 64 61 74  d(azCmd[i], &dat
35e30 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
35e40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3d 3d  rc ) return rc==
35e50 32 20 3f 20 30 20 3a 20 72 63 3b 0a 20 20 20 20  2 ? 0 : rc;.    
35e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35e70 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 2c 20   open_db(&data, 
35e80 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0);.        rc =
35e90 20 73 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61   shell_exec(data
35ea0 2e 64 62 2c 20 61 7a 43 6d 64 5b 69 5d 2c 20 73  .db, azCmd[i], s
35eb0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26  hell_callback, &
35ec0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
35ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
35ee0 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20  rMsg!=0 ){.     
35ef0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35f00 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
35f10 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
35f20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35f30 6e 20 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31  n rc!=0 ? rc : 1
35f40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
35f50 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
35f60 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
35f70 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
35f80 3a 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63  : unable to proc
35f90 65 73 73 20 53 51 4c 3a 20 25 73 5c 6e 22 2c 20  ess SQL: %s\n", 
35fa0 61 7a 43 6d 64 5b 69 5d 29 3b 0a 20 20 20 20 20  azCmd[i]);.     
35fb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35fd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
35fe0 28 61 7a 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65  (azCmd);.  }else
35ff0 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d  {.    /* Run com
36000 6d 61 6e 64 73 20 72 65 63 65 69 76 65 64 20 66  mands received f
36010 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70  rom standard inp
36020 75 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ut.    */.    if
36030 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  ( stdin_is_inter
36040 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  active ){.      
36050 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20  char *zHome;.   
36060 20 20 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72     char *zHistor
36070 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
36080 20 6e 48 69 73 74 6f 72 79 3b 0a 20 20 20 20 20   nHistory;.     
36090 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
360a0 20 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e   "SQLite version
360b0 20 25 73 20 25 2e 31 39 73 5c 6e 22 20 2f 2a 65   %s %.19s\n" /*e
360c0 78 74 72 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66  xtra-version-inf
360d0 6f 2a 2f 0a 20 20 20 20 20 20 20 20 22 45 6e 74  o*/.        "Ent
360e0 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72  er \".help\" for
360f0 20 75 73 61 67 65 20 68 69 6e 74 73 2e 5c 6e 22   usage hints.\n"
36100 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
36110 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
36120 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
36130 28 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ().      );.    
36140 20 20 69 66 28 20 77 61 72 6e 49 6e 6d 65 6d 6f    if( warnInmemo
36150 72 79 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  ryDb ){.        
36160 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 65  printf("Connecte
36170 64 20 74 6f 20 61 20 22 29 3b 0a 20 20 20 20 20  d to a ");.     
36180 20 20 20 70 72 69 6e 74 42 6f 6c 64 28 22 74 72     printBold("tr
36190 61 6e 73 69 65 6e 74 20 69 6e 2d 6d 65 6d 6f 72  ansient in-memor
361a0 79 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  y database");.  
361b0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2e 5c        printf(".\
361c0 6e 55 73 65 20 5c 22 2e 6f 70 65 6e 20 46 49 4c  nUse \".open FIL
361d0 45 4e 41 4d 45 5c 22 20 74 6f 20 72 65 6f 70 65  ENAME\" to reope
361e0 6e 20 6f 6e 20 61 20 22 0a 20 20 20 20 20 20 20  n on a ".       
361f0 20 20 20 20 20 20 20 20 22 70 65 72 73 69 73 74          "persist
36200 65 6e 74 20 64 61 74 61 62 61 73 65 2e 5c 6e 22  ent database.\n"
36210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36220 20 7a 48 6f 6d 65 20 3d 20 66 69 6e 64 5f 68 6f   zHome = find_ho
36230 6d 65 5f 64 69 72 28 30 29 3b 0a 20 20 20 20 20  me_dir(0);.     
36240 20 69 66 28 20 7a 48 6f 6d 65 20 29 7b 0a 20 20   if( zHome ){.  
36250 20 20 20 20 20 20 6e 48 69 73 74 6f 72 79 20 3d        nHistory =
36260 20 73 74 72 6c 65 6e 33 30 28 7a 48 6f 6d 65 29   strlen30(zHome)
36270 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 69   + 20;.        i
36280 66 28 20 28 7a 48 69 73 74 6f 72 79 20 3d 20 6d  f( (zHistory = m
36290 61 6c 6c 6f 63 28 6e 48 69 73 74 6f 72 79 29 29  alloc(nHistory))
362a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
362b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
362c0 66 28 6e 48 69 73 74 6f 72 79 2c 20 7a 48 69 73  f(nHistory, zHis
362d0 74 6f 72 79 2c 22 25 73 2f 2e 73 71 6c 69 74 65  tory,"%s/.sqlite
362e0 5f 68 69 73 74 6f 72 79 22 2c 20 7a 48 6f 6d 65  _history", zHome
362f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36300 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
36310 48 69 73 74 6f 72 79 20 29 7b 20 73 68 65 6c 6c  History ){ shell
36320 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 7a 48  _read_history(zH
36330 69 73 74 6f 72 79 29 3b 20 7d 0a 23 69 66 20 48  istory); }.#if H
36340 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20  AVE_READLINE || 
36350 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 20 20  HAVE_EDITLINE.  
36360 20 20 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64      rl_attempted
36370 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 66 75 6e 63  _completion_func
36380 74 69 6f 6e 20 3d 20 72 65 61 64 6c 69 6e 65 5f  tion = readline_
36390 63 6f 6d 70 6c 65 74 69 6f 6e 3b 0a 23 65 6c 69  completion;.#eli
363a0 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45  f HAVE_LINENOISE
363b0 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65  .      linenoise
363c0 53 65 74 43 6f 6d 70 6c 65 74 69 6f 6e 43 61 6c  SetCompletionCal
363d0 6c 62 61 63 6b 28 6c 69 6e 65 6e 6f 69 73 65 5f  lback(linenoise_
363e0 63 6f 6d 70 6c 65 74 69 6f 6e 29 3b 0a 23 65 6e  completion);.#en
363f0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 70  dif.      rc = p
36400 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61  rocess_input(&da
36410 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ta, 0);.      if
36420 28 20 7a 48 69 73 74 6f 72 79 20 29 7b 0a 20 20  ( zHistory ){.  
36430 20 20 20 20 20 20 73 68 65 6c 6c 5f 73 74 69 66        shell_stif
36440 6c 65 5f 68 69 73 74 6f 72 79 28 32 30 30 30 29  le_history(2000)
36450 3b 0a 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f  ;.        shell_
36460 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48  write_history(zH
36470 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 20  istory);.       
36480 20 66 72 65 65 28 7a 48 69 73 74 6f 72 79 29 3b   free(zHistory);
36490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
364a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
364b0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61  rocess_input(&da
364c0 74 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20  ta, stdin);.    
364d0 7d 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c  }.  }.  set_tabl
364e0 65 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29  e_name(&data, 0)
364f0 3b 0a 20 20 69 66 28 20 64 61 74 61 2e 64 62 20  ;.  if( data.db 
36500 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  ){.    session_c
36510 6c 6f 73 65 5f 61 6c 6c 28 26 64 61 74 61 29 3b  lose_all(&data);
36520 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
36530 73 65 28 64 61 74 61 2e 64 62 29 3b 0a 20 20 7d  se(data.db);.  }
36540 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
36550 64 61 74 61 2e 7a 46 72 65 65 4f 6e 43 6c 6f 73  data.zFreeOnClos
36560 65 29 3b 0a 20 20 66 69 6e 64 5f 68 6f 6d 65 5f  e);.  find_home_
36570 64 69 72 28 31 29 3b 0a 23 69 66 20 21 53 51 4c  dir(1);.#if !SQL
36580 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f 55 54 46  ITE_SHELL_IS_UTF
36590 38 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  8.  for(i=0; i<a
365a0 72 67 63 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65  rgc; i++) sqlite
365b0 33 5f 66 72 65 65 28 61 72 67 76 5b 69 5d 29 3b  3_free(argv[i]);
365c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
365d0 61 72 67 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20  argv);.#endif.  
365e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.