/ Hex Artifact Content
Login

Artifact e17f15b3394206e5f0002267426d03fc4932da40af60a48e409238a8ee6c40ec:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  e3.h".#if SQLITE
06f0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
0700: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
0710: 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e  sqlite3userauth.
0720: 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75  h".#endif.#inclu
0730: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
0740: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0750: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
0760: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
0770: 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c  ed(WIN32).# incl
0780: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0790: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
07a0: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
07b0: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23  d(_WRS_KERNEL).#
07c0: 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68    include <pwd.h
07d0: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69 6e 63 6c  >.# endif.# incl
07e0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
07f0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
0800: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0810: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0820: 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41  h>..#if HAVE_REA
0830: 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  DLINE.# include 
0840: 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69  <readline/readli
0850: 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ne.h>.# include 
0860: 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72  <readline/histor
0870: 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y.h>.#endif..#if
0880: 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 23   HAVE_EDITLINE.#
0890: 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c 69   include <editli
08a0: 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23  ne/readline.h>.#
08b0: 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45 5f  endif..#if HAVE_
08c0: 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56 45  EDITLINE || HAVE
08d0: 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65 66  _READLINE..# def
08e0: 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69  ine shell_add_hi
08f0: 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69 73  story(X) add_his
0900: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0910: 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74   shell_read_hist
0920: 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73 74  ory(X) read_hist
0930: 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ory(X).# define 
0940: 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74  shell_write_hist
0950: 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69 73  ory(X) write_his
0960: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0970: 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69   shell_stifle_hi
0980: 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65 5f  story(X) stifle_
0990: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
09a0: 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69  ine shell_readli
09b0: 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28 58  ne(X) readline(X
09c0: 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  )..#elif HAVE_LI
09d0: 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c 75  NENOISE..# inclu
09e0: 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68 22  de "linenoise.h"
09f0: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
0a00: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20 6c  add_history(X) l
0a10: 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 41  inenoiseHistoryA
0a20: 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  dd(X).# define s
0a30: 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72  hell_read_histor
0a40: 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69  y(X) linenoiseHi
0a50: 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20 64  storyLoad(X).# d
0a60: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74  efine shell_writ
0a70: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0a80: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61 76  enoiseHistorySav
0a90: 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  e(X).# define sh
0aa0: 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f  ell_stifle_histo
0ab0: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0ac0: 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e 28  istorySetMaxLen(
0ad0: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0ae0: 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c 69  l_readline(X) li
0af0: 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c 73  nenoise(X)..#els
0b00: 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  e..# define shel
0b10: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0b20: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b30: 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58  _write_history(X
0b40: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b50: 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28  _stifle_history(
0b60: 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48 45  X)..# define SHE
0b70: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
0b80: 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  LINE 1.#endif...
0b90: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
0ba0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
0bb0: 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65 20  IN32).# include 
0bc0: 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  <io.h>.# include
0bd0: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65 66   <fcntl.h>.# def
0be0: 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f 69  ine isatty(h) _i
0bf0: 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64 65  satty(h).# ifnde
0c00: 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66 69  f access.#  defi
0c10: 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20 5f  ne access(f,m) _
0c20: 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29 0a  access((f),(m)).
0c30: 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66 20  # endif.# undef 
0c40: 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20 70  popen.# define p
0c50: 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75 6e  open _popen.# un
0c60: 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65 66  def pclose.# def
0c70: 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f  ine pclose _pclo
0c80: 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b  se.#else. /* Mak
0c90: 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29 20  e sure isatty() 
0ca0: 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65 2e  has a prototype.
0cb0: 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74 20   */. extern int 
0cc0: 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23 20  isatty(int);..# 
0cd0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54  if !defined(__RT
0ce0: 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64  P__) && !defined
0cf0: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20  (_WRS_KERNEL).  
0d00: 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c  /* popen and pcl
0d10: 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39 20  ose are not C89 
0d20: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f  functions and so
0d30: 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74 69   are.  ** someti
0d40: 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  mes omitted from
0d50: 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68   the <stdio.h> h
0d60: 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74 65  eader */.   exte
0d70: 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28 63  rn FILE *popen(c
0d80: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
0d90: 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74 65   char*);.   exte
0da0: 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46 49  rn int pclose(FI
0db0: 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20  LE*);.# else.#  
0dc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4d  define SQLITE_OM
0dd0: 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e 64  IT_POPEN 1.# end
0de0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  if.#endif..#if d
0df0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
0e00: 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45  E)./* Windows CE
0e10: 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67   (arm-wince-ming
0e20: 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20  w32ce-gcc) does 
0e30: 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61 74  not provide isat
0e40: 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65 20  ty(). * thus we 
0e50: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68  always assume th
0e60: 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f 6e  at we have a con
0e70: 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20 62  sole. That can b
0e80: 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e 20  e. * overridden 
0e90: 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68 20  with the -batch 
0ea0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
0eb0: 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ion.. */.#define
0ec0: 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65 6e   isatty(x) 1.#en
0ed0: 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d 61  dif../* ctype ma
0ee0: 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20 77  cros that work w
0ef0: 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72 61  ith signed chara
0f00: 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cters */.#define
0f10: 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73 73   IsSpace(X)  iss
0f20: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
0f30: 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 49  har)X).#define I
0f40: 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69 67  sDigit(X)  isdig
0f50: 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  it((unsigned cha
0f60: 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f 4c  r)X).#define ToL
0f70: 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29 74  ower(X)  (char)t
0f80: 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  olower((unsigned
0f90: 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64 65   char)X)..#if de
0fa0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
0fb0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
0fc0: 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77  #include <window
0fd0: 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67 20  s.h>../* string 
0fe0: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74 69  conversion routi
0ff0: 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20  nes only needed 
1000: 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74 65  on Win32 */.exte
1010: 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
1020: 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74  _win32_unicode_t
1030: 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29 3b  o_utf8(LPCWSTR);
1040: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
1050: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
1060: 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73  _to_utf8_v2(cons
1070: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
1080: 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c  extern char *sql
1090: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
10a0: 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74  to_mbcs_v2(const
10b0: 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65   char *, int);.e
10c0: 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71 6c  xtern LPWSTR sql
10d0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
10e0: 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74  to_unicode(const
10f0: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a 23   char *zText);.#
1100: 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69 6e  endif../* On Win
1110: 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c  dows, we normall
1120: 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70 75  y run with outpu
1130: 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20 73  t mode of TEXT s
1140: 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61 63  o that \n charac
1150: 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74 6f  ters.** are auto
1160: 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73 6c  matically transl
1170: 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20  ated into \r\n. 
1180: 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 62   However, this b
1190: 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a 2a  ehavior needs.**
11a0: 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
11b0: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28 65  in some cases (e
11c0: 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74 69  x: when generati
11d0: 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61 6e  ng CSV output an
11e0: 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65 72  d when.** render
11f0: 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69 6e  ing quoted strin
1200: 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  gs that contain 
1210: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e 20  \n characters). 
1220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
1230: 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65 20  * routines take 
1240: 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a 2f  care of that..*/
1250: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1260: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1270: 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76 6f  WIN32).static vo
1280: 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  id setBinaryMode
1290: 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e 74  (FILE *file, int
12a0: 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69 66   isOutput){.  if
12b0: 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66 6c  ( isOutput ) ffl
12c0: 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73 65  ush(file);.  _se
12d0: 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66 69  tmode(_fileno(fi
12e0: 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b  le), _O_BINARY);
12f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1300: 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45 20  etTextMode(FILE 
1310: 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74  *file, int isOut
1320: 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75  put){.  if( isOu
1330: 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69  tput ) fflush(fi
1340: 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28  le);.  _setmode(
1350: 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f  _fileno(file), _
1360: 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73 65  O_TEXT);.}.#else
1370: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69 6e  .# define setBin
1380: 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20 64  aryMode(X,Y).# d
1390: 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f 64  efine setTextMod
13a0: 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a 0a  e(X,Y).#endif...
13b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
13c0: 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64 20  imer is enabled 
13d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e  */.static int en
13e0: 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a  ableTimer = 0;..
13f0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  /* Return the cu
1400: 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b  rrent wall-clock
1410: 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20   time */.static 
1420: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69  sqlite3_int64 ti
1430: 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a 20  meOfDay(void){. 
1440: 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
1450: 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20  vfs *clockVfs = 
1460: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
1470: 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63  64 t;.  if( cloc
1480: 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56  kVfs==0 ) clockV
1490: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
14a0: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
14b0: 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69  clockVfs->iVersi
14c0: 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66  on>=2 && clockVf
14d0: 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  s->xCurrentTimeI
14e0: 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt64!=0 ){.    c
14f0: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
1500: 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b  tTimeInt64(clock
1510: 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73  Vfs, &t);.  }els
1520: 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  e{.    double r;
1530: 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  .    clockVfs->x
1540: 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63  CurrentTime(cloc
1550: 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74  kVfs, &r);.    t
1560: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
1570: 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29  4)(r*86400000.0)
1580: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
1590: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
15a0: 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65  d(_WIN32) && !de
15b0: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20  fined(WIN32) && 
15c0: 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75 78  !defined(__minux
15d0: 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  ).#include <sys/
15e0: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
15f0: 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
1600: 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64 6f  >../* VxWorks do
1610: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 67  es not support g
1620: 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66 61  etrusage() as fa
1630: 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74 65  r as we can dete
1640: 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65 66  rmine */.#if def
1650: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
1660: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 52  ) || defined(__R
1670: 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75 73  TP__).struct rus
1680: 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20 74  age {.  struct t
1690: 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65 3b  imeval ru_utime;
16a0: 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69 6d   /* user CPU tim
16b0: 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72 75  e used */.  stru
16c0: 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73 74  ct timeval ru_st
16d0: 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20 43  ime; /* system C
16e0: 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f 0a  PU time used */.
16f0: 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72 75  };.#define getru
1700: 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65 74  sage(A,B) memset
1710: 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29 29  (B,0,sizeof(*B))
1720: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76 65  .#endif../* Save
1730: 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f 72  d resource infor
1740: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62  mation for the b
1750: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f  eginning of an o
1760: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  peration */.stat
1770: 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67 65  ic struct rusage
1780: 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50 55   sBegin;  /* CPU
1790: 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a   time at start *
17a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
17b0: 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20 20  _int64 iBegin;  
17c0: 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  /* Wall-clock ti
17d0: 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 0a  me at start */..
17e0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69  /*.** Begin timi
17f0: 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a  ng an operation.
1800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1810: 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b  eginTimer(void){
1820: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
1830: 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75 73  er ){.    getrus
1840: 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c  age(RUSAGE_SELF,
1850: 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20 69   &sBegin);.    i
1860: 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61  Begin = timeOfDa
1870: 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  y();.  }.}../* R
1880: 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65 72  eturn the differ
1890: 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d 65  ence of two time
18a0: 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f  _structs in seco
18b0: 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f  nds */.static do
18c0: 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73 74  uble timeDiff(st
18d0: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 53  ruct timeval *pS
18e0: 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69 6d  tart, struct tim
18f0: 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72  eval *pEnd){.  r
1900: 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f  eturn (pEnd->tv_
1910: 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74  usec - pStart->t
1920: 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30 31  v_usec)*0.000001
1930: 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f 75   +.         (dou
1940: 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65  ble)(pEnd->tv_se
1950: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 73  c - pStart->tv_s
1960: 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ec);.}../*.** Pr
1970: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
1980: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
1990: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
19a0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
19b0: 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20 20  bleTimer ){.    
19c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
19d0: 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  nd = timeOfDay()
19e0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 73  ;.    struct rus
19f0: 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67 65  age sEnd;.    ge
1a00: 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53  trusage(RUSAGE_S
1a10: 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20  ELF, &sEnd);.   
1a20: 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d   printf("Run Tim
1a30: 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65  e: real %.3f use
1a40: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
1a50: 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20 69         (iEnd - i
1a60: 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20  Begin)*0.001,.  
1a70: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73       timeDiff(&s
1a80: 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20  Begin.ru_utime, 
1a90: 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c  &sEnd.ru_utime),
1aa0: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
1ab0: 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d  (&sBegin.ru_stim
1ac0: 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d  e, &sEnd.ru_stim
1ad0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66  e));.  }.}..#def
1ae0: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
1af0: 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65  beginTimer().#de
1b00: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65  fine END_TIMER e
1b10: 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  ndTimer().#defin
1b20: 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23  e HAS_TIMER 1..#
1b30: 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57  elif (defined(_W
1b40: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1b50: 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61 76  (WIN32))../* Sav
1b60: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1b70: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1b90: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1ba0: 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f 63  tic HANDLE hProc
1bb0: 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  ess;.static FILE
1bc0: 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65 67  TIME ftKernelBeg
1bd0: 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 54  in;.static FILET
1be0: 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e 3b  IME ftUserBegin;
1bf0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1c00: 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67 69  int64 ftWallBegi
1c10: 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20  n;.typedef BOOL 
1c20: 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43  (WINAPI *GETPROC
1c30: 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c  TIMES)(HANDLE, L
1c40: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
1c50: 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20 20  ETIME,.         
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49 4c             LPFIL
1c80: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1c90: 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50 52  E);.static GETPR
1ca0: 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63 65  OCTIMES getProce
1cb0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e 55  ssTimesAddr = NU
1cc0: 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  LL;../*.** Check
1cd0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68 61   to see if we ha
1ce0: 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72 74  ve timer support
1cf0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 6e  .  Return 1 if n
1d00: 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70 70  ecessary.** supp
1d10: 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66 6f  ort found (or fo
1d20: 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29 2e  und previously).
1d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1d40: 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  asTimer(void){. 
1d50: 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73 54   if( getProcessT
1d60: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
1d70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65 6c  return 1;.  } el
1d80: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74 50  se {.    /* GetP
1d90: 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69 73  rocessTimes() is
1da0: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  n't supported in
1db0: 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65 20   WIN95 and some 
1dc0: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20 20  other Windows.  
1dd0: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20 53    ** versions. S
1de0: 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69 6f  ee if the versio
1df0: 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  n we are running
1e00: 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64 20   on has it, and 
1e10: 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  if it.    ** doe
1e20: 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70 6f  s, save off a po
1e30: 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64 20  inter to it and 
1e40: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
1e50: 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ess handle..    
1e60: 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73 20  */.    hProcess 
1e70: 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  = GetCurrentProc
1e80: 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20 68  ess();.    if( h
1e90: 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20 20  Process ){.     
1ea0: 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73 74   HINSTANCE hinst
1eb0: 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72  Lib = LoadLibrar
1ec0: 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33 32  y(TEXT("Kernel32
1ed0: 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20 69  .dll"));.      i
1ee0: 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73 74  f( NULL != hinst
1ef0: 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20 67  Lib ){.        g
1f00: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
1f10: 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  dr =.           
1f20: 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20   (GETPROCTIMES) 
1f30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68  GetProcAddress(h
1f40: 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f  instLib, "GetPro
1f50: 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20  cessTimes");.   
1f60: 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d       if( NULL !=
1f70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1f80: 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Addr ){.        
1f90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72      }.        Fr
1fb0: 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c  eeLibrary(hinstL
1fc0: 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ib);.      }.   
1fd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1fe0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  0;.}../*.** Begi
1ff0: 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72  n timing an oper
2000: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
2010: 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72 28  void beginTimer(
2020: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2030: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2040: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
2050: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2060: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2070: 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63 65  it;.    getProce
2080: 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72 6f  ssTimesAddr(hPro
2090: 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f 6e  cess,&ftCreation
20a0: 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20 20  ,&ftExit,.      
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e    &ftKernelBegin
20d0: 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b 0a  ,&ftUserBegin);.
20e0: 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e 20      ftWallBegin 
20f0: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2100: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20   }.}../* Return 
2110: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f  the difference o
2120: 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20 73  f two FILETIME s
2130: 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64  tructs in second
2140: 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  s */.static doub
2150: 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c 45  le timeDiff(FILE
2160: 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46 49  TIME *pStart, FI
2170: 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20  LETIME *pEnd){. 
2180: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36   sqlite_int64 i6
2190: 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c 69  4Start = *((sqli
21a0: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74 61  te_int64 *) pSta
21b0: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  rt);.  sqlite_in
21c0: 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28 28  t64 i64End = *((
21d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20  sqlite_int64 *) 
21e0: 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pEnd);.  return 
21f0: 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45 6e  (double) ((i64En
2200: 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f 20  d - i64Start) / 
2210: 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a  10000000.0);.}..
2220: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
2230: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
2240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
2250: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
2260: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
2270: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
2280: 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46 49  mesAddr){.    FI
2290: 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f  LETIME ftCreatio
22a0: 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65 72  n, ftExit, ftKer
22b0: 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45 6e  nelEnd, ftUserEn
22c0: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  d;.    sqlite3_i
22d0: 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20 3d  nt64 ftWallEnd =
22e0: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
22f0: 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65    getProcessTime
2300: 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26  sAddr(hProcess,&
2310: 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78  ftCreation,&ftEx
2320: 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it,&ftKernelEnd,
2330: 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20 20  &ftUserEnd);.   
2340: 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d   printf("Run Tim
2350: 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65  e: real %.3f use
2360: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
2370: 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45 6e         (ftWallEn
2380: 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e 29  d - ftWallBegin)
2390: 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74  *0.001,.       t
23a0: 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72 42  imeDiff(&ftUserB
23b0: 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e 64  egin, &ftUserEnd
23c0: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
23d0: 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67 69  ff(&ftKernelBegi
23e0: 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64 29  n, &ftKernelEnd)
23f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e  );.  }.}..#defin
2400: 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65  e BEGIN_TIMER be
2410: 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69  ginTimer().#defi
2420: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64  ne END_TIMER end
2430: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
2440: 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69 6d  HAS_TIMER hasTim
2450: 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65 66  er()..#else.#def
2460: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 0a  ine BEGIN_TIMER.
2470: 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45  #define END_TIME
2480: 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  R.#define HAS_TI
2490: 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  MER 0.#endif../*
24a0: 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65 76  .** Used to prev
24b0: 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ent warnings abo
24c0: 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
24d0: 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ters.*/.#define 
24e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24f0: 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a 2f  (x) (void)(x)../
2500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c  *.** If the foll
2510: 6f 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65  owing flag is se
2520: 74 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20  t, then command 
2530: 65 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a  execution stops.
2540: 2a 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69  ** at an error i
2550: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74  f we are not int
2560: 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  eractive..*/.sta
2570: 74 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f  tic int bail_on_
2580: 65 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  error = 0;../*.*
2590: 2a 20 54 68 72 65 61 74 20 73 74 64 69 6e 20 61  * Threat stdin a
25a0: 73 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65  s an interactive
25b0: 20 69 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f   input if the fo
25c0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
25d0: 0a 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74  .** is true.  Ot
25e0: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
25f0: 73 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74  stdin is connect
2600: 65 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20  ed to a file or 
2610: 70 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pipe..*/.static 
2620: 69 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  int stdin_is_int
2630: 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f  eractive = 1;../
2640: 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20  *.** On Windows 
2650: 73 79 73 74 65 6d 73 20 77 65 20 68 61 76 65 20  systems we have 
2660: 74 6f 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64  to know if stand
2670: 61 72 64 20 6f 75 74 70 75 74 20 69 73 20 61 20  ard output is a 
2680: 63 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72  console.** in or
2690: 64 65 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  der to translate
26a0: 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53   UTF-8 into MBCS
26b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
26c0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
26d0: 74 72 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74  true if translat
26e0: 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2700: 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65  tdout_is_console
2710: 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   = 1;../*.** The
2720: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68   following is th
2730: 65 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61  e open SQLite da
2740: 74 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65  tabase.  We make
2750: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
2760: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61   this database a
2770: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
2780: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
2790: 62 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62  be accessed.** b
27a0: 79 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e  y the SIGINT han
27b0: 64 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70  dler to interrup
27c0: 74 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65  t database proce
27d0: 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
27e0: 20 73 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c   sqlite3 *global
27f0: 44 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Db = 0;../*.** T
2800: 72 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72  rue if an interr
2810: 75 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20  upt (Control-C) 
2820: 68 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65  has been receive
2830: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c  d..*/.static vol
2840: 61 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e  atile int seenIn
2850: 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a  terrupt = 0;../*
2860: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2870: 6e 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67  name of our prog
2880: 72 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69  ram. It is set i
2890: 6e 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a  n main(), used.*
28a0: 2a 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66  * in a number of
28b0: 20 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d   other places, m
28c0: 6f 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20  ostly for error 
28d0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
28e0: 74 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b  tic char *Argv0;
28f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73  ../*.** Prompt s
2900: 74 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69  trings. Initiali
2910: 7a 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74  zed in main. Set
2920: 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20  table with.**   
2930: 2e 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e  .prompt main con
2940: 74 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  tinue.*/.static 
2950: 63 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b  char mainPrompt[
2960: 32 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73  20];     /* Firs
2970: 74 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64  t line prompt. d
2980: 65 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e  efault: "sqlite>
2990: 20 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72   "*/.static char
29a0: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b   continuePrompt[
29b0: 32 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61  20]; /* Continua
29c0: 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66  tion prompt. def
29d0: 61 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22  ault: "   ...> "
29e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65   */../*.** Rende
29f0: 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70  r output like fp
2a00: 72 69 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74  rintf().  Except
2a10: 2c 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  , if the output 
2a20: 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a  is going to the.
2a30: 2a 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69  ** console and i
2a40: 66 20 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e  f this is runnin
2a50: 67 20 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d  g on a Windows m
2a60: 61 63 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74  achine, translat
2a70: 65 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  e the.** output 
2a80: 66 72 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20  from UTF-8 into 
2a90: 4d 42 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  MBCS..*/.#if def
2aa0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
2ab0: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76  defined(WIN32).v
2ac0: 6f 69 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28  oid utf8_printf(
2ad0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
2ae0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2af0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2b00: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
2b10: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69  p, zFormat);.  i
2b20: 66 28 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e  f( stdout_is_con
2b30: 73 6f 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74  sole && (out==st
2b40: 64 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64  dout || out==std
2b50: 65 72 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72  err) ){.    char
2b60: 20 2a 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76   *z1 = sqlite3_v
2b70: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
2b80: 20 61 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a   ap);.    char *
2b90: 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  z2 = sqlite3_win
2ba0: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
2bb0: 76 32 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73  v2(z1, 0);.    s
2bc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b  qlite3_free(z1);
2bd0: 0a 20 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f  .    fputs(z2, o
2be0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
2bf0: 5f 66 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c  _free(z2);.  }el
2c00: 73 65 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66  se{.    vfprintf
2c10: 28 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  (out, zFormat, a
2c20: 70 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64  p);.  }.  va_end
2c30: 28 61 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64  (ap);.}.#elif !d
2c40: 65 66 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e  efined(utf8_prin
2c50: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66  tf).# define utf
2c60: 38 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66  8_printf fprintf
2c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2c80: 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b  ender output lik
2c90: 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68  e fprintf().  Th
2ca0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
2cb0: 20 75 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e   used on anythin
2cc0: 67 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64  g that.** includ
2cd0: 65 73 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74  es string format
2ce0: 74 69 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29  ting (e.g. "%s")
2cf0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
2d00: 64 28 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20  d(raw_printf).# 
2d10: 64 65 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74  define raw_print
2d20: 66 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66  f fprintf.#endif
2d30: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2d40: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2d50: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2d60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2d70: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
2d80: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
2d90: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
2da0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
2db0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
2dc0: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
2dd0: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
2de0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
2df0: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
2e00: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
2e10: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
2e20: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
2e30: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
2e40: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
2e50: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
2e60: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
2e70: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
2e80: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
2e90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ea0: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
2eb0: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
2ec0: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
2ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ee0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2ef0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2f00: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
2f10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
2f20: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2f30: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
2f40: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2f50: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2f60: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
2f70: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
2f80: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
2f90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
2fa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
2fb0: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
2fc0: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
2fd0: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
2fe0: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
2ff0: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3000: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3010: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
3020: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
3030: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
3040: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
3050: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
3060: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
3070: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3080: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3090: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
30a0: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
30b0: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
30c0: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
30d0: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
30e0: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
30f0: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3100: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3110: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
3120: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
3130: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
3140: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
3150: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
3160: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
3170: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3180: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3190: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
31a0: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
31b0: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
31c0: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
31d0: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
31e0: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
31f0: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3200: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3230: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
3240: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
3250: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
3260: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
3270: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3280: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3290: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
32a0: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
32b0: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
32c0: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
32d0: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
32e0: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
32f0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3300: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3310: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
3320: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
3330: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
3340: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
3350: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
3360: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
3370: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3380: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3390: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
33a0: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
33b0: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
33c0: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
33d0: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
33e0: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
33f0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3400: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3410: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
3420: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
3430: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
3440: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
3450: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
3460: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
3470: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3480: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3490: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
34a0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
34b0: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
34c0: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
34d0: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
34e0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
34f0: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3500: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3510: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
3520: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
3530: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
3540: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
3550: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
3560: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
3570: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3580: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3590: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
35a0: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
35b0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
35c0: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
35d0: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
35e0: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
35f0: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3600: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3620: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
3630: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
3640: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
3650: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
3660: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
3670: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3680: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3690: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
36a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
36b0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
36c0: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
36d0: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
36e0: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
36f0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3700: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3710: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
3720: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
3730: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
3740: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
3750: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
3760: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
3770: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3780: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3790: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
37a0: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
37b0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
37c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
37d0: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
37e0: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
37f0: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3800: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3810: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3820: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3830: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3840: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3850: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3860: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3870: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3880: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3890: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
38a0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
38b0: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
38c0: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
38d0: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
38e0: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
38f0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3900: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3910: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3920: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
3930: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
3940: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
3950: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
3960: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
3970: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
3980: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
3990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
39a0: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
39b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
39c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
39d0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e  le( zLine[n] ) n
39e0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20  ++;.    if( n>0 
39f0: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
3a00: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d  \n' ){.      n--
3a10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
3a20: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
3a30: 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  \r' ) n--;.     
3a40: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
3a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a60: 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
3a70: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3a80: 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a  ined(WIN32).  /*
3a90: 20 46 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65   For interactive
3aa0: 20 69 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77   input on Window
3ab0: 73 20 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73  s systems, trans
3ac0: 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75  late the.  ** mu
3ad0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
3ae0: 65 72 73 65 74 20 63 68 61 72 61 63 74 65 72 73  erset characters
3af0: 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a   into UTF-8. */.
3b00: 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69    if( stdin_is_i
3b10: 6e 74 65 72 61 63 74 69 76 65 20 26 26 20 69 6e  nteractive && in
3b20: 3d 3d 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63  ==stdin ){.    c
3b30: 68 61 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71  har *zTrans = sq
3b40: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
3b50: 5f 74 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e  _to_utf8_v2(zLin
3b60: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, 0);.    if( z
3b70: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69  Trans ){.      i
3b80: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c  nt nTrans = strl
3b90: 65 6e 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a  en30(zTrans)+1;.
3ba0: 20 20 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73        if( nTrans
3bb0: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3bc0: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
3bd0: 63 28 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29  c(zLine, nTrans)
3be0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c  ;.        if( zL
3bf0: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
3c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3c10: 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20  (zTrans);.      
3c20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3c40: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69        memcpy(zLi
3c50: 6e 65 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61  ne, zTrans, nTra
3c60: 6e 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ns);.      sqlit
3c70: 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b  e3_free(zTrans);
3c80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
3c90: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49  f /* defined(_WI
3ca0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
3cb0: 57 49 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75  WIN32) */.  retu
3cc0: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zLine;.}../*.
3cd0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 73 69  ** Retrieve a si
3ce0: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
3cf0: 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49  ut text..**.** I
3d00: 66 20 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61  f in==0 then rea
3d10: 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
3d20: 69 6e 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74  input and prompt
3d30: 20 62 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e   before each lin
3d40: 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69  e..** If isConti
3d50: 6e 75 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c  nuation is true,
3d60: 20 74 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61   then a continua
3d70: 74 69 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61  tion prompt is a
3d80: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49  ppropriate..** I
3d90: 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  f isContinuation
3da0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
3db0: 68 65 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73  he main prompt s
3dc0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a  hould be used..*
3dd0: 2a 0a 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69  *.** If zPrior i
3de0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
3df0: 69 74 20 69 73 20 61 20 62 75 66 66 65 72 20 66  it is a buffer f
3e00: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  rom a prior call
3e10: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   to this.** rout
3e20: 69 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ine that can be 
3e30: 72 65 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reused..**.** Th
3e40: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3e50: 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61  ed in space obta
3e60: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
3e70: 28 29 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68  () and must eith
3e80: 65 72 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  er.** be freed b
3e90: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20  y the caller or 
3ea0: 65 6c 73 65 20 70 61 73 73 65 64 20 62 61 63 6b  else passed back
3eb0: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
3ec0: 6e 65 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50  ne via the.** zP
3ed0: 72 69 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f  rior argument fo
3ee0: 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  r reuse..*/.stat
3ef0: 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70  ic char *one_inp
3f00: 75 74 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e  ut_line(FILE *in
3f10: 2c 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20  , char *zPrior, 
3f20: 69 6e 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  int isContinuati
3f30: 6f 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72  on){.  char *zPr
3f40: 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ompt;.  char *zR
3f50: 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21  esult;.  if( in!
3f60: 3d 30 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  =0 ){.    zResul
3f70: 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  t = local_getlin
3f80: 65 28 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20  e(zPrior, in);. 
3f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
3fa0: 6d 70 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61  mpt = isContinua
3fb0: 74 69 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50  tion ? continueP
3fc0: 72 6f 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d  rompt : mainProm
3fd0: 70 74 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53  pt;.#if SHELL_US
3fe0: 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a  E_LOCAL_GETLINE.
3ff0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c      printf("%s",
4000: 20 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66   zPrompt);.    f
4010: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
4020: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63     zResult = loc
4030: 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f  al_getline(zPrio
4040: 72 2c 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65  r, stdin);.#else
4050: 0a 20 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72  .    free(zPrior
4060: 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  );.    zResult =
4070: 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28   shell_readline(
4080: 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66  zPrompt);.    if
4090: 28 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52  ( zResult && *zR
40a0: 65 73 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64  esult ) shell_ad
40b0: 64 5f 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c  d_history(zResul
40c0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  t);.#endif.  }. 
40d0: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b   return zResult;
40e0: 0a 7d 0a 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61  .}./*.** A varia
40f0: 62 6c 65 20 6c 65 6e 67 74 68 20 73 74 72 69 6e  ble length strin
4100: 67 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 63  g to which one c
4110: 61 6e 20 61 70 70 65 6e 64 20 74 65 78 74 2e 0a  an append text..
4120: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4130: 74 20 53 68 65 6c 6c 54 65 78 74 20 53 68 65 6c  t ShellText Shel
4140: 6c 54 65 78 74 3b 0a 73 74 72 75 63 74 20 53 68  lText;.struct Sh
4150: 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63 68 61 72  ellText {.  char
4160: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
4170: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a  int nAlloc;.};..
4180: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
4190: 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 53   and destroy a S
41a0: 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a  hellText object.
41b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
41c0: 6e 69 74 54 65 78 74 28 53 68 65 6c 6c 54 65 78  nitText(ShellTex
41d0: 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  t *p){.  memset(
41e0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
41f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4200: 20 66 72 65 65 54 65 78 74 28 53 68 65 6c 6c 54   freeText(ShellT
4210: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 28  ext *p){.  free(
4220: 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78  p->z);.  initTex
4230: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20  t(p);.}../* zIn 
4240: 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
4250: 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65  ter to a NULL-te
4260: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
4270: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4280: 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ed.** from mallo
4290: 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70  c(), or a NULL p
42a0: 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69  ointer. The stri
42b0: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
42c0: 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61   zAppend is.** a
42d0: 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64  dded to zIn, and
42e0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75   the result retu
42f0: 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  rned in memory o
4300: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
4310: 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69  loc()..** zIn, i
4320: 66 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c  f it was not NUL
4330: 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a  L, is freed..**.
4340: 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
4350: 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c  argument, quote,
4360: 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68   is not '\0', th
4370: 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73  en it is used as
4380: 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72   a.** quote char
4390: 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e  acter for zAppen
43a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
43b0: 64 20 61 70 70 65 6e 64 54 65 78 74 28 53 68 65  d appendText(She
43c0: 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68 61 72 20  llText *p, char 
43d0: 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20  const *zAppend, 
43e0: 63 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69  char quote){.  i
43f0: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b  nt len;.  int i;
4400: 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d  .  int nAppend =
4410: 20 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e   strlen30(zAppen
4420: 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70  d);..  len = nAp
4430: 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69  pend+p->n+1;.  i
4440: 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  f( quote ){.    
4450: 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f  len += 2;.    fo
4460: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4480: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
4490: 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20  ote ) len++;.   
44a0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
44b0: 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f  >n+len>=p->nAllo
44c0: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
44d0: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
44e0: 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20   + len + 20;.   
44f0: 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28   p->z = realloc(
4500: 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
4510: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  ;.    if( p->z==
4520: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
4530: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
4540: 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
4550: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
4560: 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20  if( quote ){.   
4570: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d   char *zCsr = p-
4580: 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43  >z+p->n;.    *zC
4590: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
45a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70    for(i=0; i<nAp
45b0: 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pend; i++){.    
45c0: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70    *zCsr++ = zApp
45d0: 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  end[i];.      if
45e0: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
45f0: 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  ote ) *zCsr++ = 
4600: 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  quote;.    }.   
4610: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
4620: 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e  ;.    p->n = (in
4630: 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b  t)(zCsr - p->z);
4640: 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30  .    *zCsr = '\0
4650: 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ';.  }else{.    
4660: 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e  memcpy(p->z+p->n
4670: 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65  , zAppend, nAppe
4680: 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d  nd);.    p->n +=
4690: 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d   nAppend;.    p-
46a0: 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b  >z[p->n] = '\0';
46b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
46c0: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
46d0: 6e 65 20 69 66 20 69 64 65 6e 74 69 66 69 65 72  ne if identifier
46e0: 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20 74 6f 20   zName needs to 
46f0: 62 65 20 71 75 6f 74 65 64 2c 20 65 69 74 68 65  be quoted, eithe
4700: 72 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20  r.** because it 
4710: 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70  contains non-alp
4720: 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  hanumeric charac
4730: 74 65 72 73 2c 20 6f 72 20 62 65 63 61 75 73 65  ters, or because
4740: 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c   it is an.** SQL
4750: 69 74 65 20 6b 65 79 77 6f 72 64 2e 20 20 42 65  ite keyword.  Be
4760: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69 6e   conservative in
4770: 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 3a 20   this estimate: 
4780: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 61   When in doubt a
4790: 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75  ssume.** that qu
47a0: 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  oting is require
47b0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
47c0: 27 22 27 20 69 66 20 71 75 6f 74 69 6e 67 20 69  '"' if quoting i
47d0: 73 20 72 65 71 75 69 72 65 64 2e 20 20 52 65 74  s required.  Ret
47e0: 75 72 6e 20 30 20 69 66 20 6e 6f 20 71 75 6f 74  urn 0 if no quot
47f0: 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e  ing is required.
4800: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4810: 71 75 6f 74 65 43 68 61 72 28 63 6f 6e 73 74 20  quoteChar(const 
4820: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4830: 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65 20 6b 65  /* All SQLite ke
4840: 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c 70 68 61  ywords, in alpha
4850: 62 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f  betical order */
4860: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
4870: 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f 72 64 73  char *azKeywords
4880: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41 42 4f 52  [] = {.    "ABOR
4890: 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c 20 22 41  T", "ACTION", "A
48a0: 44 44 22 2c 20 22 41 46 54 45 52 22 2c 20 22 41  DD", "AFTER", "A
48b0: 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c 20 22 41  LL", "ALTER", "A
48c0: 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44 22 2c 20  NALYZE", "AND", 
48d0: 22 41 53 22 2c 0a 20 20 20 20 22 41 53 43 22 2c  "AS",.    "ASC",
48e0: 20 22 41 54 54 41 43 48 22 2c 20 22 41 55 54 4f   "ATTACH", "AUTO
48f0: 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22 42 45 46  INCREMENT", "BEF
4900: 4f 52 45 22 2c 20 22 42 45 47 49 4e 22 2c 20 22  ORE", "BEGIN", "
4910: 42 45 54 57 45 45 4e 22 2c 20 22 42 59 22 2c 0a  BETWEEN", "BY",.
4920: 20 20 20 20 22 43 41 53 43 41 44 45 22 2c 20 22      "CASCADE", "
4930: 43 41 53 45 22 2c 20 22 43 41 53 54 22 2c 20 22  CASE", "CAST", "
4940: 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c 41 54 45  CHECK", "COLLATE
4950: 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20 22 43 4f  ", "COLUMN", "CO
4960: 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43 4f 4e 46  MMIT",.    "CONF
4970: 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54 52 41 49  LICT", "CONSTRAI
4980: 4e 54 22 2c 20 22 43 52 45 41 54 45 22 2c 20 22  NT", "CREATE", "
4990: 43 52 4f 53 53 22 2c 20 22 43 55 52 52 45 4e 54  CROSS", "CURRENT
49a0: 5f 44 41 54 45 22 2c 0a 20 20 20 20 22 43 55 52  _DATE",.    "CUR
49b0: 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22 43 55 52  RENT_TIME", "CUR
49c0: 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 22 2c  RENT_TIMESTAMP",
49d0: 20 22 44 41 54 41 42 41 53 45 22 2c 20 22 44 45   "DATABASE", "DE
49e0: 46 41 55 4c 54 22 2c 20 22 44 45 46 45 52 52 41  FAULT", "DEFERRA
49f0: 42 4c 45 22 2c 0a 20 20 20 20 22 44 45 46 45 52  BLE",.    "DEFER
4a00: 52 45 44 22 2c 20 22 44 45 4c 45 54 45 22 2c 20  RED", "DELETE", 
4a10: 22 44 45 53 43 22 2c 20 22 44 45 54 41 43 48 22  "DESC", "DETACH"
4a20: 2c 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 44  , "DISTINCT", "D
4a30: 52 4f 50 22 2c 20 22 45 41 43 48 22 2c 0a 20 20  ROP", "EACH",.  
4a40: 20 20 22 45 4c 53 45 22 2c 20 22 45 4e 44 22 2c    "ELSE", "END",
4a50: 20 22 45 53 43 41 50 45 22 2c 20 22 45 58 43 45   "ESCAPE", "EXCE
4a60: 50 54 22 2c 20 22 45 58 43 4c 55 53 49 56 45 22  PT", "EXCLUSIVE"
4a70: 2c 20 22 45 58 49 53 54 53 22 2c 20 22 45 58 50  , "EXISTS", "EXP
4a80: 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46 41 49 4c  LAIN",.    "FAIL
4a90: 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f 52 45 49  ", "FOR", "FOREI
4aa0: 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20 22 46 55  GN", "FROM", "FU
4ab0: 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20 22 47 52  LL", "GLOB", "GR
4ac0: 4f 55 50 22 2c 20 22 48 41 56 49 4e 47 22 2c 20  OUP", "HAVING", 
4ad0: 22 49 46 22 2c 0a 20 20 20 20 22 49 47 4e 4f 52  "IF",.    "IGNOR
4ae0: 45 22 2c 20 22 49 4d 4d 45 44 49 41 54 45 22 2c  E", "IMMEDIATE",
4af0: 20 22 49 4e 22 2c 20 22 49 4e 44 45 58 22 2c 20   "IN", "INDEX", 
4b00: 22 49 4e 44 45 58 45 44 22 2c 20 22 49 4e 49 54  "INDEXED", "INIT
4b10: 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45 52 22 2c  IALLY", "INNER",
4b20: 0a 20 20 20 20 22 49 4e 53 45 52 54 22 2c 20 22  .    "INSERT", "
4b30: 49 4e 53 54 45 41 44 22 2c 20 22 49 4e 54 45 52  INSTEAD", "INTER
4b40: 53 45 43 54 22 2c 20 22 49 4e 54 4f 22 2c 20 22  SECT", "INTO", "
4b50: 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22 2c 20 22  IS", "ISNULL", "
4b60: 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c 0a 20 20  JOIN", "KEY",.  
4b70: 20 20 22 4c 45 46 54 22 2c 20 22 4c 49 4b 45 22    "LEFT", "LIKE"
4b80: 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d 41 54 43  , "LIMIT", "MATC
4b90: 48 22 2c 20 22 4e 41 54 55 52 41 4c 22 2c 20 22  H", "NATURAL", "
4ba0: 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22 4e 4f 54  NO", "NOT", "NOT
4bb0: 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e 55 4c 4c  NULL",.    "NULL
4bc0: 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46 53 45 54  ", "OF", "OFFSET
4bd0: 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22 2c 20 22  ", "ON", "OR", "
4be0: 4f 52 44 45 52 22 2c 20 22 4f 55 54 45 52 22 2c  ORDER", "OUTER",
4bf0: 20 22 50 4c 41 4e 22 2c 20 22 50 52 41 47 4d 41   "PLAN", "PRAGMA
4c00: 22 2c 0a 20 20 20 20 22 50 52 49 4d 41 52 59 22  ",.    "PRIMARY"
4c10: 2c 20 22 51 55 45 52 59 22 2c 20 22 52 41 49 53  , "QUERY", "RAIS
4c20: 45 22 2c 20 22 52 45 43 55 52 53 49 56 45 22 2c  E", "RECURSIVE",
4c30: 20 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20 22   "REFERENCES", "
4c40: 52 45 47 45 58 50 22 2c 0a 20 20 20 20 22 52 45  REGEXP",.    "RE
4c50: 49 4e 44 45 58 22 2c 20 22 52 45 4c 45 41 53 45  INDEX", "RELEASE
4c60: 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20 22 52 45  ", "RENAME", "RE
4c70: 50 4c 41 43 45 22 2c 20 22 52 45 53 54 52 49 43  PLACE", "RESTRIC
4c80: 54 22 2c 20 22 52 49 47 48 54 22 2c 0a 20 20 20  T", "RIGHT",.   
4c90: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 52 4f   "ROLLBACK", "RO
4ca0: 57 22 2c 20 22 53 41 56 45 50 4f 49 4e 54 22 2c  W", "SAVEPOINT",
4cb0: 20 22 53 45 4c 45 43 54 22 2c 20 22 53 45 54 22   "SELECT", "SET"
4cc0: 2c 20 22 54 41 42 4c 45 22 2c 20 22 54 45 4d 50  , "TABLE", "TEMP
4cd0: 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f 52 41 52  ",.    "TEMPORAR
4ce0: 59 22 2c 20 22 54 48 45 4e 22 2c 20 22 54 4f 22  Y", "THEN", "TO"
4cf0: 2c 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c  , "TRANSACTION",
4d00: 20 22 54 52 49 47 47 45 52 22 2c 20 22 55 4e 49   "TRIGGER", "UNI
4d10: 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22 2c 0a 20  ON", "UNIQUE",. 
4d20: 20 20 20 22 55 50 44 41 54 45 22 2c 20 22 55 53     "UPDATE", "US
4d30: 49 4e 47 22 2c 20 22 56 41 43 55 55 4d 22 2c 20  ING", "VACUUM", 
4d40: 22 56 41 4c 55 45 53 22 2c 20 22 56 49 45 57 22  "VALUES", "VIEW"
4d50: 2c 20 22 56 49 52 54 55 41 4c 22 2c 20 22 57 48  , "VIRTUAL", "WH
4d60: 45 4e 22 2c 20 22 57 48 45 52 45 22 2c 0a 20 20  EN", "WHERE",.  
4d70: 20 20 22 57 49 54 48 22 2c 20 22 57 49 54 48 4f    "WITH", "WITHO
4d80: 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  UT",.  };.  int 
4d90: 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20 6d 69 64  i, lwr, upr, mid
4da0: 2c 20 63 3b 0a 20 20 69 66 28 20 21 69 73 61 6c  , c;.  if( !isal
4db0: 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68  pha((unsigned ch
4dc0: 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20  ar)zName[0]) && 
4dd0: 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20  zName[0]!='_' ) 
4de0: 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f  return '"';.  fo
4df0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
4e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
4e10: 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65  isalnum((unsigne
4e20: 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29  d char)zName[i])
4e30: 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f   && zName[i]!='_
4e40: 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  ' ) return '"';.
4e50: 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20    }.  lwr = 0;. 
4e60: 20 75 70 72 20 3d 20 73 69 7a 65 6f 66 28 61 7a   upr = sizeof(az
4e70: 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  Keywords)/sizeof
4e80: 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30 5d 29 20  (azKeywords[0]) 
4e90: 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  - 1;.  while( lw
4ea0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
4eb0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
4ec0: 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
4ed0: 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65 79 77 6f  _stricmp(azKeywo
4ee0: 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61 6d 65 29  rds[mid], zName)
4ef0: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29  ;.    if( c==0 )
4f00: 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 20   return '"';.   
4f10: 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
4f20: 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31 3b 0a 20    lwr = mid+1;. 
4f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f40: 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20  upr = mid-1;.   
4f50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4f60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  0;.}../*.** Cons
4f70: 74 72 75 63 74 20 61 20 66 61 6b 65 20 6f 62 6a  truct a fake obj
4f80: 65 63 74 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ect name and col
4f90: 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64 65 73 63  umn list to desc
4fa0: 72 69 62 65 20 74 68 65 20 73 74 72 75 63 74 75  ribe the structu
4fb0: 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 65  re.** of the vie
4fc0: 77 2c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  w, virtual table
4fd0: 2c 20 6f 72 20 74 61 62 6c 65 20 76 61 6c 75 65  , or table value
4fe0: 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53 63 68 65  d function zSche
4ff0: 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ma.zName..*/.sta
5000: 74 69 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 46  tic char *shellF
5010: 61 6b 65 53 63 68 65 6d 61 28 0a 20 20 73 71 6c  akeSchema(.  sql
5020: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
5030: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5040: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5050: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
5060: 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tab */.  const c
5070: 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20  har *zSchema,   
5080: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
5090: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
50a0: 6e 67 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20  ng the vtab */. 
50b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
50c0: 6d 65 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me       /* The 
50d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  name of the virt
50e0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ual table */.){.
50f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5100: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
5110: 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c  r *zSql;.  Shell
5120: 54 65 78 74 20 73 3b 0a 20 20 63 68 61 72 20 63  Text s;.  char c
5130: 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Quote;.  char *z
5140: 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 69 6e 74  Div = "(";.  int
5150: 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 7a 53   nRow = 0;..  zS
5160: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
5170: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 5c 22 25  intf("PRAGMA \"%
5180: 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  w\".table_info=%
5190: 51 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Q;",.           
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
51b0: 63 68 65 6d 61 20 3f 20 7a 53 63 68 65 6d 61 20  chema ? zSchema 
51c0: 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  : "main", zName)
51d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
51e0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
51f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
5200: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5210: 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74 54 65 78  zSql);.  initTex
5220: 74 28 26 73 29 3b 0a 20 20 69 66 28 20 7a 53 63  t(&s);.  if( zSc
5230: 68 65 6d 61 20 29 7b 0a 20 20 20 20 63 51 75 6f  hema ){.    cQuo
5240: 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
5250: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
5260: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5270: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5280: 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 20  ma,"temp")==0 ) 
5290: 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 20 20  cQuote = 0;.    
52a0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a  appendText(&s, z
52b0: 53 63 68 65 6d 61 2c 20 63 51 75 6f 74 65 29 3b  Schema, cQuote);
52c0: 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
52d0: 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a 20 20 7d  &s, ".", 0);.  }
52e0: 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74  .  cQuote = quot
52f0: 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20  eChar(zName);.  
5300: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a  appendText(&s, z
5310: 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Name, cQuote);. 
5320: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
5330: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
5340: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
5350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
5360: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5370: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5380: 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
5390: 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 61 70    nRow++;.    ap
53a0: 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 69  pendText(&s, zDi
53b0: 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44 69 76 20  v, 0);.    zDiv 
53c0: 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51 75 6f 74  = ",";.    cQuot
53d0: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 43  e = quoteChar(zC
53e0: 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ol);.    appendT
53f0: 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c 20 63 51  ext(&s, zCol, cQ
5400: 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20 61 70 70  uote);.  }.  app
5410: 65 6e 64 54 65 78 74 28 26 73 2c 20 22 29 22 2c  endText(&s, ")",
5420: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5430: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
5440: 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b    if( nRow==0 ){
5450: 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
5460: 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20 30 3b 0a  );.    s.z = 0;.
5470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 2e 7a    }.  return s.z
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
5490: 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f  unction:  shell_
54a0: 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 58 29  module_schema(X)
54b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
54c0: 66 61 6b 65 20 73 63 68 65 6d 61 20 66 6f 72 20  fake schema for 
54d0: 74 68 65 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  the table-valued
54e0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 65 70 6f   function or epo
54f0: 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 0a 2a  nymous virtual.*
5500: 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f 0a 73 74  * table X..*/.st
5510: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4d  atic void shellM
5520: 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a 20 20 73  oduleSchema(.  s
5530: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5540: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
5550: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5560: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 63  e **apVal.){.  c
5570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5580: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5590: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
55a0: 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
55b0: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 73 68  char *zFake = sh
55c0: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 73 71  ellFakeSchema(sq
55d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
55e0: 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 2c 20 30  _handle(pCtx), 0
55f0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
5600: 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c  zFake ){.    sql
5610: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5620: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d  (pCtx, sqlite3_m
5630: 70 72 69 6e 74 66 28 22 2f 2a 20 25 7a 20 2a 2f  printf("/* %z */
5640: 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20  ", zFake),.     
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66     -1, sqlite3_f
5670: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
5680: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
5690: 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65    shell_add_sche
56a0: 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64  ma(S,X).**.** Ad
56b0: 64 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  d the schema nam
56c0: 65 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54  e X to the CREAT
56d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53  E statement in S
56e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
56f0: 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70  result..** Examp
5700: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  les:.**.**    CR
5710: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
5720: 20 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54     ->   CREATE T
5730: 41 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a  ABLE xyz.t1(x);.
5740: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73  **.** Also works
5750: 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45   on.**.**    CRE
5760: 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20  ATE INDEX.**    
5770: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
5780: 44 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  DEX.**    CREATE
5790: 20 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41   VIEW.**    CREA
57a0: 54 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20  TE TRIGGER.**   
57b0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
57c0: 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  TABLE.**.** This
57d0: 20 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20   UDF is used by 
57e0: 74 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d  the .schema comm
57f0: 61 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  and to insert th
5800: 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66  e schema name of
5810: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
5820: 61 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20  abases into the 
5830: 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71  middle of the sq
5840: 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20  lite_master.sql 
5850: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
5860: 20 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63   void shellAddSc
5870: 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69  hemaName(.  sqli
5880: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
5890: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
58a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
58b0: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74  *apVal.){.  stat
58c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
58d0: 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20  Prefix[] = {.   
58e0: 20 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20    "TABLE",.     
58f0: 22 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55  "INDEX",.     "U
5900: 4e 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20  NIQUE INDEX",.  
5910: 20 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20     "VIEW",.     
5920: 22 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20  "TRIGGER",.     
5930: 22 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a  "VIRTUAL TABLE".
5940: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30    };.  int i = 0
5950: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5960: 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zIn = (const cha
5970: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5980: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5990: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
59a0: 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20  Schema = (const 
59b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
59c0: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31  lue_text(apVal[1
59d0: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
59e0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
59f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5a00: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5a10: 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2]);.  sqlite3 *
5a20: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
5a30: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70  text_db_handle(p
5a40: 43 74 78 29 3b 0a 20 20 69 66 28 20 7a 49 6e 21  Ctx);.  if( zIn!
5a50: 3d 30 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 49  =0 && strncmp(zI
5a60: 6e 2c 20 22 43 52 45 41 54 45 20 22 2c 20 37 29  n, "CREATE ", 7)
5a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
5a80: 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65  =0; i<(int)(size
5a90: 6f 66 28 61 50 72 65 66 69 78 29 2f 73 69 7a 65  of(aPrefix)/size
5aa0: 6f 66 28 61 50 72 65 66 69 78 5b 30 5d 29 29 3b  of(aPrefix[0]));
5ab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
5ac0: 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 50   n = strlen30(aP
5ad0: 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 20  refix[i]);.     
5ae0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 49 6e   if( strncmp(zIn
5af0: 2b 37 2c 20 61 50 72 65 66 69 78 5b 69 5d 2c 20  +7, aPrefix[i], 
5b00: 6e 29 3d 3d 30 20 26 26 20 7a 49 6e 5b 6e 2b 37  n)==0 && zIn[n+7
5b10: 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]==' ' ){.      
5b20: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
5b30: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 61         char *zFa
5b40: 6b 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ke = 0;.        
5b50: 69 66 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20  if( zSchema ){. 
5b60: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 51           char cQ
5b70: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5b80: 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  (zSchema);.     
5b90: 20 20 20 20 20 69 66 28 20 63 51 75 6f 74 65 20       if( cQuote 
5ba0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
5bb0: 6d 70 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70  mp(zSchema,"temp
5bc0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
5bd0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5be0: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 5c  _mprintf("%.*s \
5bf0: 22 25 77 5c 22 2e 25 73 22 2c 20 6e 2b 37 2c 20  "%w\".%s", n+7, 
5c00: 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49  zIn, zSchema, zI
5c10: 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20  n+n+8);.        
5c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5c30: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5c40: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 25  _mprintf("%.*s %
5c50: 73 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c  s.%s", n+7, zIn,
5c60: 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b   zSchema, zIn+n+
5c70: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  8);.          }.
5c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c90: 20 20 69 66 28 20 7a 4e 61 6d 65 0a 20 20 20 20    if( zName.    
5ca0: 20 20 20 20 20 26 26 20 61 50 72 65 66 69 78 5b       && aPrefix[
5cb0: 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20 20 20 20 20  i][0]=='V'.     
5cc0: 20 20 20 20 26 26 20 28 7a 46 61 6b 65 20 3d 20      && (zFake = 
5cd0: 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28  shellFakeSchema(
5ce0: 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 4e 61  db, zSchema, zNa
5cf0: 6d 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  me))!=0.        
5d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5d10: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   z==0 ){.       
5d20: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5d30: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5c 6e 2f 2a  _mprintf("%s\n/*
5d40: 20 25 7a 20 2a 2f 22 2c 20 7a 49 6e 2c 20 7a 46   %z */", zIn, zF
5d50: 61 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ake);.          
5d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d70: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
5d80: 70 72 69 6e 74 66 28 22 25 7a 5c 6e 2f 2a 20 25  printf("%z\n/* %
5d90: 7a 20 2a 2f 22 2c 20 7a 2c 20 7a 46 61 6b 65 29  z */", z, zFake)
5da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5dc0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5dd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5de0: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5df0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5e10: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5e30: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5e40: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5e50: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5e60: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5e70: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5e80: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
5e90: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
5ea0: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
5eb0: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
5ec0: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
5ed0: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
5ee0: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
5ef0: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
5f00: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
5f10: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
5f20: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
5f30: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
5f40: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
5f50: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5f60: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
5f70: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
5f80: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
5f90: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
5fa0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
5fb0: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
5fc0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
5fd0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
5fe0: 64 28 57 49 4e 33 32 29 0a 49 4e 43 4c 55 44 45  d(WIN32).INCLUDE
5ff0: 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e   test_windirent.
6000: 63 0a 23 64 65 66 69 6e 65 20 64 69 72 65 6e 74  c.#define dirent
6010: 20 44 49 52 45 4e 54 0a 23 64 65 66 69 6e 65 20   DIRENT.#define 
6020: 74 69 6d 65 73 70 65 63 20 54 49 4d 45 53 50 45  timespec TIMESPE
6030: 43 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45  C.#endif.INCLUDE
6040: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61   ../ext/misc/sha
6050: 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45 20  three.c.INCLUDE 
6060: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c 65  ../ext/misc/file
6070: 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  io.c.INCLUDE ../
6080: 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65 74  ext/misc/complet
6090: 69 6f 6e 2e 63 0a 23 69 66 64 65 66 20 53 51 4c  ion.c.#ifdef SQL
60a0: 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49 4e  ITE_HAVE_ZLIB.IN
60b0: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
60c0: 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43 4c  c/zipfile.c.INCL
60d0: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
60e0: 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a 49  sqlar.c.#endif.I
60f0: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78  NCLUDE ../ext/ex
6100: 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70 65  pert/sqlite3expe
6110: 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  rt.h.INCLUDE ../
6120: 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69 74  ext/expert/sqlit
6130: 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66 20  e3expert.c..#if 
6140: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6150: 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f  NABLE_SESSION)./
6160: 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  *.** State infor
6170: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  mation for a sin
6180: 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  gle open session
6190: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
61a0: 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f  ct OpenSession O
61b0: 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75  penSession;.stru
61c0: 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b  ct OpenSession {
61d0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
61f0: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72  ymbolic name for
6200: 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f   this session */
6210: 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20  .  int nFilter; 
6220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6230: 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65 72  umber of xFilter
6240: 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20   rejection GLOB 
6250: 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68  patterns */.  ch
6260: 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20  ar **azFilter;  
6270: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
6280: 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65 63  of xFilter rejec
6290: 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65 72  tion GLOB patter
62a0: 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ns */.  sqlite3_
62b0: 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20  session *p;     
62c0: 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65 73   /* The open ses
62d0: 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69  sion */.};.#endi
62e0: 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f  f../*.** Shell o
62f0: 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72  utput mode infor
6300: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f  mation from befo
6310: 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  re ".explain on"
6320: 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68  ,.** saved so th
6330: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
6340: 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61  tored by ".expla
6350: 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64  in off".*/.typed
6360: 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64 4d  ef struct SavedM
6370: 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64  odeInfo SavedMod
6380: 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61  eInfo;.struct Sa
6390: 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  vedModeInfo {.  
63a0: 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20  int valid;      
63b0: 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20      /* Is there 
63c0: 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65  legit data in he
63d0: 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  re? */.  int mod
63e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
63f0: 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e  Mode prior to ".
6400: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6410: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
6420: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65       /* The ".he
6430: 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70 72  ader" setting pr
6440: 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e  ior to ".explain
6450: 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f   on" */.  int co
6460: 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a  lWidth[100];  /*
6470: 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70   Column widths p
6480: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6490: 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  n on" */.};..typ
64a0: 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70 65  edef struct Expe
64b0: 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e 66  rtInfo ExpertInf
64c0: 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72 74  o;.struct Expert
64d0: 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33  Info {.  sqlite3
64e0: 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74 3b  expert *pExpert;
64f0: 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 3b  .  int bVerbose;
6500: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65  .};../*.** State
6510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6520: 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ut the database 
6530: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f  connection is co
6540: 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a  ntained in an.**
6550: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6560: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6570: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
6580: 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61   struct ShellSta
6590: 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73  te ShellState;.s
65a0: 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65  truct ShellState
65b0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
65c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
65d0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
65e0: 20 69 6e 74 20 61 75 74 6f 45 78 70 6c 61 69 6e   int autoExplain
65f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d  ;       /* Autom
6600: 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e  atically turn on
6610: 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a   .explain mode *
6620: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45 51 50 3b  /.  int autoEQP;
6630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
6640: 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
6650: 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73 65  PLAN prior to se
6660: 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a  ach SQL stmt */.
6670: 20 20 69 6e 74 20 73 74 61 74 73 4f 6e 3b 20 20    int statsOn;  
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6690: 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f   to display memo
66a0: 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  ry stats before 
66b0: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
66c0: 0a 20 20 69 6e 74 20 73 63 61 6e 73 74 61 74 73  .  int scanstats
66d0: 4f 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  On;       /* Tru
66e0: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63 61  e to display sca
66f0: 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65  n stats before e
6700: 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a  ach finalize */.
6710: 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20    int outCount; 
6720: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
6730: 72 74 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65  rt to stdout whe
6740: 6e 20 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20  n reaching zero 
6750: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
6760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6770: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
6780: 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61   displayed so fa
6790: 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  r */.  FILE *out
67a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
67b0: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
67c0: 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74  ere */.  FILE *t
67d0: 72 61 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20  raceOut;        
67e0: 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71  /* Output for sq
67f0: 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f  lite3_trace() */
6800: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
6810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6820: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
6830: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  en */.  int mode
6840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6850: 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  * An output mode
6860: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   setting */.  in
6870: 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  t cMode;        
6880: 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61 72       /* temporar
6890: 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66 6f  y output mode fo
68a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  r the current qu
68b0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 72  ery */.  int nor
68c0: 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  malMode;        
68d0: 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20 62  /* Output mode b
68e0: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
68f0: 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69  on" */.  int wri
6900: 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20  tableSchema;    
6910: 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  /* True if PRAGM
6920: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6930: 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  a=ON */.  int sh
6940: 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20  owHeader;       
6950: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77   /* True to show
6960: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
6970: 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20   List or Column 
6980: 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  mode */.  int nC
6990: 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  heck;           
69a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 2e   /* Number of ".
69b0: 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73 20  check" commands 
69c0: 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  run */.  unsigne
69d0: 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20 20  d shellFlgs;    
69e0: 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
69f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
6a00: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
6a10: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
6a20: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
6a30: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
6a40: 63 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33  char zTestcase[3
6a50: 30 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0];    /* Name o
6a60: 66 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63  f current test c
6a70: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ase */.  char co
6a80: 6c 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20  lSeparator[20]; 
6a90: 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61  /* Column separa
6aa0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
6ab0: 72 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20  r several modes 
6ac0: 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70  */.  char rowSep
6ad0: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52  arator[20]; /* R
6ae0: 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
6af0: 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f  racter for MODE_
6b00: 41 73 63 69 69 20 2a 2f 0a 20 20 69 6e 74 20 63  Ascii */.  int c
6b10: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
6b20: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
6b30: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
6b40: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
6b50: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
6b60: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
6b70: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
6b80: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
6b90: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
6ba0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
6bb0: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
6bc0: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
6bd0: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
6c00: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
6c10: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
6c20: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
6c30: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
6c40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6c50: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
6c60: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
6c70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
6c80: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
6c90: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
6ca0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
6cb0: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
6cc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6cd0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
6ce0: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
6cf0: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
6d00: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
6d10: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
6d20: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
6d30: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
6d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6d50: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
6d60: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
6d70: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
6d80: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
6d90: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
6da0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
6db0: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
6dc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
6dd0: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
6de0: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
6df0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
6e00: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
6e10: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
6e20: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
6e40: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
6e50: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
6e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6e70: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
6e80: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
6e90: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
6ea0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
6eb0: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
6ec0: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
6ed0: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
6ee0: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
6ef0: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
6f00: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
6f10: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
6f20: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64  /.};../* Allowed
6f30: 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c   values for Shel
6f40: 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a 2a  lState.autoEQP.*
6f50: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
6f60: 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23 64 65  P_off      0.#de
6f70: 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 6e 20  fine AUTOEQP_on 
6f80: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
6f90: 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
6fa0: 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45   2.#define AUTOE
6fb0: 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a 0a 2f  QP_full     3../
6fc0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
6fd0: 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c  he allowed shell
6fe0: 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  Flgs values.*/.#
6ff0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
7000: 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30  ecache      0x00
7010: 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d  000001 /* The --
7020: 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e  pagecache option
7030: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
7040: 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  ine SHFLG_Lookas
7050: 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30  ide      0x00000
7060: 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65  002 /* Lookaside
7070: 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
7080: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7090: 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20  _Backslash      
70a0: 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68  0x00000004 /* Th
70b0: 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70  e --backslash op
70c0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
70d0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72  #define SHFLG_Pr
70e0: 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30  eserveRowid  0x0
70f0: 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70  0000008 /* .dump
7100: 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64   preserves rowid
7110: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
7120: 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  ne SHFLG_Newline
7130: 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30  s       0x000000
7140: 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65  10 /* .dump --ne
7150: 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64  wline flag */.#d
7160: 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e  efine SHFLG_Coun
7170: 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30  tChanges   0x000
7180: 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65  00020 /* .change
7190: 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65  s setting */.#de
71a0: 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20  fine SHFLG_Echo 
71b0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
71c0: 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72  0040 /* .echo or
71d0: 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20   --echo setting 
71e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  */../*.** Macros
71f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
7200: 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c   setting shellFl
7210: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68  gs.*/.#define Sh
7220: 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20  ellHasFlag(P,X) 
7230: 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46     (((P)->shellF
7240: 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23  lgs & (X))!=0).#
7250: 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46  define ShellSetF
7260: 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29  lag(P,X)    ((P)
7270: 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29  ->shellFlgs|=(X)
7280: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43  ).#define ShellC
7290: 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28  learFlag(P,X)  (
72a0: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d  (P)->shellFlgs&=
72b0: 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (~(X)))../*.** T
72c0: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
72d0: 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  owed modes..*/.#
72e0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65  define MODE_Line
72f0: 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63       0  /* One c
7300: 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20  olumn per line. 
7310: 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77   Blank line betw
7320: 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23  een records */.#
7330: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75  define MODE_Colu
7340: 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72  mn   1  /* One r
7350: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69  ecord per line i
7360: 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a  n neat columns *
7370: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
7380: 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e  ist     2  /* On
7390: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
73a0: 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74  e with a separat
73b0: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  or */.#define MO
73c0: 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f  DE_Semi     3  /
73d0: 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c  * Same as MODE_L
73e0: 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22  ist but append "
73f0: 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20  ;" to each line 
7400: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7410: 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47  Html     4  /* G
7420: 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c  enerate an XHTML
7430: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
7440: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20  e MODE_Insert   
7450: 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53  5  /* Generate S
7460: 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74  QL "insert" stat
7470: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
7480: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20  e MODE_Quote    
7490: 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75  6  /* Quote valu
74a0: 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f  es as for SQL */
74b0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
74c0: 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e  l      7  /* Gen
74d0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
74e0: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
74f0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
7500: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20  ODE_Csv      8  
7510: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
7520: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
7530: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
7540: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20  ODE_Explain  9  
7550: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
7560: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
7570: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
7580: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73  .#define MODE_As
7590: 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65  cii   10  /* Use
75a0: 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20   ASCII unit and 
75b0: 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72  record separator
75c0: 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f  s (0x1F/0x1E) */
75d0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72  .#define MODE_Pr
75e0: 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65  etty  11  /* Pre
75f0: 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61  tty-print schema
7600: 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  s */..static con
7610: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
7620: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
7630: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
7640: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
7650: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
7660: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
7670: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
7680: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
7690: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
76a0: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 7d  "prettyprint",.}
76b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
76c0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
76d0: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
76e0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
76f0: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
7700: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
7710: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
7720: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
7730: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
7740: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
7750: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
7760: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
7770: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
7780: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
7790: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
77a0: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
77b0: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
77c0: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
77d0: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
77e0: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
77f0: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  ** Number of ele
7800: 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61  ments in an arra
7810: 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72  y.*/.#define Arr
7820: 61 79 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29  aySize(X)  (int)
7830: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
7840: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
7850: 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  A callback for t
7860: 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  he sqlite3_log()
7870: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
7880: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
7890: 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  Log(void *pArg, 
78a0: 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f  int iErrCode, co
78b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  nst char *zMsg){
78c0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
78d0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
78e0: 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pArg;.  if( p->p
78f0: 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Log==0 ) return;
7900: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
7910: 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73  ->pLog, "(%d) %s
7920: 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a  \n", iErrCode, z
7930: 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  Msg);.  fflush(p
7940: 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pLog);.}../*.*
7950: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
7960: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68  en string as a h
7970: 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20  ex-encoded blob 
7980: 28 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a  (eg. X'1234' ).*
7990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
79a0: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49  tput_hex_blob(FI
79b0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76  LE *out, const v
79c0: 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20  oid *pBlob, int 
79d0: 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b  nBlob){.  int i;
79e0: 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  .  char *zBlob =
79f0: 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a   (char *)pBlob;.
7a00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
7a10: 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d  ,"X'");.  for(i=
7a20: 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29  0; i<nBlob; i++)
7a30: 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74  { raw_printf(out
7a40: 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d  ,"%02x",zBlob[i]
7a50: 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f  &0xff); }.  raw_
7a60: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b  printf(out,"'");
7a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
7a80: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
7a90: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65  not found anywhe
7aa0: 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75  re in z[].  Retu
7ab0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ac0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a  to that string..
7ad0: 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65  **.** Try to use
7ae0: 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74   zA and zB first
7af0: 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68  .  If both of th
7b00: 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ose are already 
7b10: 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20  found in z[].** 
7b20: 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d  then make up som
7b30: 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f  e string and sto
7b40: 72 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66  re it in the buf
7b50: 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
7b60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7b70: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20  unused_string(. 
7b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73     /* Result mus
7bb0: 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79  t not appear any
7bc0: 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20  where in z */.  
7bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
7be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20  const char *zB, 
7bf0: 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66    /* Try these f
7c00: 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  irst */.  char *
7c10: 7a 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  zBuf            
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7c30: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
7c40: 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67  generated string
7c50: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
7c60: 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  d i = 0;.  if( s
7c70: 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20  trstr(z, zA)==0 
7c80: 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69  ) return zA;.  i
7c90: 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29  f( strstr(z, zB)
7ca0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b  ==0 ) return zB;
7cb0: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
7cc0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a  e3_snprintf(20,z
7cd0: 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41  Buf,"(%s%u)", zA
7ce0: 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65  , i++);.  }while
7cf0: 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29  ( strstr(z,zBuf)
7d00: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
7d10: 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  zBuf;.}../*.** O
7d20: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
7d30: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
7d40: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
7d50: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
7d60: 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53  entions..**.** S
7d70: 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f  ee also: output_
7d80: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
7d90: 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69  tring().*/.stati
7da0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
7db0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  oted_string(FILE
7dc0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
7dd0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
7de0: 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42    char c;.  setB
7df0: 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31  inaryMode(out, 1
7e00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
7e10: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
7e20: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
7e30: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
7e40: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
7e50: 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65  ,"'%s'",z);.  }e
7e60: 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
7e70: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
7e80: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
7e90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
7ea0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
7eb0: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
7ec0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
7ed0: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) i++;.      i
7ee0: 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20  f( i ){.        
7ef0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
7f00: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a   "%.*s", i, z);.
7f10: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a          z += i;.
7f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7f30: 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
7f40: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
7f50: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20  out, "'");.     
7f60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7f70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
7f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
7f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7fa0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
7fb0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
7fc0: 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73  t, "'");.  }.  s
7fd0: 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20  etTextMode(out, 
7fe0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  1);.}../*.** Out
7ff0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
8000: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
8010: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
8020: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
8030: 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69  tions..** Additi
8040: 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65  onallly , escape
8050: 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c   the "\n" and "\
8060: 72 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f  r" characters so
8070: 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f   that they do no
8080: 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74  t.** get corrupt
8090: 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e  ed by end-of-lin
80a0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61  e translation fa
80b0: 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65  cilities in some
80c0: 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
80d0: 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
80e0: 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74  s is like output
80f0: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29  _quoted_string()
8100: 20 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64   but with the ad
8110: 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72  dition of the \r
8120: 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63  \n.** escape mec
8130: 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69  hanism..*/.stati
8140: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
8150: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
8160: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
8170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
8180: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
8190: 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ;.  setBinaryMod
81a0: 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72  e(out, 1);.  for
81b0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
81c0: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26  !=0 && c!='\'' &
81d0: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
81e0: 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\r'; i++){}.  i
81f0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
8200: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
8210: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
8220: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
8230: 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  r *zNL = 0;.    
8240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20  const char *zCR 
8250: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c  = 0;.    int nNL
8260: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
8270: 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  R = 0;.    char 
8280: 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32  zBuf1[20], zBuf2
8290: 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [20];.    for(i=
82a0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
82b0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
82c0: 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20  \n' ) nNL++;.   
82d0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72     if( z[i]=='\r
82e0: 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d  ' ) nCR++;.    }
82f0: 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a  .    if( nNL ){.
8300: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
8310: 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22  (out, "replace("
8320: 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75  );.      zNL = u
8330: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20  nused_string(z, 
8340: 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20  "\\n", "\\012", 
8350: 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20  zBuf1);.    }.  
8360: 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20    if( nCR ){.   
8370: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8380: 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a  t, "replace(");.
8390: 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73        zCR = unus
83a0: 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c  ed_string(z, "\\
83b0: 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75  r", "\\015", zBu
83c0: 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  f2);.    }.    r
83d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
83e0: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
83f0: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
8400: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
8410: 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26  =0 && c!='\n' &&
8420: 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27   c!='\r' && c!='
8430: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
8440: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
8450: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
8460: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
8470: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
8480: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
8490: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
84a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
84b0: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
84c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
84d0: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
84e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
84f0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
8500: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
8510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8520: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  z++;.      if( c
8530: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
8540: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8550: 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20  , "%s", zNL);.  
8560: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
8580: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
8590: 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a  s", zCR);.    }.
85a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
85b0: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66  ut, "'");.    if
85c0: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
85d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
85e0: 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22  ,'%s',char(13))"
85f0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
8600: 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20    if( nNL ){.   
8610: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8620: 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31  t, ",'%s',char(1
8630: 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  0))", zNL);.    
8640: 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d  }.  }.  setTextM
8650: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a  ode(out, 1);.}..
8660: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
8670: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
8680: 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64   a quoted accord
8690: 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20  ing to C or TCL 
86a0: 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a  quoting rules..*
86b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
86c0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49  tput_c_string(FI
86d0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
86e0: 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67  har *z){.  unsig
86f0: 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75  ned int c;.  fpu
8700: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
8710: 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b  while( (c = *(z+
8720: 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  +))!=0 ){.    if
8730: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
8740: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
8750: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  ;.      fputc(c,
8760: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
8770: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
8780: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
8790: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
87a0: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
87b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
87c0: 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \t' ){.      fpu
87d0: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
87e0: 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20       fputc('t', 
87f0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
8800: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
8810: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
8820: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
8830: 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('n', out);.  
8840: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
8850: 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \r' ){.      fpu
8860: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
8870: 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20       fputc('r', 
8880: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
8890: 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30  if( !isprint(c&0
88a0: 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61  xff) ){.      ra
88b0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c  w_printf(out, "\
88c0: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
88d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
88e0: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
88f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
8900: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
8910: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
8920: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
8930: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
8940: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
8950: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
8960: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8970: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
8980: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
8990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
89a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
89b0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
89c0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
89d0: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
89e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ].            &&
89f0: 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20   z[i]!='<'.     
8a00: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
8a10: 27 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  '&'.            
8a20: 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20  && z[i]!='>'.   
8a30: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
8a40: 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20  !='\"'.         
8a50: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27     && z[i]!='\''
8a60: 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d  ;.        i++){}
8a70: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
8a80: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
8a90: 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a  f(out,"%.*s",i,z
8aa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8ab0: 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20   z[i]=='<' ){.  
8ac0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
8ad0: 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20  ut,"&lt;");.    
8ae0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
8af0: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '&' ){.      raw
8b00: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d  _printf(out,"&am
8b10: 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  p;");.    }else 
8b20: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b  if( z[i]=='>' ){
8b30: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8b40: 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20  f(out,"&gt;");. 
8b50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
8b60: 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20  ]=='\"' ){.     
8b70: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8b80: 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d  "&quot;");.    }
8b90: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
8ba0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \'' ){.      raw
8bb0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33  _printf(out,"&#3
8bc0: 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  9;");.    }else{
8bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8be0: 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b    }.    z += i +
8bf0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
8c00: 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74   If a field cont
8c10: 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74  ains any charact
8c20: 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
8c30: 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c   a 1 in the foll
8c40: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20  owing.** array, 
8c50: 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20  then the string 
8c60: 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66  must be quoted f
8c70: 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69  or CSV..*/.stati
8c80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65  c const char nee
8c90: 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a  dCsvQuote[] = {.
8ca0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8cb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8cc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8cd0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8ce0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8cf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8d00: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20  , 1, 1,.  1, 0, 
8d10: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31  1, 0, 0, 0, 0, 1
8d20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8d30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8d40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8d50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8d60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
8d70: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
8d80: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
8d90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8da0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
8db0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
8dc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8dd0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8de0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8df0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8e00: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8e10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8e20: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8e30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a   0, 0, 0, 0, 1,.
8e40: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8e50: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8e60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8e70: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8e80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8e90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8ea0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8eb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8ec0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8ed0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8ee0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8ef0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8f00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8f10: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8f20: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8f30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8f40: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8f50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8f60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8f70: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8f80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8f90: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8fa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8fb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8fc0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8fd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8fe0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
8ff0: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   a single term o
9000: 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79  f CSV.  Actually
9010: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9020: 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  r is used for.**
9030: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20   the separator, 
9040: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
9050: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e   not be a comma.
9060: 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69    p->nullValue i
9070: 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61  s.** the null va
9080: 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72  lue.  Strings ar
9090: 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65  e quoted if nece
90a0: 73 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61  ssary.  The sepa
90b0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79  rator.** is only
90c0: 20 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20   issued if bSep 
90d0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
90e0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
90f0: 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sv(ShellState *p
9100: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
9110: 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49   int bSep){.  FI
9120: 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74  LE *out = p->out
9130: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
9140: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9150: 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c  out,"%s",p->null
9160: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
9170: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9180: 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65  int nSep = strle
9190: 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  n30(p->colSepara
91a0: 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
91b0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
91c0: 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76       if( needCsv
91d0: 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64  Quote[((unsigned
91e0: 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20   char*)z)[i]].  
91f0: 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d         || (z[i]=
9200: 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  =p->colSeparator
9210: 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20  [0] &&.         
9220: 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20      (nSep==1 || 
9230: 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c  memcmp(z, p->col
9240: 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29  Separator, nSep)
9250: 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ==0)) ){.       
9260: 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   i = 0;.        
9270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9280: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
9290: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
92a0: 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74  *zQuoted = sqlit
92b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
92c0: 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75  \"", z);.      u
92d0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
92e0: 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a  "%s", zQuoted);.
92f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9300: 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  ee(zQuoted);.   
9310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
9320: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9330: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  %s", z);.    }. 
9340: 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b   }.  if( bSep ){
9350: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
9360: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
9370: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
9380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9390: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
93a0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72  when the user pr
93b0: 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a  esses Ctrl-C.*/.
93c0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65  static void inte
93d0: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e  rrupt_handler(in
93e0: 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e  t NotUsed){.  UN
93f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
9400: 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49  otUsed);.  seenI
9410: 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66  nterrupt++;.  if
9420: 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e  ( seenInterrupt>
9430: 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69  2 ) exit(1);.  i
9440: 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71  f( globalDb ) sq
9450: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
9460: 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69  globalDb);.}..#i
9470: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
9480: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
9490: 4e 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65  N32)) && !define
94a0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a  d(_WIN32_WCE)./*
94b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
94c0: 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c   runs for consol
94d0: 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43  e events (e.g. C
94e0: 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a  trl-C) on Win32.
94f0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57  */.static BOOL W
9500: 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72  INAPI ConsoleCtr
9510: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52  lHandler(.  DWOR
9520: 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20  D dwCtrlType /* 
9530: 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f  One of the CTRL_
9540: 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74  *_EVENT constant
9550: 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77  s */.){.  if( dw
9560: 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43  CtrlType==CTRL_C
9570: 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e  _EVENT ){.    in
9580: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
9590: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
95a0: 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RUE;.  }.  retur
95b0: 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69  n FALSE;.}.#endi
95c0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
95d0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
95e0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  TION./*.** When 
95f0: 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69  the ".auth ON" i
9600: 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  s set, the follo
9610: 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20  wing authorizer 
9620: 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69  callback is.** i
9630: 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61  nvoked.  It alwa
9640: 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
9650: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
9660: 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20  int shellAuth(. 
9670: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
9680: 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  ta,.  int op,.  
9690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c  const char *zA1,
96a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
96b0: 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  A2,.  const char
96c0: 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA3,.  const c
96d0: 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68  har *zA4.){.  Sh
96e0: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
96f0: 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65  hellState*)pClie
9700: 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63  ntData;.  static
9710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
9720: 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20  ction[] = { 0,. 
9730: 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45      "CREATE_INDE
9740: 58 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45  X",         "CRE
9750: 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ATE_TABLE",     
9760: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
9770: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43  _INDEX",.     "C
9780: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
9790: 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45  ",    "CREATE_TE
97a0: 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43  MP_TRIGGER",  "C
97b0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
97c0: 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54  ,.     "CREATE_T
97d0: 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22  RIGGER",       "
97e0: 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20  CREATE_VIEW",   
97f0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c         "DELETE",
9800: 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45  .     "DROP_INDE
9810: 58 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44  X",           "D
9820: 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ROP_TABLE",     
9830: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
9840: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44  _INDEX",.     "D
9850: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ROP_TEMP_TABLE",
9860: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
9870: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44  _TRIGGER",    "D
9880: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ROP_TEMP_VIEW",.
9890: 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47       "DROP_TRIGG
98a0: 45 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52  ER",         "DR
98b0: 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  OP_VIEW",       
98c0: 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20       "INSERT",. 
98d0: 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20      "PRAGMA",   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41              "REA
98f0: 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  D",             
9900: 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20      "SELECT",.  
9910: 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22     "TRANSACTION"
9920: 2c 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41  ,          "UPDA
9930: 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TE",            
9940: 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20     "ATTACH",.   
9950: 20 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20    "DETACH",     
9960: 20 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52            "ALTER
9970: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  _TABLE",        
9980: 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20    "REINDEX",.   
9990: 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20    "ANALYZE",    
99a0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
99b0: 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20  E_VTABLE",      
99c0: 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c    "DROP_VTABLE",
99d0: 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22  .     "FUNCTION"
99e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,             "S
99f0: 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20  AVEPOINT",      
9a00: 20 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45        "RECURSIVE
9a10: 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ".  };.  int i;.
9a20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
9a30: 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a  [4];.  az[0] = z
9a40: 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41  A1;.  az[1] = zA
9a50: 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33  2;.  az[2] = zA3
9a60: 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b  ;.  az[3] = zA4;
9a70: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
9a80: 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a  ->out, "authoriz
9a90: 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f  er: %s", azActio
9aa0: 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  n[op]);.  for(i=
9ab0: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<4; i++){.  
9ac0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
9ad0: 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69  out, " ");.    i
9ae0: 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  f( az[i] ){.    
9af0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
9b00: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29  g(p->out, az[i])
9b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b20: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
9b30: 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  >out, "NULL");. 
9b40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70     }.  }.  raw_p
9b50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
9b60: 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
9b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
9b80: 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  f../*.** Print a
9b90: 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e   schema statemen
9ba0: 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45  t.  Part of MODE
9bb0: 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50  _Semi and MODE_P
9bc0: 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a  retty output..**
9bd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9be0: 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43   converts some C
9bf0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9c00: 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f  ements for shado
9c10: 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46  w tables.** in F
9c20: 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45  TS3/4/5 into CRE
9c30: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
9c40: 20 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e   EXISTS statemen
9c50: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
9c60: 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  id printSchemaLi
9c70: 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ne(FILE *out, co
9c80: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e  nst char *z, con
9c90: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b  st char *zTail){
9ca0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
9cb0: 74 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54  trglob("CREATE T
9cc0: 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29  ABLE ['\"]*", z)
9cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
9ce0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45  printf(out, "CRE
9cf0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
9d00: 20 45 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a   EXISTS %s%s", z
9d10: 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d  +13, zTail);.  }
9d20: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
9d30: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73  rintf(out, "%s%s
9d40: 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  ", z, zTail);.  
9d50: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d60: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
9d70: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72  (FILE *out, char
9d80: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73   *z, int n, cons
9d90: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a  t char *zTail){.
9da0: 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b    char c = z[n];
9db0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70  .  z[n] = 0;.  p
9dc0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f  rintSchemaLine(o
9dd0: 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20  ut, z, zTail);. 
9de0: 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a   z[n] = c;.}../*
9df0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
9e00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
9e10: 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a   that the shell.
9e20: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
9e30: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
9e40: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
9e50: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63  atic int shell_c
9e60: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
9e70: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  *pArg,.  int nAr
9e80: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
9e90: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
9ea0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
9eb0: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54  **azArg,    /* T
9ec0: 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75  ext of each resu
9ed0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
9ee0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20  har **azCol,    
9ef0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
9f00: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65  */.  int *aiType
9f10: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9f20: 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  types */.){.  in
9f30: 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  t i;.  ShellStat
9f40: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
9f50: 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28  te*)pArg;..  if(
9f60: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
9f70: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
9f80: 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20  p->cMode ){.    
9f90: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20  case MODE_Line: 
9fa0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20  {.      int w = 
9fb0: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  5;.      if( azA
9fc0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
9fd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9fe0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
9ff0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
a000: 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20  rlen30(azCol[i] 
a010: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
a020: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
a030: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
a040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a050: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74   p->cnt++>0 ) ut
a060: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
a070: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
a080: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
a090: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
a0b0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
a0c0: 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20  t,"%*s = %s%s", 
a0d0: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  w, azCol[i],.   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
a0f0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
a100: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c   : p->nullValue,
a110: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
a120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a140: 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c    case MODE_Expl
a150: 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f  ain:.    case MO
a160: 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20  DE_Column: {.   
a170: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
a180: 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74  int aExplainWidt
a190: 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34  hs[] = {4, 13, 4
a1a0: 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31  , 4, 4, 13, 2, 1
a1b0: 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3};.      const 
a1c0: 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20  int *colWidth;. 
a1d0: 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72       int showHdr
a1e0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f  ;.      char *ro
a1f0: 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20  wSep;.      if( 
a200: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43  p->cMode==MODE_C
a210: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
a220: 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63   colWidth = p->c
a230: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20  olWidth;.       
a240: 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68   showHdr = p->sh
a250: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
a260: 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f    rowSep = p->ro
a270: 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20  wSeparator;.    
a280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a290: 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70   colWidth = aExp
a2a0: 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20  lainWidths;.    
a2b0: 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b      showHdr = 1;
a2c0: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
a2d0: 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20  = SEP_Row;.     
a2e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
a2f0: 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20  cnt++==0 ){.    
a300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a310: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
a320: 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20       int w, n;. 
a330: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
a340: 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
a350: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a360: 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74       w = colWidt
a370: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
a380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a390: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
a3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a3b0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
a3c0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
a3d0: 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20  enChar(azCol[i] 
a3e0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
a3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a400: 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b  ( w<10 ) w = 10;
a410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
a420: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
a430: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
a440: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
a450: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
a460: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
a470: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
a480: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
a490: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
a4a0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
a4c0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
a4d0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
a4e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f           if( sho
a4f0: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
a500: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
a510: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
a520: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
a530: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a540: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
a550: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
a560: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
a570: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a580: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
a590: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
a5a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a5b0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
a5c0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
a5d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
a5e0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
a5f0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
a610: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
a620: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
a630: 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20    if( w<0 ) w = 
a640: 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w;.            
a650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a660: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
a670: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a680: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a690: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e  ntf(p->out,"%-*.
a6a0: 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20  *s%s",w,w,.     
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
a710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
a770: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
a780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a790: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a7a0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
a7b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
a7c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
a7e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
a7f0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
a800: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
a810: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
a820: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
a830: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a840: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
a850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a860: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
a870: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
a880: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
a890: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
a8a0: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
a8b0: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
a8c0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
a8d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
a8e0: 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e   i==1 && p->aiIn
a8f0: 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74  dent && p->pStmt
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a910: 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e  ( p->iIndent<p->
a920: 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20  nIndent ){.     
a930: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a940: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
a950: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
a960: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
a970: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a980: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
a990: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
a9a0: 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74         utf8_widt
a9b0: 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20  h_print(p->out, 
a9c0: 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  w, azArg[i] ? az
a9d0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
a9e0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
a9f0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
aa00: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
aa10: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
aa20: 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
aa30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aa40: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53  .    case MODE_S
aa50: 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68  emi: {   /* .sch
aa60: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
aa70: 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ema output */.  
aa80: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
aa90: 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ine(p->out, azAr
aaa0: 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  g[0], ";\n");.  
aab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aac0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50  .    case MODE_P
aad0: 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63  retty: {  /* .sc
aae0: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
aaf0: 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65  hema with --inde
ab00: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  nt */.      char
ab10: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *z;.      int j
ab20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72  ;.      int nPar
ab30: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  en = 0;.      ch
ab40: 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20  ar cEnd = 0;.   
ab50: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
ab60: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a   int nLine = 0;.
ab70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
ab80: 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  rg==1 );.      i
ab90: 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29  f( azArg[0]==0 )
aba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
abb0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
abc0: 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22  e("CREATE VIEW%"
abd0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
abe0: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
abf0: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
ac00: 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72  ATE TRIG%", azAr
ac10: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
ac20: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
ac30: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ac40: 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b   "%s;\n", azArg[
ac50: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  0]);.        bre
ac60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ac70: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
ac80: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
ac90: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d  g[0]);.      j =
aca0: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
acb0: 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  0; IsSpace(z[i])
acc0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66  ; i++){}.      f
acd0: 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  or(; (c = z[i])!
ace0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
acf0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
ad00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ad10: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29  ( z[j-1]=='\r' )
ad20: 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a   z[j-1] = '\n';.
ad30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
ad40: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c  Space(z[j-1]) ||
ad50: 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63   z[j-1]=='(' ) c
ad60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
ad70: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
ad80: 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26  (' || c==')') &&
ad90: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
ada0: 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  z[j-1]) ){.     
adb0: 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
adc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
add0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
ade0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
adf0: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
ae00: 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  1]) ){ j--; }.  
ae10: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
ae20: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30      if( strlen30
ae30: 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20  (z)>=79 ){.     
ae40: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63     for(i=j=0; (c
ae50: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ae70: 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20   c==cEnd ){.    
ae80: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30          cEnd = 0
ae90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
aea0: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
aeb0: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
aec0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
aed0: 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20   cEnd = c;.     
aee0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
aef0: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
af00: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b       cEnd = ']';
af10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
af20: 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20   if( c=='(' ){. 
af30: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
af40: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
af50: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20  else if( c==')' 
af60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
af70: 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  Paren--;.       
af80: 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30       if( nLine>0
af90: 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26   && nParen==0 &&
afa0: 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j>0 ){.        
afb0: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
afc0: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
afd0: 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  , j, "\n");.    
afe0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
aff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b010: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b       z[j++] = c;
b020: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
b030: 50 61 72 65 6e 3d 3d 31 20 26 26 20 28 63 3d 3d  Paren==1 && (c==
b040: 27 28 27 20 7c 7c 20 63 3d 3d 27 2c 27 20 7c 7c  '(' || c==',' ||
b050: 20 63 3d 3d 27 5c 6e 27 29 20 29 7b 0a 20 20 20   c=='\n') ){.   
b060: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
b070: 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  '\n' ) j--;.    
b080: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
b090: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
b0a0: 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a   z, j, "\n  ");.
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
b0c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
b0d0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Line++;.        
b0e0: 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
b0f0: 63 65 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b  ce(z[i+1]) ){ i+
b100: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d  +; }.          }
b110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b120: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
b130: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
b140: 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
b150: 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  t, z, ";\n");.  
b160: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b170: 28 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (z);.      break
b180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b190: 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20   MODE_List: {.  
b1a0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
b1b0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
b1c0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
b1d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
b1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b1f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b200: 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c  out,"%s%s",azCol
b210: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
b220: 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31         i==nArg-1
b230: 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   ? p->rowSeparat
b240: 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or : p->colSepar
b250: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
b260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b270: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
b280: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
b290: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b2a0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
b2b0: 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
b2c0: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
b2d0: 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75   z = p->nullValu
b2e0: 65 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  e;.        utf8_
b2f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b300: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
b310: 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b   if( i<nArg-1 ){
b320: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
b330: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b340: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b350: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
b360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b370: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b380: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
b390: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b3b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b3c0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
b3d0: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
b3e0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
b3f0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
b400: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
b410: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e  ntf(p->out,"<TR>
b420: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
b430: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
b450: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
b460: 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TH>");.        
b470: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
b480: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
b490: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
b4a0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b4b0: 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a  out,"</TH>\n");.
b4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b4e0: 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a  out,"</TR>\n");.
b4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b500: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
b510: 61 6b 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ak;.      raw_pr
b520: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
b530: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
b540: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b550: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
b560: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44  intf(p->out,"<TD
b570: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74  >");.        out
b580: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
b590: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
b5a0: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
b5b0: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
b5c0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b5d0: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22  p->out,"</TD>\n"
b5e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b5f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b600: 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20  ut,"</TR>\n");. 
b610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b620: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
b630: 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Tcl: {.      if(
b640: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
b650: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
b660: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b670: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b680: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
b690: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
b6a0: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
b6b0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
b6c0: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
b6d0: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
b6e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b6f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b710: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b720: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
b730: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
b740: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b750: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b760: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b770: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b780: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
b790: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
b7a0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
b7b0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
b7c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c  );.        if(i<
b7d0: 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69  nArg-1) utf8_pri
b7e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
b7f0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
b800: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
b810: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b820: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
b830: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
b840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b850: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
b860: 73 76 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42  sv: {.      setB
b870: 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74  inaryMode(p->out
b880: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
b890: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
b8a0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
b8b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b8c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b8d0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
b8e0: 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20  csv(p, azCol[i] 
b8f0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c  ? azCol[i] : "",
b900: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
b910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
b920: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b930: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
b940: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
b950: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
b960: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
b970: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
b990: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41  utput_csv(p, azA
b9a0: 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29  rg[i], i<nArg-1)
b9b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b9c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b9d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
b9e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
b9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
ba00: 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74  tTextMode(p->out
ba10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
ba20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ba30: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
ba40: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
ba50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ba60: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ba70: 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e  ->out,"INSERT IN
ba80: 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54  TO %s",p->zDestT
ba90: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  able);.      if(
baa0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
bab0: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
bac0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29  intf(p->out,"(")
bad0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bae0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
baf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
bb00: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
bb10: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
bb20: 20 20 20 20 20 20 20 20 69 66 28 20 71 75 6f 74          if( quot
bb30: 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20  eChar(azCol[i]) 
bb40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
bb50: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
bb60: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
bb70: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
bb80: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
bb90: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
bba0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
bbb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bbc0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (z);.          }
bbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bbe0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
bbf0: 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c  out, "%s", azCol
bc00: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
bc10: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
bc20: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
bc30: 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  ->out,")");.    
bc40: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
bc50: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
bc60: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
bc70: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
bc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20  ntf(p->out, i>0 
bc90: 3f 20 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53  ? "," : " VALUES
bca0: 28 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (");.        if(
bcb0: 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c   (azArg[i]==0) |
bcc0: 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69 54  | (aiType && aiT
bcd0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e  ype[i]==SQLITE_N
bce0: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
bcf0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
bd00: 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  >out,"NULL");.  
bd10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bd20: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
bd30: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  [i]==SQLITE_TEXT
bd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
bd50: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
bd60: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
bd70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bd80: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
bd90: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
bda0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
bdb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdc0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
bdd0: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
bde0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
bdf0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
be00: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
be10: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
be20: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
be30: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
be40: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
be50: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
be60: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
be70: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
be80: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
be90: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
bea0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
beb0: 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [50];.          
bec0: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
bed0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
bee0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
bef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bf00: 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22  _snprintf(50,z,"
bf10: 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20  %!.20g", r);.   
bf20: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
bf30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bf40: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z);.        }els
bf50: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
bf60: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
bf70: 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74  E_BLOB && p->pSt
bf80: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
bf90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
bfa0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
bfb0: 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74  mn_blob(p->pStmt
bfc0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
bfd0: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
bfe0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
bff0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
c000: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c010: 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c  hex_blob(p->out,
c020: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a   pBlob, nBlob);.
c030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c040: 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67  ( isNumber(azArg
c050: 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  [i], 0) ){.     
c060: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c070: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
c080: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
c090: 20 7d 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c   }else if( Shell
c0a0: 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
c0b0: 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20  _Newlines) ){.  
c0c0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
c0d0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
c0e0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
c0f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c100: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c110: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
c120: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
c130: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
c140: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c150: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
c160: 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut,");\n");.    
c170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c180: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f     case MODE_Quo
c190: 74 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  te: {.      if( 
c1a0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
c1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
c1c0: 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  nt==0 && p->show
c1d0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
c1e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c1f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c200: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
c210: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c220: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
c230: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
c240: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
c250: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
c260: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
c270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
c280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c290: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
c2a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c2b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c2c0: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
c2d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
c2e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
c2f0: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
c300: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
c310: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
c320: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
c330: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c340: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
c350: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
c360: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
c370: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
c380: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
c390: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c3a0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
c3b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
c3c0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
c3d0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
c3e0: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
c3f0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c400: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
c410: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
c420: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
c430: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c440: 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
c450: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
c460: 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20   z[50];.        
c470: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
c480: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
c490: 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  le(p->pStmt, i);
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c4b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a  e3_snprintf(50,z
c4c0: 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20  ,"%!.20g", r);. 
c4d0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
c4e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
c4f0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , z);.        }e
c500: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
c510: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
c520: 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70  ITE_BLOB && p->p
c530: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
c540: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
c550: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
c560: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74  lumn_blob(p->pSt
c570: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
c580: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
c590: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
c5a0: 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  es(p->pStmt, i);
c5b0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
c5c0: 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75  t_hex_blob(p->ou
c5d0: 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  t, pBlob, nBlob)
c5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c5f0: 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41  if( isNumber(azA
c600: 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20  rg[i], 0) ){.   
c610: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c620: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
c630: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
c640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c650: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
c660: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c670: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c680: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c690: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
c6a0: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
c6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c6c0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73      case MODE_As
c6d0: 63 69 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  cii: {.      if(
c6e0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
c6f0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
c700: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c710: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
c730: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
c740: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
c750: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
c760: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
c770: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
c780: 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  ",azCol[i] ? azC
c790: 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20  ol[i] : "");.   
c7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
c7b0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c7c0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
c7d0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c7e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
c7f0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
c800: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c810: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c820: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
c830: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c840: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
c850: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
c860: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c870: 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b  >out,"%s",azArg[
c880: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
c890: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
c8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c8b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c8c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
c8d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
c8e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c8f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c900: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
c910: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
c920: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
c930: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
c940: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
c950: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
c960: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
c970: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
c980: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
c990: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
c9a0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
c9b0: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
c9c0: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
c9d0: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
c9e0: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
c9f0: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
ca00: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
ca10: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
ca20: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
ca30: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
ca40: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
ca50: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
ca60: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
ca70: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
ca80: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
ca90: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
caa0: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
cab0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cac0: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
cad0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
cae0: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
caf0: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
cb00: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
cb10: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
cb20: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
cb30: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
cb40: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
cb50: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
cb60: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20  n 0;.  if( p->n 
cb70: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
cb80: 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  "|", 0);.  for(i
cb90: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cba0: 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61 70  {.    if( i ) ap
cbb0: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c  pendText(p, ",",
cbc0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41   0);.    if( azA
cbd0: 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65  rg[i] ) appendTe
cbe0: 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  xt(p, azArg[i], 
cbf0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
cc00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
cc10: 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  erate an appropr
cc20: 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74 61  iate SELFTEST ta
cc30: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
cc40: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
cc50: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
cc60: 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68 65  elftestTable(She
cc70: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63  llState *p){.  c
cc80: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
cc90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
cca0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56  (p->db,.    "SAV
ccb0: 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f  EPOINT selftest_
ccc0: 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52  init;\n".    "CR
ccd0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
cce0: 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65 73  T EXISTS selftes
ccf0: 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f  t(\n".    "  tno
cd00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
cd10: 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65   KEY,\n"   /* Te
cd20: 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  st number */.   
cd30: 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20   "  op TEXT,\n" 
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20    /* Operator:  
cd60: 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20  memo run */.    
cd70: 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20  "  cmd TEXT,\n" 
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74   /* Command text
cda0: 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54   */.    "  ans T
cdb0: 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20  EXT\n"          
cdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69           /* Desi
cdd0: 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20  red answer */.  
cde0: 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41    ");".    "CREA
cdf0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f  TE TEMP TABLE [_
ce00: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63  shell$self](op,c
ce10: 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20  md,ans);\n".    
ce20: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
ce30: 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64  hell$self](rowid
ce40: 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20  ,op,cmd)\n".    
ce50: 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73  "  VALUES(coales
ce60: 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28  ce((SELECT (max(
ce70: 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f  tno)+100)/10 FRO
ce80: 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c  M selftest),10),
ce90: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
cea0: 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20    'memo','Tests 
ceb0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69  generated by --i
cec0: 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  nit');\n".    "I
ced0: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
cee0: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
cef0: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
cf00: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  \n".    "    'SE
cf10: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
cf20: 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79 70  ery(''SELECT typ
cf30: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
cf40: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
cf70: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
cf80: 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c   BY 2'',224))',\
cf90: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
cfa0: 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45  sha3_query('SELE
cfb0: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
cfc0: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
cff0: 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
d000: 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a  BY 2',224));\n".
d010: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
d020: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
d030: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
d040: 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20  'run',".    "   
d050: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
d060: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
d070: 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a   * FROM \"' ||".
d080: 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72 69      "        pri
d090: 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c  ntf('%w',name) |
d0a0: 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  | '\" NOT INDEXE
d0b0: 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  D'',224))',\n". 
d0c0: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
d0d0: 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27 53  _query(printf('S
d0e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
d0f0: 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  w\" NOT INDEXED'
d100: 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a  ,name),224))\n".
d110: 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22      "  FROM (\n"
d120: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
d130: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
d140: 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20  e_master\n".    
d150: 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65  "     WHERE type
d160: 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20  ='table'\n".    
d170: 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65  "       AND name
d180: 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a  <>'selftest'\n".
d190: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
d1a0: 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
d1b0: 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20  e,0)>0\n".    " 
d1c0: 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45   )\n".    " ORDE
d1d0: 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20  R BY name;\n".  
d1e0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
d1f0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
d200: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27 72      "  VALUES('r
d210: 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
d220: 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
d230: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
d240: 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74  RT INTO selftest
d250: 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29  (tno,op,cmd,ans)
d260: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
d270: 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c  rowid*10,op,cmd,
d280: 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c  ans FROM [_shell
d290: 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22  $self];\n".    "
d2a0: 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  DROP TABLE [_she
d2b0: 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c  ll$self];".    ,
d2c0: 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20  0,0,&zErrMsg);. 
d2d0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
d2e0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d2f0: 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53  stderr, "SELFTES
d300: 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  T initialization
d310: 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c   failure: %s\n",
d320: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
d330: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
d340: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
d350: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
d360: 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73  "RELEASE selftes
d370: 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a  t_init",0,0,0);.
d380: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
d390: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
d3a0: 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
d3b0: 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75   ShellState stru
d3c0: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
d3d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
d3e0: 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
d3f0: 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
d400: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
d410: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
d420: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
d430: 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53  able_name(ShellS
d440: 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
d450: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
d460: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
d470: 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a  cQuote;.  char *
d480: 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65  z;..  if( p->zDe
d490: 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  stTable ){.    f
d4a0: 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c  ree(p->zDestTabl
d4b0: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74  e);.    p->zDest
d4c0: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Table = 0;.  }. 
d4d0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
d4e0: 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65  return;.  cQuote
d4f0: 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61   = quoteChar(zNa
d500: 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  me);.  n = strle
d510: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  n30(zName);.  if
d520: 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20  ( cQuote ) n += 
d530: 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  n+2;.  z = p->zD
d540: 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
d550: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
d560: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  z==0 ){.    raw_
d570: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
d580: 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
d590: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
d5a0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  t(1);.  }.  n = 
d5b0: 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  0;.  if( cQuote 
d5c0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
d5d0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  e;.  for(i=0; zN
d5e0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
d5f0: 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
d600: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
d610: 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20  me[i]==cQuote ) 
d620: 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
d630: 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74  .  }.  if( cQuot
d640: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
d650: 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  ote;.  z[n] = 0;
d660: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
d670: 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
d680: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67  ment that will g
d690: 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70  enerate SQL outp
d6a0: 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  ut.  Print.** th
d6b0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
d6c0: 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65  , comma-separate
d6d0: 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64  d, on a line and
d6e0: 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73   then add a.** s
d6f0: 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
d700: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
d710: 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  f that line..**.
d720: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
d730: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31   of columns is 1
d740: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
d750: 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22   contains text "
d760: 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  --".** then writ
d770: 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
d780: 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  on a separate li
d790: 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  ne.  That way, i
d7a0: 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d  f a.** "--" comm
d7b0: 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  ent occurs at th
d7c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61  e end of the sta
d7d0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d  tement, the comm
d7e0: 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e  ent.** won't con
d7f0: 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  sume the semicol
d800: 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  on terminator..*
d810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
d820: 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
d830: 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  y(.  ShellState 
d840: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
d850: 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a   Query context *
d860: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d870: 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20  zSelect,     /* 
d880: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d890: 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74   to extract cont
d8a0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
d8b0: 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20  har *zFirstRow  
d8c0: 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72    /* Print befor
d8d0: 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20  e first row, if 
d8e0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
d8f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d900: 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63  Select;.  int rc
d910: 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b  ;.  int nResult;
d920: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
d930: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20  t char *z;.  rc 
d940: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
d950: 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c  e_v2(p->db, zSel
d960: 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63  ect, -1, &pSelec
d970: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
d980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
d990: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74  Select ){.    ut
d9a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d9b0: 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
d9c0: 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
d9d0: 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
d9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
d9f0: 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
da00: 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
da10: 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
da20: 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
da30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
da40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
da50: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
da60: 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
da70: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
da80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
da90: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
daa0: 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69  W ){.    if( zFi
dab0: 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  rstRow ){.      
dac0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dad0: 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74  ut, "%s", zFirst
dae0: 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72  Row);.      zFir
daf0: 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  stRow = 0;.    }
db00: 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
db10: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
db20: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
db30: 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f  t, 0);.    utf8_
db40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
db50: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  %s", z);.    for
db60: 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=1; i<nResult;
db70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66   i++){.      utf
db80: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
db90: 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f   ",%s", sqlite3_
dba0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
dbb0: 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a  ect, i));.    }.
dbc0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
dbd0: 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
dbe0: 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21  ( z[0] && (z[0]!
dbf0: 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d  ='-' || z[1]!='-
dc00: 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  ') ) z++;.    if
dc10: 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[0] ){.      
dc20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
dc30: 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20  t, "\n;\n");.   
dc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
dc50: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
dc60: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20   ";\n");.    }. 
dc70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
dc80: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
dc90: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
dca0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
dcb0: 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ct);.  if( rc!=S
dcc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dcd0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dce0: 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
dcf0: 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
dd00: 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
dd10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd20: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
dd30: 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
dd40: 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
dd50: 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
dd60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
dd80: 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76  te space and sav
dd90: 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72  e off current er
dda0: 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ror string..*/.s
ddb0: 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65  tatic char *save
ddc0: 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69  _err_msg(.  sqli
ddd0: 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20  te3 *db         
dde0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
ddf0: 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  o query */.){.  
de00: 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b  int nErrMsg = 1+
de10: 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  strlen30(sqlite3
de20: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
de30: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
de40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
de50: 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  (nErrMsg);.  if(
de60: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
de70: 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20  memcpy(zErrMsg, 
de80: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
de90: 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20  b), nErrMsg);.  
dea0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d  }.  return zErrM
deb0: 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  sg;.}..#ifdef __
dec0: 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74  linux__./*.** At
ded0: 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79  tempt to display
dee0: 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69   I/O stats on Li
def0: 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f  nux using /proc/
df00: 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63  PID/io.*/.static
df10: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e   void displayLin
df20: 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a  uxIoStats(FILE *
df30: 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  out){.  FILE *in
df40: 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b  ;.  char z[200];
df50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
df60: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
df70: 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c  , "/proc/%d/io",
df80: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e   getpid());.  in
df90: 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22   = fopen(z, "rb"
dfa0: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
dfb0: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
dfc0: 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f  ( fgets(z, sizeo
dfd0: 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a  f(z), in)!=0 ){.
dfe0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
dff0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
e000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
e010: 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  tern;.      cons
e020: 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20  t char *zDesc;. 
e030: 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20     } aTrans[] = 
e040: 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72  {.      { "rchar
e050: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
e060: 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63        "Bytes rec
e070: 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a  eived by read():
e080: 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63  " },.      { "wc
e090: 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
e0a0: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
e0b0: 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a  sent to write():
e0c0: 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  "    },.      { 
e0d0: 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20  "syscr: ",      
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61              "Rea
e0f0: 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  d() system calls
e100: 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  :"      },.     
e110: 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20   { "syscw: ",   
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e130: 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63  Write() system c
e140: 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20  alls:"     },.  
e150: 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65      { "read_byte
e160: 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
e170: 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72    "Bytes read fr
e180: 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c  om storage:"  },
e190: 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f  .      { "write_
e1a0: 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
e1b0: 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74       "Bytes writ
e1c0: 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22  ten to storage:"
e1d0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e   },.      { "can
e1e0: 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74  celled_write_byt
e1f0: 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c  es: ",  "Cancell
e200: 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22  ed write bytes:"
e210: 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
e220: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
e230: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
e240: 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b  e(aTrans); i++){
e250: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  .      int n = (
e260: 69 6e 74 29 73 74 72 6c 65 6e 28 61 54 72 61 6e  int)strlen(aTran
e270: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a  s[i].zPattern);.
e280: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
e290: 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  p(aTrans[i].zPat
e2a0: 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29  tern, z, n)==0 )
e2b0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
e2c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
e2d0: 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d  s %s", aTrans[i]
e2e0: 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a  .zDesc, &z[n]);.
e2f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e310: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d  .  fclose(in);.}
e320: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
e330: 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20  isplay a single 
e340: 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75  line of status u
e350: 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75  sing 64-bit valu
e360: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
e370: 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  id displayStatLi
e380: 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ne(.  ShellState
e390: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e3a0: 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e  /* The shell con
e3b0: 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  text */.  char *
e3c0: 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20  zLabel,         
e3d0: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
e3e0: 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a   this one line *
e3f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  /.  char *zForma
e400: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
e410: 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   Format for the 
e420: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  result */.  int 
e430: 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20  iStatusCtrl,    
e440: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
e450: 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79  tatus to display
e460: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
e490: 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
e4a0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e4b0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
e4c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77  lite3_int64 iHiw
e4d0: 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  tr = -1;.  int i
e4e0: 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68  , nPercent;.  ch
e4f0: 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20  ar zLine[200];. 
e500: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36   sqlite3_status6
e510: 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26  4(iStatusCtrl, &
e520: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
e530: 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d  Reset);.  for(i=
e540: 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a  0, nPercent=0; z
e550: 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b  Format[i]; i++){
e560: 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74  .    if( zFormat
e570: 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63  [i]=='%' ) nPerc
e580: 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  ent++;.  }.  if(
e590: 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20   nPercent>1 ){. 
e5a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e5b0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
e5c0: 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61  ), zLine, zForma
e5d0: 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  t, iCur, iHiwtr)
e5e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e5f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e600: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
e610: 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
e620: 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61  Hiwtr);.  }.  ra
e630: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e640: 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
e650: 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d  Label, zLine);.}
e660: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
e670: 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f  memory stats..*/
e680: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
e690: 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c  lay_stats(.  sql
e6a0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
e6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e6c0: 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
e6d0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
e6e0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Arg,           /
e6f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
e700: 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llState */.  int
e710: 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e730: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
e740: 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ats */.){.  int 
e750: 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77  iCur;.  int iHiw
e760: 74 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 20  tr;..  if( pArg 
e770: 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b 0a  && pArg->out ){.
e780: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
e790: 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
e7a0: 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20  y Used:",.      
e7b0: 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
e7c0: 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
e7d0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
e7e0: 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
e7f0: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
e800: 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
e810: 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41  of Outstanding A
e820: 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20  llocations:",.  
e830: 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
e840: 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
e850: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
e860: 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  NT, bReset);.   
e870: 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
e880: 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61 67  Flgs & SHFLG_Pag
e890: 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20  ecache ){.      
e8a0: 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
e8b0: 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
e8c0: 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
e8d0: 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 22  ed:",.         "
e8e0: 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
e8f0: 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  pages", SQLITE_S
e900: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
e910: 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
e920: 20 20 20 7d 0a 20 20 20 20 64 69 73 70 6c 61 79     }.    display
e930: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
e940: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
e950: 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
e960: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
e970: 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
e980: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
e990: 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46  _PAGECACHE_OVERF
e9a0: 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  LOW, bReset);.  
e9b0: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
e9c0: 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74  e(pArg, "Largest
e9d0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20   Allocation:",. 
e9e0: 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65        "%lld byte
e9f0: 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
ea00: 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62  S_MALLOC_SIZE, b
ea10: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
ea20: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
ea30: 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61 63 68  , "Largest Pcach
ea40: 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a  e Allocation:",.
ea50: 20 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74         "%lld byt
ea60: 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
ea70: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
ea80: 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64  E, bReset);.#ifd
ea90: 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
eaa0: 43 4b 44 45 50 54 48 0a 20 20 20 20 64 69 73 70  CKDEPTH.    disp
eab0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
eac0: 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65  , "Deepest Parse
ead0: 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20  r Stack:",.     
eae0: 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
eaf0: 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
eb00: 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c  US_PARSER_STACK,
eb10: 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66   bReset);.#endif
eb20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67  .  }..  if( pArg
eb30: 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26   && pArg->out &&
eb40: 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70   db ){.    if( p
eb50: 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
eb60: 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
eb70: 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72   ){.      iHiwtr
eb80: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
eb90: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
eba0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
ebb0: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
ebc0: 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20  IDE_USED,.      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
ebf0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
ec00: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
ec10: 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
ec20: 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20       "Lookaside 
ec30: 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20  Slots Used:     
ec40: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d             %d (m
ec50: 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  ax %d)\n",.     
ec60: 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69           iCur, i
ec70: 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
ec80: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
ec90: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
eca0: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49  TUS_LOOKASIDE_HI
ecb0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
ecc0: 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
ecd0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
ece0: 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
ecf0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
ed00: 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b  "Successful look
ed10: 61 73 69 64 65 20 61 74 74 65 6d 70 74 73 3a 20  aside attempts: 
ed20: 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
ed30: 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
ed40: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
ed50: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
ed60: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
ed70: 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53  LOOKASIDE_MISS_S
ed80: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
eda0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
edb0: 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
edc0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
edd0: 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
ede0: 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a  lures due to siz
edf0: 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  e:      %d\n",. 
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
ee10: 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
ee20: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
ee30: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
ee40: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
ee50: 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20  _FULL,.         
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
ee70: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
ee80: 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
ee90: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
eea0: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
eeb0: 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f  ailures due to O
eec0: 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  OM:       %d\n",
eed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
eee0: 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Hiwtr);.    }.  
eef0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
ef00: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
ef10: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
ef20: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
ef30: 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75  CACHE_USED, &iCu
ef40: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
ef50: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
ef60: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
ef70: 50 61 67 65 72 20 48 65 61 70 20 55 73 61 67 65  Pager Heap Usage
ef80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ef90: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
efa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
efb0: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
efc0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
efd0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
efe0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
eff0: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
f000: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
f010: 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
f020: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f030: 22 50 61 67 65 20 63 61 63 68 65 20 68 69 74 73  "Page cache hits
f040: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
f050: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f060: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
f070: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
f080: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
f090: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
f0a0: 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53  TATUS_CACHE_MISS
f0b0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
f0c0: 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
f0d0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f0e0: 22 50 61 67 65 20 63 61 63 68 65 20 6d 69 73 73  "Page cache miss
f0f0: 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  es:             
f100: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f110: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
f120: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
f130: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
f140: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
f150: 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54  TATUS_CACHE_WRIT
f160: 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
f170: 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70  r, 1);.    raw_p
f180: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f190: 20 22 50 61 67 65 20 63 61 63 68 65 20 77 72 69   "Page cache wri
f1a0: 74 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  tes:            
f1b0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
f1c0: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
f1d0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
f1e0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
f1f0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
f200: 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53  STATUS_SCHEMA_US
f210: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
f220: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
f230: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f240: 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48  ->out, "Schema H
f250: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
f270: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
f280: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
f290: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f2a0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f2b0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f2c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
f2d0: 54 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  TMT_USED, &iCur,
f2e0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
f2f0: 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
f300: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74  f(pArg->out, "St
f310: 61 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f  atement Heap/Loo
f320: 6b 61 73 69 64 65 20 55 73 61 67 65 3a 20 20 20  kaside Usage:   
f330: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
f340: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
f350: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41  );.  }..  if( pA
f360: 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
f370: 26 26 20 64 62 20 26 26 20 70 41 72 67 2d 3e 70  && db && pArg->p
f380: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
f390: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
f3a0: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
f3b0: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
f3c0: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
f3d0: 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
f400: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f410: 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
f420: 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
f440: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
f450: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
f460: 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
f470: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
f480: 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
f490: 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
f4a0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
f4b0: 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
f4c0: 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
f4d0: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
f4e0: 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
f4f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
f500: 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
f510: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
f520: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
f530: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
f540: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f550: 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
f560: 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
f570: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
f580: 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
f590: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
f5a0: 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
f5b0: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
f5c0: 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
f5d0: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
f5e0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
f5f0: 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
f600: 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
f610: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
f620: 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
f630: 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
f640: 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
f650: 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
f660: 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
f670: 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
f680: 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
f690: 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
f6a0: 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
f6b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f6c0: 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
f6d0: 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
f6e0: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
f6f0: 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
f700: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f720: 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
f730: 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
f740: 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
f750: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f760: 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
f770: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
f780: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f790: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
f7a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f7b0: 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
f7c0: 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
f7d0: 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
f7e0: 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
f7f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f800: 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
f810: 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
f820: 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
f830: 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
f840: 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
f850: 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
f860: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
f870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
f880: 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
f890: 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
f8a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
f8b0: 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
f8c0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
f8d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
f8e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
f8f0: 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
f900: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
f910: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
f920: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
f930: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f940: 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
f950: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f960: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f970: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f980: 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
f990: 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
f9a0: 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
f9b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
f9c0: 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
f9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
f9e0: 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
f9f0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
fa00: 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
fa10: 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
fa20: 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
fa30: 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
fa40: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
fa50: 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
fa60: 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
fa70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fa80: 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
fa90: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
faa0: 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
fab0: 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
fac0: 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
fad0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fae0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
faf0: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
fb00: 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
fb10: 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
fb20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
fb30: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
fb40: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
fb50: 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
fb60: 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
fb70: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
fb80: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
fb90: 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
fba0: 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
fbb0: 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
fbc0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
fbd0: 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
fbe0: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
fbf0: 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
fc00: 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
fc10: 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
fc20: 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
fc30: 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
fc40: 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
fc50: 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
fc60: 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
fc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
fc80: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
fc90: 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
fcb0: 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
fcc0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
fcd0: 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
fce0: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
fcf0: 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
fd00: 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
fd10: 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
fd20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
fd30: 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
fd40: 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
fd50: 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
fd60: 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
fd70: 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
fd80: 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
fd90: 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
fda0: 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
fdb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fdc0: 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
fdd0: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
fde0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
fdf0: 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
fe00: 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
fe10: 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
fe20: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
fe30: 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
fe40: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
fe50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fe60: 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
fe70: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
fe80: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
fe90: 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
fea0: 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
feb0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
fec0: 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
fed0: 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
fee0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
fef0: 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
ff00: 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
ff10: 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
ff20: 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
ff30: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
ff40: 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
ff50: 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
ff60: 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
ff70: 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
ff80: 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
ff90: 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
ffa0: 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
ffb0: 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
ffc0: 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
ffd0: 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
ffe0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
fff0: 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
10000 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
10010 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
10020 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
10030 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
10040 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
10050 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
10060 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
10070 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
10080 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
10090 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
100a0 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
100b0 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
100c0 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
100d0 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
100e0 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
100f0 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
10100 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
10110 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
10120 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
10130 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
10140 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10150 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
10160 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
10170 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
10180 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
10190 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
101a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
101b0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
101c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
101d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
10200 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
10210 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
10220 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10240 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
10250 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
10260 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10280 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
10290 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
102a0 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
102b0 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
102e0 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
102f0 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
10300 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
10310 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
10320 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
10330 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
10340 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22   "NextIfOpen", "
10370 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d  PrevIfOpen", 0 }
10380 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10390 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
103a0 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
103b0 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
103c0 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
103f0 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
10400 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
10410 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
10420 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
10430 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
10440 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
10450 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
10460 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
10470 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
10480 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
10490 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
104a0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21  umn_count(pSql)!
104b0 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  =8 ){.    p->cMo
104c0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
104d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
104e0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
104f0 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  ql(pSql);.  if( 
10500 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
10510 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20  ;.  for(z=zSql; 
10520 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27  *z==' ' || *z=='
10530 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20  \t' || *z=='\n' 
10540 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a  || *z=='\f' || *
10550 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20  z=='\r'; z++);. 
10560 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
10570 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69  nicmp(z, "explai
10580 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d  n", 7) ){.    p-
10590 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
105a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
105b0 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  }..  for(iOp=0; 
105c0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
105d0 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
105e0 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
105f0 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
10600 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10610 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
10620 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10630 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
10640 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
10650 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
10660 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
10670 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
10680 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
10690 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
106a0 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
106b0 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
106c0 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
106d0 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
106e0 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
106f0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
10700 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
10710 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
10720 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
10730 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
10740 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
10750 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
10760 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
10770 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
10780 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
10790 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
107a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
107b0 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
107c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
107d0 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
107e0 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
107f0 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
10800 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
10810 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
10820 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
10830 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
10840 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66  lloc ){.      if
10850 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iOp==0 ){.    
10860 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65      /* Do furthe
10870 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68  r verfication th
10880 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61  at this is expla
10890 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72  in output.  Abor
108a0 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t if.        ** 
108b0 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20  it is not */.   
108c0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
108d0 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43  t char *explainC
108e0 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ols[] = {.      
108f0 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
10900 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
10910 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
10920 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d  p5", "comment" }
10930 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a  ;.        int jj
10940 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  ;.        for(jj
10950 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65  =0; jj<ArraySize
10960 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a  (explainCols); j
10970 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
10980 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
10990 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
109a0 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43  Sql,jj),explainC
109b0 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20  ols[jj])!=0 ){. 
109c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d             p->cM
109d0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
109e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
109f0 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
10a00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10a10 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
10a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a30 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  }.      nAlloc +
10a40 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 100;.      p->
10a50 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a  aiIndent = (int*
10a60 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
10a70 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  64(p->aiIndent, 
10a80 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
10a90 74 29 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65  t));.      abYie
10aa0 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ld = (int*)sqlit
10ab0 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59  e3_realloc64(abY
10ac0 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  ield, nAlloc*siz
10ad0 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 7d  eof(int));.    }
10ae0 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70  .    abYield[iOp
10af0 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  ] = str_in_array
10b00 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a  (zOp, azYield);.
10b10 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b      p->aiIndent[
10b20 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  iOp] = 0;.    p-
10b30 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31  >nIndent = iOp+1
10b40 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69  ;..    if( str_i
10b50 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e  n_array(zOp, azN
10b60 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  ext) ){.      fo
10b70 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
10b80 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
10b90 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
10ba0 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
10bb0 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74  array(zOp, azGot
10bc0 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49  o) && p2op<p->nI
10bd0 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61  ndent.     && (a
10be0 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20  bYield[p2op] || 
10bf0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
10c00 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20  nt(pSql, 2)).   
10c10 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
10c20 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
10c30 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
10c40 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 2;.    }.  }
10c50 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ..  p->iIndent =
10c60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
10c70 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73  ee(abYield);.  s
10c80 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
10c90 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
10ca0 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f  e the array allo
10cb0 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e  cated by explain
10cc0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e  _data_prepare().
10cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10ce0 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
10cf0 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ete(ShellState *
10d00 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
10d10 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
10d20 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
10d30 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
10d40 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
10d50 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
10d60 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73   Disable and res
10d70 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65  tore .wheretrace
10d80 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63   and .selecttrac
10d90 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23  e settings..*/.#
10da0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10db0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
10dc0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
10dd0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65  E_SELECTTRACE).e
10de0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
10df0 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74  3SelectTrace;.st
10e00 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65  atic int savedSe
10e10 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
10e20 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
10e30 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
10e40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
10e50 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
10e60 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
10e70 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73  te3WhereTrace;.s
10e80 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57  tatic int savedW
10e90 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
10ea0 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  f.static void di
10eb0 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
10ec0 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
10ed0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10ee0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
10ef0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
10f00 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
10f10 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
10f20 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  e = sqlite3Selec
10f30 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  tTrace;.  sqlite
10f40 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30  3SelectTrace = 0
10f50 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
10f60 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10f70 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
10f80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
10f90 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57  ETRACE).  savedW
10fa0 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69  hereTrace = sqli
10fb0 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
10fc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
10fd0 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  ce = 0;.#endif.}
10fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
10ff0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
11000 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
11010 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11020 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
11030 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11040 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
11050 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
11060 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74  ce = savedSelect
11070 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
11080 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11090 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
110a0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
110b0 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
110c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
110d0 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61   = savedWhereTra
110e0 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ce;.#endif.}../*
110f0 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72  .** Run a prepar
11100 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a  ed statement.*/.
11110 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63  static void exec
11120 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a  _prepared_stmt(.
11130 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
11140 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
11170 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
11180 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11190 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f    /* Statment to
111c0 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a   run */.  int (*
111d0 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
111e0 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72  ,int,char**,char
111f0 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f 2a 20 43 61  **,int*)   /* Ca
11200 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
11210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11220 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68  .  /* perform th
11230 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20 74  e first step.  t
11240 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73  his will tell us
11250 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65   if we.  ** have
11260 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72   a result set or
11270 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64   not and how wid
11280 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20  e it is..  */.  
11290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
112a0 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69  p(pStmt);.  /* i
112b0 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73 75  f we have a resu
112c0 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69  lt set... */.  i
112d0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
112e0 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 69 66   rc ){.    /* if
112f0 20 77 65 20 68 61 76 65 20 61 20 63 61 6c 6c 62   we have a callb
11300 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66  ack... */.    if
11310 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( xCallback ){. 
11320 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
11330 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
11340 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
11350 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
11360 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
11370 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11380 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
11390 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
113a0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
113b0 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  64(3*nCol*sizeof
113c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
113d0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  1);.      if( !p
113e0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
113f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11400 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
11410 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
11420 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a  zCols = (char **
11430 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  )pData;      /* 
11440 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20  Names of result 
11450 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
11460 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
11470 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
11480 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11490 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ts */.        in
114a0 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
114b0 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
114c0 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
114d0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  es */.        in
114e0 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 20 20  t i, x;.        
114f0 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
11500 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
11510 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 2f  r *));.        /
11520 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73 20  * save off ptrs 
11530 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  to column names 
11540 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
11550 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11560 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f  {.          azCo
11570 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
11580 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
11590 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
115a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
115b0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 2f   do{.          /
115c0 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
115d0 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
115e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  s */.          f
115f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
11600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
11610 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78    aiTypes[i] = x
11620 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
11630 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
11640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
11650 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ( x==SQLITE_BLOB
11660 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72 67   && pArg && pArg
11670 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e  ->cMode==MODE_In
11680 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sert ){.        
11690 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
116a0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
116b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
116c0 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
116d0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
116e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
116f0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
11700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11710 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
11720 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
11730 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
11740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11760 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  M;.             
11770 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
11780 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
11790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
117a0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
117b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
117c0 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
117d0 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
117e0 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
117f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11800 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
11810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
11820 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
11830 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
11840 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
11850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11860 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28 70 41  if( xCallback(pA
11870 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73  rg, nCol, azVals
11880 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65  , azCols, aiType
11890 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
118a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
118b0 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20  ABORT;.         
118c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
118e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
118f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
11900 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11910 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
11920 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
11930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11940 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
11950 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11960 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
11970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11980 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
11990 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63 20 3d     } while( rc =
119a0 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  = SQLITE_ROW );.
119b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
119c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
119d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
119e0 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
119f0 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
11a00 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
11a10 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
11a20 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
11a30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11a40 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
11a50 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
11a60 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
11a70 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11a80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11a90 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11aa0 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
11ab0 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
11ac0 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
11ad0 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
11ae0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11af0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
11b00 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
11b10 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
11b20 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
11b30 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
11b40 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
11b50 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
11b60 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
11b70 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
11b80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
11b90 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
11ba0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
11bb0 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
11bc0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
11bd0 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
11be0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
11bf0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
11c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
11c10 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
11c20 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11c30 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
11c40 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
11c50 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
11c60 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
11c70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c80 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
11c90 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
11ca0 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
11cb0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
11cc0 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
11cd0 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
11ce0 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
11cf0 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
11d00 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
11d10 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
11d20 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
11d30 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11d40 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
11d50 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11d60 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
11d70 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
11d80 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
11d90 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
11da0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
11db0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
11dc0 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
11dd0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
11de0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
11df0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
11e00 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
11e10 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
11e20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
11e30 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
11e40 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
11e50 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
11e60 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
11e70 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
11e80 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
11e90 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
11ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11eb0 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
11ec0 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
11ed0 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
11ee0 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
11ef0 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
11f00 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
11f10 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
11f20 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
11f30 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
11f40 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
11f50 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
11f60 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
11f70 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
11f80 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
11f90 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
11fa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11fc0 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
11fd0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
11fe0 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
11ff0 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
12000 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
12010 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12020 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
12030 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
12040 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
12050 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
12060 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12070 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
12080 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
12090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120a0 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
120b0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
120c0 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
120d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
120e0 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
120f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
12100 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
12110 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
12120 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
12130 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
12140 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
12150 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
12160 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
12170 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
12180 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
12190 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
121a0 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
121b0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
121c0 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
121d0 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
121e0 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
121f0 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
12200 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
12210 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
12220 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
12230 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
12240 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
12250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
12270 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
12280 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
12290 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
122a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
122b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
122c0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
122d0 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
122e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
122f0 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
12300 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
12310 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
12320 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
12330 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
12340 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
12350 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45   rc;.}.../*.** E
12360 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d 65  xecute a stateme
12370 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61  nt or set of sta
12380 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a  tements.  Print.
12390 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f  ** any result ro
123a0 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e  ws/columns depen
123b0 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72  ding on the curr
123c0 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20  ent mode.** set 
123d0 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65 64  via the supplied
123e0 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
123f0 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73 69   This is very si
12400 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27  milar to SQLite'
12410 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74  s built-in sqlit
12420 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e  e3_exec().** fun
12430 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20  ction except it 
12440 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79  takes a slightly
12450 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
12460 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62  ack.** and callb
12470 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e  ack data argumen
12480 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12490 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73   shell_exec(.  s
124a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
124d0 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
124e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
124f0 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
12500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12510 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  QL to be evaluat
12520 65 64 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ed */.  int (*xC
12530 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
12540 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a  nt,char**,char**
12550 2c 69 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61 6c  ,int*),   /* Cal
12560 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
12570 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125a0 20 28 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61   (not the same a
125b0 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 29 20  s sqlite3_exec) 
125c0 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
125d0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
12600 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  llState */.  cha
12610 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12640 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
12650 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
12660 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
12670 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  ULL;     /* Stat
12680 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
12690 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
126a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
126b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
126c0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72   Code */.  int r
126d0 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c2;.  const char
126e0 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20   *zLeftover;    
126f0 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
12700 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
12710 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72   */..  if( pzErr
12720 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Msg ){.    *pzEr
12730 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  rMsg = NULL;.  }
12740 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78  ..  if( pArg->ex
12750 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a  pert.pExpert ){.
12760 20 20 20 20 72 63 20 3d 20 65 78 70 65 72 74 48      rc = expertH
12770 61 6e 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a  andleSQL(pArg, z
12780 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  Sql, pzErrMsg);.
12790 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 65 72      return exper
127a0 74 46 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72  tFinish(pArg, (r
127b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70  c!=SQLITE_OK), p
127c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20  zErrMsg);.  }.. 
127d0 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20   while( zSql[0] 
127e0 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d  && (SQLITE_OK ==
127f0 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74   rc) ){.    stat
12800 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
12810 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20  StmtSql;.    rc 
12820 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
12830 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
12840 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
12850 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
12860 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
12870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
12880 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
12890 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
128a0 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
128b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
128c0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
128d0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
128e0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
128f0 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
12900 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
12910 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
12920 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
12930 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
12940 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
12950 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
12960 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
12970 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c    zStmtSql = sql
12980 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
12990 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74  .      if( zStmt
129a0 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71  Sql==0 ) zStmtSq
129b0 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68  l = "";.      wh
129c0 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 74  ile( IsSpace(zSt
129d0 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d  mtSql[0]) ) zStm
129e0 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  tSql++;..      /
129f0 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
12a00 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
12a10 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
12a20 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
12a30 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
12a40 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
12a50 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
12a60 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
12a70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
12a80 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
12a90 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
12aa0 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
12ab0 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53 68    if( pArg && Sh
12ac0 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c  ellHasFlag(pArg,
12ad0 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a   SHFLG_Echo) ){.
12ae0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
12af0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12b00 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20  %s\n", zStmtSql 
12b10 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71  ? zStmtSql : zSq
12b20 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
12b30 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45     /* Show the E
12b40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
12b50 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20  N if .eqp is on 
12b60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
12b70 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45  g && pArg->autoE
12b80 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  QP && sqlite3_st
12b90 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
12ba0 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20  ,zStmtSql,0)!=0 
12bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12bc0 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
12bd0 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
12be0 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69  *zEQP;.        i
12bf0 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d 20  nt triggerEQP = 
12c00 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  0;.        disab
12c10 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
12c20 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20  odes();.        
12c30 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
12c40 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
12c50 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
12c60 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45  P, -1, &triggerE
12c70 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
12c80 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
12c90 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
12ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12cb0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
12cc0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
12cd0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
12ce0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
12cf0 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20  .        zEQP = 
12d00 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12d10 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
12d20 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71  LAN %s", zStmtSq
12d30 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  l);.        rc =
12d40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
12d50 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
12d60 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
12d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
12d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
12da0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
12db0 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  lain)==SQLITE_RO
12dc0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
12dd0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12de0 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25  ->out,"--EQP-- %
12df0 64 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d,",sqlite3_colu
12e00 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
12e10 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
12e20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12e30 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71  g->out,"%d,", sq
12e40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12e50 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a  (pExplain, 1));.
12e60 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
12e70 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12e80 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f  ,"%d,", sqlite3_
12e90 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
12ea0 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20 20  ain, 2));.      
12eb0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
12ec0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c  f(pArg->out,"%s\
12ed0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
12ee0 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e  mn_text(pExplain
12ef0 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 3));.         
12f00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12f10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
12f20 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
12f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12f40 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
12f50 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
12f60 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
12f70 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
12f80 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
12f90 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
12fa0 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
12fb0 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
12fc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12fd0 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
12fe0 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
12ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13000 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
13010 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
13020 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
13030 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13050 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
13060 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
13070 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
13080 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
13090 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
130a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
130b0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
130c0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 2c  (pArg, pExplain,
130d0 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20   xCallback);.   
130e0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
130f0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
13100 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
13110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13120 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
13130 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
13140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51  sqlite3_free(zEQ
13150 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  P);.        }.  
13160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
13170 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
13180 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
13190 47 45 52 5f 45 51 50 2c 20 74 72 69 67 67 65 72  GER_EQP, trigger
131a0 45 51 50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  EQP, 0);.       
131b0 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74   restore_debug_t
131c0 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
131d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
131e0 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
131f0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70   pArg->cMode = p
13200 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  Arg->mode;.     
13210 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
13220 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20 20 20 20  oExplain.       
13230 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
13240 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
13250 3d 3d 38 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==8.         && 
13260 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
13270 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d  "EXPLAIN%", zStm
13280 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20  tSql,0)==0.     
13290 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
132a0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
132b0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
132c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
132d0 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69  * If the shell i
132e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22  s currently in "
132f0 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20  .explain" mode, 
13300 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61  gather the extra
13310 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
13320 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64   required to add
13330 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20   indents to the 
13340 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20  output.*/.      
13350 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64    if( pArg->cMod
13360 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
13370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
13380 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
13390 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  e(pArg, pStmt);.
133a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133b0 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72  }..      exec_pr
133c0 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67  epared_stmt(pArg
133d0 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c 6c 62 61  , pStmt, xCallba
133e0 63 6b 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ck);.      expla
133f0 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
13400 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
13410 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74  print usage stat
13420 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f  s if stats on */
13430 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
13440 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  && pArg->statsOn
13450 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
13460 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41  lay_stats(db, pA
13470 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rg, 0);.      }.
13480 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
13490 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69 66  loop-counters if
134a0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
134b0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
134c0 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e  Arg->scanstatsOn
134d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
134e0 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64 62  lay_scanstats(db
134f0 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , pArg);.      }
13500 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
13510 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ize the statemen
13520 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e  t just executed.
13530 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
13540 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
13550 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
13560 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72  r message. Other
13570 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74  wise, set zSql t
13580 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  o point to the. 
13590 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61       ** next sta
135a0 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
135b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20  e. */.      rc2 
135c0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
135d0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
135e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
135f0 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32  NOMEM ) rc = rc2
13600 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13620 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
13630 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
13640 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
13650 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
13660 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13670 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
13680 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
13690 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
136a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
136b0 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
136c0 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
136d0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
136e0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
136f0 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
13700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
13710 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
13720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13730 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
13740 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
13750 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 61   allocated by ta
13760 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  bleColumnList().
13770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13780 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63  freeColumnList(c
13790 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
137a0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  int i;.  for(i=1
137b0 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
137c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
137d0 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ee(azCol[i]);.  
137e0 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20  }.  /* azCol[0] 
137f0 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  is a static stri
13800 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ng */.  sqlite3_
13810 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
13820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  /*.** Return a l
13830 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ist of pointers 
13840 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63 68  to strings which
13850 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f   are the names o
13860 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  f all.** columns
13870 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e 20   in table zTab. 
13880 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20    The memory to 
13890 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 69  hold the names i
138a0 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
138b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
138c0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
138d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
138e0 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e 74  ing a subsequent
138f0 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65   call.** to free
13900 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a  ColumnList()..**
13910 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d  .** The azCol[0]
13920 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c 6c   entry is usuall
13930 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72  y NULL.  However
13940 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61 69  , if zTab contai
13950 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61  ns a rowid.** va
13960 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  lue that needs t
13970 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c 20  o be preserved, 
13980 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73  then azCol[0] is
13990 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
139a0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
139b0 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  he rowid column.
139c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
139d0 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20   regular column 
139e0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
139f0 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c  azCol[1].  The l
13a00 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
13a10 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72 79  d.** by an entry
13a20 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d   with azCol[i]==
13a30 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  0..*/.static cha
13a40 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c  r **tableColumnL
13a50 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ist(ShellState *
13a60 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
13a70 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61  Tab){.  char **a
13a80 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  zCol = 0;.  sqli
13a90 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13aa0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
13ab0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
13ac0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
13ad0 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20  .  int nPK = 0; 
13ae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13af0 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  of PRIMARY KEY c
13b00 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20  olumns seen */. 
13b10 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b 20   int isIPK = 0; 
13b20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
13b30 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ne PRIMARY KEY c
13b40 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e  olumn of type IN
13b50 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70  TEGER */.  int p
13b60 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20 53  reserveRowid = S
13b70 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
13b80 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
13b90 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  id);.  int rc;..
13ba0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13bb0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
13bc0 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c   table_info=%Q",
13bd0 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73   zTab);.  rc = s
13be0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
13bf0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
13c00 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
13c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
13c20 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
13c30 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
13c40 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
13c50 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
13c60 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43  OW ){.    if( nC
13c70 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a  ol>=nAlloc-2 ){.
13c80 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
13c90 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b  Alloc*2 + nCol +
13ca0 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c   10;.      azCol
13cb0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
13cc0 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63  oc(azCol, nAlloc
13cd0 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d  *sizeof(azCol[0]
13ce0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
13cf0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
13d00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
13d10 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
13d20 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
13d30 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
13d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13d50 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
13d60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13d70 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
13d80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
13d90 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
13da0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13db0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
13dc0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
13dd0 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
13de0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
13df0 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
13e00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
13e10 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
13e20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
13e40 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
13e50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
13e60 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
13e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
13e80 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
13e90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
13ea0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
13eb0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
13ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13ed0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
13ee0 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
13ef0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
13f00 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
13f10 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
13f20 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
13f30 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
13f40 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
13f50 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
13f60 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
13f70 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
13f80 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
13f90 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
13fa0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
13fb0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
13fc0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
13fd0 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
13fe0 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
13ff0 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
14000 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
14010 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
14020 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
14030 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
14040 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
14050 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
14060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
14070 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
14080 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
14090 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
140a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
140b0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
140c0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
140d0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
140e0 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
140f0 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
14100 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
14110 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
14120 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
14130 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14140 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
14150 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
14160 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
14170 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
14180 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
14190 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
141a0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
141b0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
141c0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
141d0 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
141e0 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
141f0 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
14200 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
14210 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
14220 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
14230 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
14240 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
14250 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
14260 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
14270 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
142a0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
142b0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
142c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
142d0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
142e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
142f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14300 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
14310 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
14320 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
14330 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14340 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
14350 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
14360 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
14370 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
14380 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
14390 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
143a0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
143b0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
143c0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
143d0 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
143e0 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
143f0 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
14400 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
14410 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
14420 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
14430 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
14440 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
14450 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
14460 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
14470 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
14480 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
14490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
144a0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
144b0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
144c0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
144d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
144e0 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
144f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
14500 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
14510 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
14520 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
14530 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
14540 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
14550 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
14560 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
14570 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
14580 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
14590 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
145a0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
145b0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
145c0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
145d0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
145e0 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
145f0 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
14600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14610 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
14620 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
14630 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
14640 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
14650 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14660 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
14670 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
14680 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
146a0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
146b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
146c0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
146d0 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
146e0 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
146f0 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
14700 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
14710 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
14720 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
14730 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
14740 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
14750 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
14760 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
14770 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
14780 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
14790 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
147a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
147b0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
147c0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
147d0 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
147e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
147f0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
14800 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
14810 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
14820 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
14830 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
14840 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
14850 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
14860 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
14870 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
14880 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
14890 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
148a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
148b0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
148c0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
148d0 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
148e0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
148f0 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
14900 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
14910 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
14920 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
14930 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
14940 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
14950 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
14960 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
14970 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
14980 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
14990 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
149a0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
149b0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
149c0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
149d0 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
149e0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
149f0 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
14a00 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
14a10 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
14a20 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
14a30 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
14a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a50 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
14a60 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
14a70 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
14a80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
14a90 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
14aa0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
14ab0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
14ac0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
14ad0 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
14ae0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
14af0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
14b00 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
14b10 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
14b20 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
14b30 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
14b40 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
14b50 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
14b60 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
14b70 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
14b80 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
14b90 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
14ba0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
14bb0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
14bc0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
14bd0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
14be0 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
14bf0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14c00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
14c10 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
14c20 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
14c30 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
14c40 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
14c50 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
14c60 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
14c70 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
14c80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
14c90 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
14ca0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
14cb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
14cc0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
14cd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
14ce0 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
14cf0 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
14d00 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
14d10 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
14d20 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
14d30 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
14d40 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
14d50 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
14d60 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
14d70 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
14d80 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
14d90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
14da0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
14db0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
14dc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
14de0 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
14df0 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
14e00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
14e10 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
14e20 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
14e30 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
14e40 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
14e50 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
14e60 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
14e70 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
14e80 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
14e90 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
14ea0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
14eb0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
14ec0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
14ed0 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
14ee0 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
14ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
14f00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
14f10 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
14f20 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
14f30 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
14f40 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
14f50 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
14f60 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
14f70 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
14f80 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
14f90 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
14fa0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
14fb0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
14fc0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
14fd0 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
14fe0 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
14ff0 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
15000 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
15010 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
15020 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
15030 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
15040 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
15050 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
15060 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
15070 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
15080 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
15090 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
150a0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
150b0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
150c0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
150d0 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
150e0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
150f0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
15100 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
15110 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
15120 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
15130 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
15140 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
15150 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
15160 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
15170 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
15180 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
15190 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
151a0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
151b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
151c0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
151d0 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
151e0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
151f0 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
15200 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
15210 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
15220 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
15230 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
15240 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
15250 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
15260 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
15270 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
15280 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
15290 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
152a0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
152b0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
152c0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
152d0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
152e0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
152f0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
15300 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
15310 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
15320 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
15330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
15340 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
15350 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
15360 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
15370 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
15380 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
15390 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
153a0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
153b0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
153c0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
153d0 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
153e0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
153f0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
15400 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
15410 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
15420 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
15430 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
15440 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
15450 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
15460 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
15470 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
15480 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
15490 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
154a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
154b0 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
154c0 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
154d0 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65  ");.      toggle
154e0 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64  SelectOrder(p->d
154f0 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  b);.      shell_
15500 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
15510 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
15520 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
15530 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
15540 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
15550 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
15560 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
15570 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
15580 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
15590 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
155a0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
155b0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
155c0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
155d0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
155e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
155f0 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
15600 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
15610 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
15620 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
15630 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
15640 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
15650 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
15660 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
15670 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
15680 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
15690 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
156a0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
156b0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
156c0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
156d0 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
156e0 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
156f0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
15700 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
15710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
15720 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
15730 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
15740 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
15750 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
15760 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
15770 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
15780 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15790 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
157a0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
157b0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
157c0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
157d0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
157e0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
157f0 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
15800 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
15810 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
15820 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
15830 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
15840 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
15850 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
15860 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
15870 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
15880 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
15890 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
158a0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
158b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
158c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
158d0 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
158e0 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
158f0 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
15900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15910 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
15920 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
15930 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
15940 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15950 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
15960 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
15970 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
15980 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
15990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
159a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
159b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
159c0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
159d0 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
159e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
159f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
15a00 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
15a10 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
15a20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 6e 64 65  zHelp[] =.#ifnde
15a30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15a40 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
15a50 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
15a60 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
15a70 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c  rizer callbacks\
15a80 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  n".#endif.  ".ba
15a90 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
15aa0 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
15ab0 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
15ac0 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e   to FILE\n".  ".
15ad0 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20  bail on|off     
15ae0 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
15af0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
15b00 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
15b10 6e 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  n".  ".binary on
15b20 7c 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72  |off         Tur
15b30 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
15b40 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
15b50 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63  ult OFF\n".  ".c
15b60 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
15b70 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
15b80 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
15b90 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e  y to DIRECTORY\n
15ba0 22 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ".  ".changes on
15bb0 7c 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77  |off        Show
15bc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
15bd0 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e  changed by SQL\n
15be0 22 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42  ".  ".check GLOB
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c              Fail
15c00 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65   if output since
15c10 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20   .testcase does 
15c20 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22  not match\n".  "
15c30 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20  .clone NEWDB    
15c40 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74         Clone dat
15c50 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f  a into NEWDB fro
15c60 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  m the existing d
15c70 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
15c80 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20  atabases        
15c90 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
15ca0 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
15cb0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c  ached databases\
15cc0 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44  n".  ".dbinfo ?D
15cd0 42 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  B?           Sho
15ce0 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
15cf0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
15d00 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
15d10 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
15d20 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
15d30 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
15d40 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
15d50 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
15d60 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
15d70 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
15d80 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
15d90 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
15dc0 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
15dd0 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
15de0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
15df0 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
15e00 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70  r off\n".  ".eqp
15e10 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20   on|off|full    
15e20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73     Enable or dis
15e30 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45  able automatic E
15e40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
15e50 4e 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20  N\n".  ".exit   
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
15e70 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
15e80 5c 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20  \n".  ".expert  
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
15ea0 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67  PERIMENTAL. Sugg
15eb0 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20  est indexes for 
15ec0 73 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65  specified querie
15ed0 73 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20  s\n"./* Because 
15ee0 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d  explain mode com
15ef0 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61  es on automatica
15f00 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65  lly now, the ".e
15f10 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20  xplain" mode.** 
15f20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
15f30 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e  the help screen.
15f40 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75    It is still su
15f50 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61  pported for lega
15f60 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f  cy, however */./
15f70 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f  *".explain ?on|o
15f80 66 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58  ff|auto? Turn EX
15f90 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64  PLAIN output mod
15fa0 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74  e on or off or t
15fb0 6f 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f  o automatic\n"*/
15fc0 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20  .  ".fullschema 
15fd0 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20  ?--indent? Show 
15fe0 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63  schema and the c
15ff0 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65  ontent of sqlite
16000 5f 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a  _stat tables\n".
16010 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f    ".headers on|o
16020 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 64  ff        Turn d
16030 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
16040 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
16050 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
16060 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
16070 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
16080 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
16090 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
160a0 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
160b0 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e  to TABLE\n".#ifn
160c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
160d0 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22  TEST_CONTROL.  "
160e0 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
160f0 54 41 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d  TABLE  Create im
16100 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42  poster table TAB
16110 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45  LE on index INDE
16120 58 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  X\n".#endif.  ".
16130 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20  indexes ?TABLE? 
16140 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
16150 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c   of all indexes\
16160 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
16180 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
16190 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
161a0 65 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c  exes for tables\
161b0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
161d0 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
161e0 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23  tern TABLE.\n".#
161f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16200 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e  BLE_IOTRACE.  ".
16210 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20  iotrace FILE    
16220 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
16230 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
16240 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23  ing to FILE\n".#
16250 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
16260 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
16270 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67  Display or chang
16280 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
16290 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e  n SQLITE_LIMIT\n
162a0 22 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f  ".  ".lint OPTIO
162b0 4e 53 20 20 20 20 20 20 20 20 20 20 52 65 70 6f  NS          Repo
162c0 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68  rt potential sch
162d0 65 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69  ema issues. Opti
162e0 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20  ons:\n".  "     
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
16310 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
16320 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
16330 64 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66  dexes\n".#ifndef
16340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
16350 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
16360 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
16370 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78  ?     Load an ex
16380 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c  tension library\
16390 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  n".#endif.  ".lo
163a0 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
163b0 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
163c0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
163d0 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
163e0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f  stdout\n".  ".mo
163f0 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
16400 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
16410 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69  ode where MODE i
16420 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22  s one of:\n".  "
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 61 73 63 69 69 20 20           ascii  
16450 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
16460 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
16470 20 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22   and 0x1E\n".  "
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20           csv    
164a0 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
164b0 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164d0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20          column  
164e0 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
164f0 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
16500 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20  dth)\n".  "     
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
16530 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e  L <table> code\n
16540 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
16560 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72  sert   SQL inser
16570 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  t statements for
16580 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20   TABLE\n".  "   
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f        line     O
165b0 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
165c0 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
165f0 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22   delimited by \"
16600 7c 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  |\"\n".  "      
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61     quote    Esca
16630 70 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f  pe answers as fo
16640 72 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20  r SQL\n".  "    
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61       tabs     Ta
16670 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75  b-separated valu
16680 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
166b0 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a  ist elements\n".
166c0 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54    ".nullvalue ST
166d0 52 49 4e 47 20 20 20 20 20 20 55 73 65 20 53 54  RING      Use ST
166e0 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66  RING in place of
166f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a   NULL values\n".
16700 20 20 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d    ".once FILENAM
16710 45 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74  E         Output
16720 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
16730 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
16740 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  o FILENAME\n".  
16750 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
16760 20 3f 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78   ?FILE? Close ex
16770 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
16780 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c  and reopen FILE\
16790 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
167b0 68 65 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20  he --new option 
167c0 73 74 61 72 74 73 20 77 69 74 68 20 61 6e 20 65  starts with an e
167d0 6d 70 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22  mpty file\n".  "
167e0 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d  .output ?FILENAM
167f0 45 3f 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70  E?     Send outp
16800 75 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f  ut to FILENAME o
16810 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e  r stdout\n".  ".
16820 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
16830 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65        Print lite
16840 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20  ral STRING\n".  
16850 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f  ".prompt MAIN CO
16860 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20  NTINUE  Replace 
16870 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f  the standard pro
16880 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74  mpts\n".  ".quit
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
168b0 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20  ram\n".  ".read 
168c0 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20  FILENAME        
168d0 20 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20   Execute SQL in 
168e0 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
168f0 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
16900 45 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f  E     Restore co
16910 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66  ntent of DB (def
16920 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66  ault \"main\") f
16930 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e  rom FILE\n".  ".
16940 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20 20  save FILE       
16950 20 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d        Write in-m
16960 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
16970 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e  nto FILE\n".  ".
16980 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66  scanstats on|off
16990 20 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74        Turn sqlit
169a0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
169b0 75 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20  us() metrics on 
169c0 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63  or off\n".  ".sc
169d0 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20  hema ?PATTERN?  
169e0 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45      Show the CRE
169f0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ATE statements m
16a00 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 5c  atching PATTERN\
16a10 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72  Add --indent for
16a40 20 70 72 65 74 74 79 2d 70 72 69 6e 74 69 6e 67   pretty-printing
16a50 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74 65 73 74  \n".  ".selftest
16a60 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52 75   ?--init?     Ru
16a70 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20  n tests defined 
16a80 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  in the SELFTEST 
16a90 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70  table\n".  ".sep
16aa0 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
16ab0 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f     Change the co
16ac0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 61  lumn separator a
16ad0 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68  nd optionally th
16ae0 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20  e row\n".  "    
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20 66       separator f
16b10 6f 72 20 62 6f 74 68 20 74 68 65 20 6f 75 74 70  or both the outp
16b20 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70  ut mode and .imp
16b30 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e  ort\n".#if defin
16b40 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
16b50 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65  _SESSION).  ".se
16b60 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20  ssion CMD ...   
16b70 20 20 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f      Create or co
16b80 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e  ntrol sessions\n
16b90 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61  ".#endif.  ".sha
16ba0 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e  3sum ?OPTIONS...
16bb0 3f 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41  ?  Compute a SHA
16bc0 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62 61  3 hash of databa
16bd0 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20  se content\n".  
16be0 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53  ".shell CMD ARGS
16bf0 2e 2e 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20  ...     Run CMD 
16c00 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
16c10 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22  tem shell\n".  "
16c20 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20  .show           
16c30 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
16c40 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
16c50 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
16c60 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73  ngs\n".  ".stats
16c70 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20   ?on|off?       
16c80 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74   Show stats or t
16c90 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20  urn stats on or 
16ca0 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65  off\n".  ".syste
16cb0 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20  m CMD ARGS...   
16cc0 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e   Run CMD ARGS...
16cd0 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65   in a system she
16ce0 6c 6c 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73  ll\n".  ".tables
16cf0 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20   ?TABLE?        
16d00 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
16d10 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  bles\n".  "     
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
16d40 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73  cified, only lis
16d50 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  t tables matchin
16d60 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
16d90 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74  BLE.\n".  ".test
16da0 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20  case NAME       
16db0 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74    Begin redirect
16dc0 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74  ing output to 't
16dd0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
16de0 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20  \n".  ".timeout 
16df0 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54 72  MS            Tr
16e00 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64  y opening locked
16e10 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d   tables for MS m
16e20 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20  illiseconds\n". 
16e30 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
16e40 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51           Turn SQ
16e50 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66  L timer on or of
16e60 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46  f\n".  ".trace F
16e70 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f  ILE|off        O
16e80 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73  utput each SQL s
16e90 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69  tatement as it i
16ea0 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73  s run\n".  ".vfs
16eb0 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20  info ?AUX?      
16ec0 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
16ed0 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
16ee0 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66  el VFS\n".  ".vf
16ef0 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
16f00 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61      List all ava
16f10 69 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a  ilable VFSes\n".
16f20 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
16f30 3f 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20  ?         Print 
16f40 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
16f50 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22  VFS stack\n".  "
16f60 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32  .width NUM1 NUM2
16f70 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d   ...   Set colum
16f80 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63  n widths for \"c
16f90 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a  olumn\" mode\n".
16fa0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 4e 65 67 61              Nega
16fc0 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68  tive values righ
16fd0 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a  t-justify\n".;..
16fe0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16ff0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
17000 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68  N)./*.** Print h
17010 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  elp information 
17020 66 6f 72 20 74 68 65 20 22 2e 73 65 73 73 69 6f  for the ".sessio
17030 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76  ns" command.*/.v
17040 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70  oid session_help
17050 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
17060 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
17070 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65 73 73  >out,.    ".sess
17080 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f  ion ?NAME? SUBCO
17090 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c  MMAND ?ARGS...?\
170a0 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d 45  n".    "If ?NAME
170b0 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
170c0 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
170d0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
170e0 5c 6e 22 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d  \n".    "Subcomm
170f0 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20  ands:\n".    "  
17100 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20   attach TABLE   
17110 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68            Attach
17120 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20   TABLE\n".    " 
17130 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45    changeset FILE
17140 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
17150 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74   a changeset int
17160 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20  o FILE\n".    " 
17170 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20    close         
17180 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65             Close
17190 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a   one session\n".
171a0 20 20 20 20 22 20 20 20 65 6e 61 62 6c 65 20 3f      "   enable ?
171b0 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20  BOOLEAN?        
171c0 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68   Set or query th
171d0 65 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a  e enable bit\n".
171e0 20 20 20 20 22 20 20 20 66 69 6c 74 65 72 20 47      "   filter G
171f0 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  LOB...          
17200 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d   Reject tables m
17210 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22  atching GLOBs\n"
17220 0a 20 20 20 20 22 20 20 20 69 6e 64 69 72 65 63  .    "   indirec
17230 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  t ?BOOLEAN?     
17240 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20    Mark or query 
17250 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61  the indirect sta
17260 74 75 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69  tus\n".    "   i
17270 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20  sempty          
17280 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68          Query wh
17290 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f  ether the sessio
172a0 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20  n is empty\n".  
172b0 20 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20    "   list      
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
172d0 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  ist currently op
172e0 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73  en session names
172f0 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f 70 65 6e  \n".    "   open
17300 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20   DB NAME        
17310 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20       Open a new 
17320 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22  session on DB\n"
17330 0a 20 20 20 20 22 20 20 20 70 61 74 63 68 73 65  .    "   patchse
17340 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  t FILE          
17350 20 20 57 72 69 74 65 20 61 20 70 61 74 63 68 73    Write a patchs
17360 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  et into FILE\n".
17370 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a    );.}.#endif...
17380 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
17390 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
173a0 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74  nt process_input
173b0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
173c0 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a  FILE *in);../*.*
173d0 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
173e0 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65  nt of file zName
173f0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
17400 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
17410 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a  e3_malloc64().**
17420 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
17430 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66  inter to the buf
17440 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  fer. The caller 
17450 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
17460 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68  or freeing.** th
17470 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  e memory..**.** 
17480 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42  If parameter pnB
17490 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  yte is not NULL,
174a0 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65   (*pnByte) is se
174b0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
174c0 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
174d0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76  ..**.** For conv
174e0 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74  enience, a nul-t
174f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
17500 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65  s always appende
17510 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65  d to the data re
17520 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ad.** from the f
17530 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  ile before the b
17540 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65  uffer is returne
17550 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
17560 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  not included in.
17570 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c  ** the final val
17580 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c  ue of (*pnByte),
17590 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a   if applicable..
175a0 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  **.** NULL is re
175b0 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72  turned if any er
175c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
175d0 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  ed. The final va
175e0 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a  lue of *pnByte.*
175f0 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
17600 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
17610 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
17620 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  dFile(const char
17630 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e   *zName, int *pn
17640 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  Byte){.  FILE *i
17650 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  n = fopen(zName,
17660 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e   "rb");.  long n
17670 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65  In;.  size_t nRe
17680 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66  ad;.  char *pBuf
17690 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
176a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65  return 0;.  fsee
176b0 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
176c0 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c  D);.  nIn = ftel
176d0 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
176e0 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  in);.  pBuf = sq
176f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
17700 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  nIn+1 );.  if( p
17710 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
17720 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65  0;.  nRead = fre
17730 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c  ad(pBuf, nIn, 1,
17740 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69   in);.  fclose(i
17750 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21  n);.  if( nRead!
17760 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
17770 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20  3_free(pBuf);.  
17780 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
17790 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b    pBuf[nIn] = 0;
177a0 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20  .  if( pnByte ) 
177b0 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20  *pnByte = nIn;. 
177c0 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
177d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
177e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
177f0 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  ON)./*.** Close 
17800 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73  a single OpenSes
17810 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20  sion object and 
17820 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69  release all of i
17830 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ts associated.**
17840 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73   resources..*/.s
17850 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
17860 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73  on_close(OpenSes
17870 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b  sion *pSession){
17880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
17890 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74  te3session_delet
178a0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a  e(pSession->p);.
178b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
178c0 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b  Session->zName);
178d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
178e0 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b  ession->nFilter;
178f0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
17900 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
17910 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a  ->azFilter[i]);.
17920 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
17930 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
17940 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74  ilter);.  memset
17950 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69  (pSession, 0, si
17960 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e  zeof(OpenSession
17970 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
17980 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70  .** Close all Op
17990 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  enSession object
179a0 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  s and release al
179b0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73  l associated res
179c0 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64  ources..*/.#if d
179d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
179e0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74  ABLE_SESSION).st
179f0 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
17a00 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c  n_close_all(Shel
17a10 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
17a20 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17a30 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
17a40 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e  ++){.    session
17a50 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73  _close(&p->aSess
17a60 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ion[i]);.  }.  p
17a70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  ->nSession = 0;.
17a80 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17a90 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
17aa0 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ll(X).#endif../*
17ab0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
17ac0 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65  on of the xFilte
17ad0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  r function for a
17ae0 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20  n open session. 
17af0 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62   Omit.** any tab
17b00 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73  les named by ".s
17b10 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62  ession filter" b
17b20 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72  ut let all other
17b30 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a   table through..
17b40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
17b50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
17b60 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74  SION).static int
17b70 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28   session_filter(
17b80 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73  void *pCtx, cons
17b90 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
17ba0 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53   OpenSession *pS
17bb0 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65  ession = (OpenSe
17bc0 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69  ssion*)pCtx;.  i
17bd0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
17be0 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69   i<pSession->nFi
17bf0 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lter; i++){.    
17c00 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
17c10 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  lob(pSession->az
17c20 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29  Filter[i], zTab)
17c30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
17c50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17c60 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
17c70 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
17c80 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
17c90 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
17ca0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17cb0 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
17cc0 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
17cd0 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
17ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17cf0 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
17d00 74 65 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41  te *p, int keepA
17d10 6c 69 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e  live){.  if( p->
17d20 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  db==0 ){.    sql
17d30 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
17d40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  );.    sqlite3_o
17d50 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  pen(p->zDbFilena
17d60 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  me, &p->db);.   
17d70 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
17d80 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
17d90 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
17da0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
17db0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
17dc0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
17dd0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
17de0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
17df0 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
17e00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
17e10 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
17e20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
17e30 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
17e40 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75  keepAlive ) retu
17e50 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  rn;.      exit(1
17e60 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
17e70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
17e80 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
17e90 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
17ea0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
17eb0 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
17ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17ed0 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
17ee0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17ef0 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
17f00 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
17f10 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
17f20 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
17f30 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
17f40 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
17f50 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
17f60 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
17f70 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
17f80 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
17f90 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
17fa0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
17fb0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
17fc0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
17fd0 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
17fe0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
18010 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
18020 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
18030 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
18040 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
18050 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
18060 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
18070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
18090 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
180a0 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  0, 0);.  }.}..#i
180b0 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20  f HAVE_READLINE 
180c0 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45  || HAVE_EDITLINE
180d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20  ./*.** Readline 
180e0 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62  completion callb
180f0 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  acks.*/.static c
18100 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  har *readline_co
18110 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
18120 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  or(const char *t
18130 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b  ext, int state){
18140 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
18150 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18160 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
18170 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20  .  if( state==0 
18180 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
18190 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  l;.    sqlite3_f
181a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
181b0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
181c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
181d0 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64  CT DISTINCT cand
181e0 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f  idate COLLATE no
181f0 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74   "  FROM complet
18220 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59  ion(%Q) ORDER BY
18230 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20   1", text);.    
18240 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
18250 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71  v2(globalDb, zSq
18260 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
18270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18280 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
18290 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
182a0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
182b0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74  _ROW ){.    zRet
182c0 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74   = strdup((const
182d0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
182e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
182f0 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , 0));.  }else{.
18300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
18310 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
18320 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
18330 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRet = 0;.  }.  
18340 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73  return zRet;.}.s
18350 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61  tatic char **rea
18360 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
18370 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
18380 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  xt, int iStart, 
18390 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f  int iEnd){.  rl_
183a0 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65  attempted_comple
183b0 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20  tion_over = 1;. 
183c0 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c   return rl_compl
183d0 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54  etion_matches(zT
183e0 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f  ext, readline_co
183f0 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
18400 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41  or);.}..#elif HA
18410 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a  VE_LINENOISE./*.
18420 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d  ** Linenoise com
18430 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
18440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18450 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65  linenoise_comple
18460 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
18470 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73  *zLine, linenois
18480 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63  eCompletions *lc
18490 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d  ){.  int nLine =
184a0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69   (int)strlen(zLi
184b0 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53  ne);.  int i, iS
184c0 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tart;.  sqlite3_
184d0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
184e0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
184f0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
18500 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73  ;..  if( nLine>s
18510 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29  izeof(zBuf)-30 )
18520 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a   return;.  if( z
18530 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72  Line[0]=='.' ) r
18540 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e  eturn;.  for(i=n
18550 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20  Line-1; i>=0 && 
18560 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69  (isalnum(zLine[i
18570 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d  ]) || zLine[i]==
18580 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  '_'); i--){}.  i
18590 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20  f( i==nLine-1 ) 
185a0 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74  return;.  iStart
185b0 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79   = i+1;.  memcpy
185c0 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53  (zBuf, zLine, iS
185d0 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  tart);.  zSql = 
185e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
185f0 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
18600 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41   candidate COLLA
18610 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20  TE nocase".     
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70      "  FROM comp
18640 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52  letion(%Q,%Q) OR
18650 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20  DER BY 1",.     
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72      &zLine[iStar
18680 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71  t], zLine);.  sq
18690 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
186a0 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c  (globalDb, zSql,
186b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
186c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
186d0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
186e0 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20  _exec(globalDb, 
186f0 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75  "PRAGMA page_cou
18700 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f  nt", 0, 0, 0); /
18710 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  * Load the schem
18720 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71  a */.  while( sq
18730 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18740 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18750 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
18760 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28  *zCompletion = (
18770 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
18780 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
18790 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
187a0 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d  nt nCompletion =
187b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
187c0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
187d0 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b  .    if( iStart+
187e0 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69  nCompletion < si
187f0 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a  zeof(zBuf)-1 ){.
18800 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
18810 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c  f+iStart, zCompl
18820 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69  etion, nCompleti
18830 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e  on+1);.      lin
18840 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74  enoiseAddComplet
18850 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20  ion(lc, zBuf);. 
18860 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18870 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
18880 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
18890 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
188a0 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
188b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20  g..**.**    \a  
188c0 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20    -> alarm.**   
188d0 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70   \b    -> backsp
188e0 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20  ace.**    \t    
188f0 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20  -> tab.**    \n 
18900 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a     -> newline.**
18910 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72      \v    -> ver
18920 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20  tical tab.**    
18930 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65  \f    -> form fe
18940 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d  ed.**    \r    -
18950 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72  > carriage retur
18960 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e  n.**    \s    ->
18970 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20   space.**    \" 
18980 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27     -> ".**    \'
18990 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c      -> '.**    \
189a0 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73  \    -> backslas
189b0 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e  h.**    \NNN  ->
189c0 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72   ascii character
189d0 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f   NNN in octal.*/
189e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
189f0 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
18a00 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74  (char *z){.  int
18a10 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b   i, j;.  char c;
18a20 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20  .  while( *z && 
18a30 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a  *z!='\\' ) z++;.
18a40 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
18a50 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
18a60 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
18a70 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d  =='\\' && z[i+1]
18a80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  !=0 ){.      c =
18a90 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
18aa0 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20  f( c=='a' ){.   
18ab0 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20       c = '\a';. 
18ac0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18ad0 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20  =='b' ){.       
18ae0 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20   c = '\b';.     
18af0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74   }else if( c=='t
18b00 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
18b10 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\t';.      }el
18b20 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b  se if( c=='n' ){
18b30 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e  .        c = '\n
18b40 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
18b50 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20  f( c=='v' ){.   
18b60 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20       c = '\v';. 
18b70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18b80 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20  =='f' ){.       
18b90 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20   c = '\f';.     
18ba0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
18bb0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
18bc0 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
18bd0 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
18be0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27  .        c = '"'
18bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
18c00 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
18c10 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20       c = '\'';. 
18c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18c30 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
18c40 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20    c = '\\';.    
18c50 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27    }else if( c>='
18c60 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a  0' && c<='7' ){.
18c70 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27          c -= '0'
18c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
18c90 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69  i+1]>='0' && z[i
18ca0 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  +1]<='7' ){.    
18cb0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
18cc0 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
18cd0 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
18ce0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
18cf0 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
18d00 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
18d10 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
18d20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33         c = (c<<3
18d30 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a  ) + z[i] - '0';.
18d40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18d60 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63    }.    z[j] = c
18d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20  ;.  }.  if( j<i 
18d80 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  ) z[j] = 0;.}../
18d90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18da0 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
18db0 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
18dc0 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
18dd0 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
18de0 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
18df0 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
18e00 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
18e10 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
18e20 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
18e30 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
18e40 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
18e50 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
18e60 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
18e70 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
18e80 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
18e90 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
18ea0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
18eb0 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
18ec0 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
18ed0 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
18ee0 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
18ef0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
18f00 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
18f10 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
18f20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18f30 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
18f40 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
18f50 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
18f60 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
18f70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
18f80 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
18f90 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
18fa0 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
18fb0 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
18fc0 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
18fd0 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
18fe0 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
18ff0 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
19000 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
19010 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
19020 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
19030 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
19040 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
19050 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
19060 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
19070 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
19080 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
19090 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
190a0 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
190b0 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
190c0 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
190d0 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
190e0 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
190f0 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
19100 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
19110 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
19120 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
19130 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
19140 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
19150 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
19160 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
19170 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
19180 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
19190 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
191a0 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
191b0 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
191c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
191d0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
191e0 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
191f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
19200 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
19210 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
19220 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
19230 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
19240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19250 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19260 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
19270 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
19280 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72  t zArg as either
19290 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61   an integer or a
192a0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
192b0 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a   Return 1 or 0.*
192c0 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46  * for TRUE and F
192d0 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68  ALSE.  Return th
192e0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
192f0 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
19300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
19310 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74  oleanValue(const
19320 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
19330 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72  int i;.  if( zAr
19340 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
19350 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
19360 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67   for(i=2; hexDig
19370 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29  itValue(zArg[i])
19380 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65  >=0; i++){}.  }e
19390 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
193a0 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
193b0 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
193c0 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28  i++){}.  }.  if(
193d0 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d   i>0 && zArg[i]=
193e0 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74  =0 ) return (int
193f0 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  )(integerValue(z
19400 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66  Arg) & 0xfffffff
19410 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f);.  if( sqlite
19420 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
19430 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
19440 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
19450 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
19460 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19470 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
19480 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
19490 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
194a0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
194b0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
194c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74  turn 0;.  }.  ut
194d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
194e0 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20  , "ERROR: Not a 
194f0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c  boolean value: \
19500 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20  "%s\". Assuming 
19510 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"no\".\n",.    
19520 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72        zArg);.  r
19530 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
19540 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
19550 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f   shell flag acco
19560 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65  rding to a boole
19570 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
19580 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c  tic void setOrCl
19590 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61  earFlag(ShellSta
195a0 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  te *p, unsigned 
195b0 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61  mFlag, const cha
195c0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20  r *zArg){.  if( 
195d0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72  booleanValue(zAr
195e0 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  g) ){.    ShellS
195f0 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  etFlag(p, mFlag)
19600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
19610 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
19620 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a   mFlag);.  }.}..
19630 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
19640 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
19650 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
19660 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
19670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
19680 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
19690 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
196a0 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
196b0 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
196c0 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
196d0 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
196e0 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
196f0 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
19700 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
19710 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
19720 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
19730 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
19740 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19750 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69  the output.** fi
19760 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e  lename is "off".
19770 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .*/.static FILE 
19780 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65  *output_file_ope
19790 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
197a0 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ile){.  FILE *f;
197b0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
197c0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
197d0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
197e0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
197f0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
19800 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
19810 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
19820 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
19830 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
19840 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
19850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
19860 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77   fopen(zFile, "w
19870 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d  b");.    if( f==
19880 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
19890 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
198a0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
198b0 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
198c0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
198d0 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23    return f;.}..#
198e0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
198f0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a 23  TE_UNTESTABLE).#
19900 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
19910 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
19920 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19930 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19940 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72  POINT)./*.** A r
19950 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c  outine for handl
19960 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  ing output from 
19970 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e  sqlite3_trace().
19980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19990 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63  ql_trace_callbac
199a0 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  k(.  unsigned mT
199b0 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  ype,.  void *pAr
199c0 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20  g,.  void *pP,. 
199d0 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46   void *pX.){.  F
199e0 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29  ILE *f = (FILE*)
199f0 70 41 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50  pArg;.  UNUSED_P
19a00 41 52 41 4d 45 54 45 52 28 6d 54 79 70 65 29 3b  ARAMETER(mType);
19a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19a20 54 45 52 28 70 50 29 3b 0a 20 20 69 66 28 20 66  TER(pP);.  if( f
19a30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
19a40 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
19a50 68 61 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74  har*)pX;.    int
19a60 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   i = (int)strlen
19a70 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
19a80 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
19a90 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
19aa0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
19ab0 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
19ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19ad0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
19ae0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70  f../*.** A no-op
19af0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75   routine that ru
19b00 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72  ns with the ".br
19b10 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f  eakpoint" doc-co
19b20 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a  mmand.  This is.
19b30 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74  ** a useful spot
19b40 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67   to set a debugg
19b50 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a  er breakpoint..*
19b60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
19b70 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f  st_breakpoint(vo
19b80 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
19b90 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
19ba0 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Call++;.}../*.**
19bb0 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20   An object used 
19bc0 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61 6e  to read a CSV an
19bd0 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f  d other files fo
19be0 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70  r import..*/.typ
19bf0 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f  edef struct Impo
19c00 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b  rtCtx ImportCtx;
19c10 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74  .struct ImportCt
19c20 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x {.  const char
19c30 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d   *zFile;  /* Nam
19c40 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
19c50 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ile */.  FILE *i
19c60 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
19c70 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65 78  Read the CSV tex
19c80 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  t from this inpu
19c90 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68  t stream */.  ch
19ca0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
19cb0 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64    /* Accumulated
19cc0 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c   text for a fiel
19cd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19cf0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
19d00 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c   z */.  int nAll
19d10 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  oc;         /* S
19d20 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
19d30 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  or z[] */.  int 
19d40 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  nLine;          
19d50 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20  /* Current line 
19d60 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
19d70 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20  bNotFirst;      
19d80 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f  /* True if one o
19d90 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72  r more bytes alr
19da0 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69  eady read */.  i
19db0 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20  nt cTerm;       
19dc0 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20     /* Character 
19dd0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20  that terminated 
19de0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
19df0 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63  field */.  int c
19e00 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f  ColSep;        /
19e10 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  * The column sep
19e20 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
19e30 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29  .  (Usually ",")
19e40 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65   */.  int cRowSe
19e50 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
19e60 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63   row separator c
19e70 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
19e80 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a  lly "\n") */.};.
19e90 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  ./* Append a sin
19ea0 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20  gle byte to z[] 
19eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
19ec0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
19ed0 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20  r(ImportCtx *p, 
19ee0 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d  int c){.  if( p-
19ef0 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20  >n+1>=p->nAlloc 
19f00 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  ){.    p->nAlloc
19f10 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20   += p->nAlloc + 
19f20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  100;.    p->z = 
19f30 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
19f40 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  4(p->z, p->nAllo
19f50 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
19f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
19f70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
19f80 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
19f90 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
19fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
19fb0 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63  ->z[p->n++] = (c
19fc0 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61  har)c;.}../* Rea
19fd0 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  d a single field
19fe0 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43   of CSV text.  C
19ff0 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72  ompatible with r
1a000 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e  fc4180 and exten
1a010 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ded.** with the 
1a020 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67  option of having
1a030 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68   a separator oth
1a040 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a  er than ","..**.
1a050 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
1a060 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
1a070 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
1a080 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
1a090 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
1a0a0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
1a0b0 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
1a0c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1a0d0 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
1a0e0 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
1a0f0 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
1a100 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1a110 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20  lt is ","..**   
1a120 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61  +  Use p->rSep a
1a130 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  s the row separa
1a140 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1a150 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20  t is "\n"..**   
1a160 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  +  Keep track of
1a170 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
1a180 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
1a190 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
1a1a0 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
1a1b0 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
1a1c0 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
1a1d0 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
1a1e0 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
1a1f0 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
1a200 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
1a210 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
1a220 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
1a230 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64  E_CDECL csv_read
1a240 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
1a250 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
1a260 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
1a270 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
1a280 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
1a290 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
1a2a0 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
1a2b0 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
1a2c0 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
1a2d0 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
1a2e0 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
1a2f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1a300 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
1a310 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20  int pc, ppc;.   
1a320 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
1a330 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69   p->nLine;.    i
1a340 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20  nt cQuote = c;. 
1a350 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b     pc = ppc = 0;
1a360 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
1a370 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
1a380 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
1a390 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e  f( c==rSep ) p->
1a3a0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
1a3b0 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  f( c==cQuote ){.
1a3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
1a3d0 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
1a3e0 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20      pc = 0;.    
1a3f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a410 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d  }.      if( (c==
1a420 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  cSep && pc==cQuo
1a430 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
1a440 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==rSep && pc==cQ
1a450 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
1a460 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
1a470 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75  '\r' && ppc==cQu
1a480 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
1a490 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51  c==EOF && pc==cQ
1a4a0 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  uote).      ){. 
1a4b0 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d         do{ p->n-
1a4c0 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b  -; }while( p->z[
1a4d0 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b  p->n]!=cQuote );
1a4e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
1a4f0 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
1a500 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a510 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
1a520 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b  te && c!='\r' ){
1a530 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1a540 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
1a550 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25  :%d: unescaped %
1a560 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a  c character\n",.
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69  p->zFile, p->nLi
1a590 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
1a5a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1a5b0 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20  ==EOF ){.       
1a5c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1a5d0 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74  err, "%s:%d: unt
1a5e0 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f  erminated %c-quo
1a5f0 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20  ted field\n",.  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a610 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  >zFile, startLin
1a620 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  e, cQuote);.    
1a630 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
1a640 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a660 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1a670 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
1a680 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
1a690 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
1a6a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1a6b0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1a6c0 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61  t field being pa
1a6d0 72 73 65 64 20 61 6e 64 20 69 74 20 62 65 67 69  rsed and it begi
1a6e0 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ns with the.    
1a6f0 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30  ** UTF-8 BOM  (0
1a700 78 45 46 20 42 42 20 42 46 29 20 74 68 65 6e 20  xEF BB BF) then 
1a710 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a  skip the BOM */.
1a720 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
1a730 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f  ==0xef && p->bNo
1a740 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  tFirst==0 ){.   
1a750 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1a760 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1a770 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1a780 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  in);.      if( (
1a790 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b  c&0xff)==0xbb ){
1a7a0 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  .        import_
1a7b0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1a7c0 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66  );.        c = f
1a7d0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
1a7e0 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
1a7f0 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20  )==0xbf ){.     
1a800 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73       p->bNotFirs
1a810 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
1a820 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20   p->n = 0;.     
1a830 20 20 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f       return csv_
1a840 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70  read_one_field(p
1a850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
1a870 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
1a880 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53  c!=cSep && c!=rS
1a890 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  ep ){.      impo
1a8a0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1a8b0 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
1a8c0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1a8d0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72    }.    if( c==r
1a8e0 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sep ){.      p->
1a8f0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
1a900 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e  f( p->n>0 && p->
1a910 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20  z[p->n-1]=='\r' 
1a920 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  ) p->n--;.    }.
1a930 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
1a940 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
1a950 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
1a960 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73  0;.  p->bNotFirs
1a970 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
1a980 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  p->z;.}../* Read
1a990 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
1a9a0 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74  of ASCII delimit
1a9b0 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed text..**.**  
1a9c0 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
1a9d0 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
1a9e0 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
1a9f0 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
1aa00 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
1aa10 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
1aa20 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
1aa30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1aa40 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
1aa50 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
1aa60 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1aa70 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1aa80 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b  s "\x1F"..**   +
1aa90 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73    Use p->rSep as
1aaa0 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
1aab0 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
1aac0 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20   is "\x1E"..**  
1aad0 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   +  Keep track o
1aae0 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72  f the row number
1aaf0 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
1ab00 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
1ab10 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
1ab20 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
1ab30 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
1ab40 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
1ab50 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
1ab60 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
1ab70 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
1ab80 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
1ab90 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
1aba0 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65  E_CDECL ascii_re
1abb0 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
1abc0 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
1abd0 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
1abe0 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
1abf0 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
1ac00 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
1ac10 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
1ac20 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
1ac30 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
1ac40 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
1ac50 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
1ac60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ac70 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
1ac80 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
1ac90 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72  Sep ){.    impor
1aca0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1acb0 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65   c);.    c = fge
1acc0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20  tc(p->in);.  }. 
1acd0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
1ace0 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1acf0 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d    }.  p->cTerm =
1ad00 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29   c;.  if( p->z )
1ad10 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
1ad20 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
1ad30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
1ad40 74 72 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f  transfer data fo
1ad50 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20  r table zTable. 
1ad60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
1ad70 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f  seen while.** mo
1ad80 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72  ving forward, tr
1ad90 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64  y to go backward
1ada0 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72 64  s.  The backward
1adb0 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74  s movement won't
1adc0 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54  .** work for WIT
1add0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1ade0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1adf0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  d tryToCloneData
1ae00 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
1ae10 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  p,.  sqlite3 *ne
1ae20 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  wDb,.  const cha
1ae30 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73  r *zTable.){.  s
1ae40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
1ae50 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ery = 0;.  sqlit
1ae60 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
1ae70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
1ae80 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
1ae90 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *zInsert = 0;. 
1aea0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1aeb0 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54  , j, n;.  int nT
1aec0 61 62 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  able = (int)strl
1aed0 65 6e 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  en(zTable);.  in
1aee0 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
1aef0 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
1af00 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
1af10 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
1af20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1af30 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1af40 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
1af50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1af60 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1af70 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1af80 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1af90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1afa0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1afb0 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
1afc0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1afd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1afe0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1aff0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1b000 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1b010 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1b020 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1b030 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
1b040 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
1b050 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
1b060 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
1b070 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1b080 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
1b090 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
1b0a0 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
1b0b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1b0c0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
1b0d0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
1b0e0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1b0f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1b100 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1b110 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1b120 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1b130 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1b140 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1b150 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1b160 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b170 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
1b180 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
1b190 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
1b1a0 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
1b1b0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
1b1c0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1b1d0 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
1b1e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1b1f0 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
1b200 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
1b210 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
1b220 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1b230 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1b240 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
1b250 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1b260 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1b270 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1b280 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1b290 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
1b2a0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1b2b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
1b2c0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
1b2d0 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
1b2e0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
1b2f0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1b300 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1b310 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
1b320 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1b330 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
1b340 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
1b350 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
1b360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
1b370 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
1b380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1b390 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1b3a0 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
1b3b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b3d0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1b3e0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
1b3f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b400 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
1b410 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1b420 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1b430 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
1b440 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b460 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1b470 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
1b480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b490 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
1b4a0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1b4b0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
1b4c0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
1b4d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b4f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b500 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
1b510 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b520 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
1b530 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1b560 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1b570 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
1b5a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b5b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b5c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b5d0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b5e0 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
1b5f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b600 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
1b610 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
1b620 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
1b630 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1b670 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
1b680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b6b0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b6c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b6d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1b6f0 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
1b700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1b710 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
1b720 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b730 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1b740 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
1b750 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1b760 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1b770 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1b780 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
1b790 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1b7a0 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
1b7d0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
1b7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1b7f0 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
1b800 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
1b810 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
1b820 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
1b830 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
1b840 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
1b850 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
1b860 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1b870 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1b880 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
1b890 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
1b8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b8b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
1b8c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1b8d0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1b8e0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1b8f0 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1b900 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b910 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1b920 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
1b930 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
1b960 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b970 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1b980 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1b990 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1b9a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b9b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1b9c0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
1b9d0 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
1b9e0 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
1b9f0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1ba00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
1ba10 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
1ba20 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
1ba30 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1ba40 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1ba50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1ba60 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
1ba70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1ba80 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1ba90 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
1baa0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1bab0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
1bac0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
1bad0 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
1bae0 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
1baf0 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
1bb00 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
1bb10 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
1bb20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
1bb30 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1bb40 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
1bb50 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
1bb60 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
1bb70 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
1bb80 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
1bb90 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
1bba0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1bbb0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
1bbc0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1bbd0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1bbe0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bbf0 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
1bc00 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
1bc10 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
1bc20 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
1bc30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bc40 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1bc50 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1bc60 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
1bc70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1bc80 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
1bc90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
1bca0 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1bcb0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
1bcc0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1bcd0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1bce0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1bcf0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1bd20 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
1bd30 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1bd40 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1bd50 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1bd60 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1bd70 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1bd80 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1bd90 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
1bda0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1bdb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bdc0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1bdd0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1bde0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1bdf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be00 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1be10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1be20 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
1be30 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1be40 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1be50 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1be60 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1be70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1be80 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1be90 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1bea0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1beb0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
1bec0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
1bed0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
1bee0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1bef0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1bf00 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1bf10 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1bf20 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
1bf30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1bf40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1bf50 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1bf60 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1bf70 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
1bf80 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1bf90 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
1bfa0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
1bfb0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1bfc0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
1bfd0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
1bfe0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
1bff0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
1c000 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
1c010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c020 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
1c030 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1c040 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1c050 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1c060 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1c070 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1c080 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1c090 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1c0a0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
1c0d0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1c0e0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
1c0f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1c100 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1c110 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1c120 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1c130 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1c140 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1c150 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1c160 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1c190 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1c1a0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1c1b0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1c1d0 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
1c1e0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
1c1f0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
1c200 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1c210 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1c220 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1c230 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
1c240 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1c250 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1c260 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1c270 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c280 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
1c290 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1c2a0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1c2b0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1c2c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1c2d0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1c2e0 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1c2f0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
1c300 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1c310 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1c320 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1c330 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
1c340 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
1c350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c360 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1c370 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
1c380 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
1c390 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
1c3a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
1c3b0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1c3c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1c3d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1c3e0 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1c3f0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
1c400 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
1c410 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1c420 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
1c430 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1c440 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
1c450 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1c460 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
1c470 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
1c480 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
1c490 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
1c4a0 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
1c4b0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1c4c0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
1c4d0 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
1c4e0 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
1c4f0 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
1c500 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1c510 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
1c520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
1c530 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
1c540 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1c550 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
1c560 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
1c570 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1c580 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
1c590 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
1c5a0 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
1c5b0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
1c5c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1c5d0 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
1c5e0 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
1c5f0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1c600 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
1c610 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
1c620 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
1c630 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c640 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1c650 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
1c660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
1c670 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1c680 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1c690 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
1c6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1c6b0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
1c6c0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
1c6d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
1c6e0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1c6f0 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
1c700 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
1c710 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
1c720 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1c730 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
1c740 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
1c750 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1c760 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
1c770 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1c780 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1c790 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
1c7a0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
1c7b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
1c7c0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65  sqlite3_close(ne
1c7d0 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
1c7e0 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
1c7f0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
1c800 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1c810 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
1c820 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1c830 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
1c840 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
1c850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c860 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73  _POPEN.    pclos
1c870 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  e(p->out);.#endi
1c880 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  f.  }else{.    o
1c890 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
1c8a0 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  (p->out);.  }.  
1c8b0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
1c8c0 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
1c8d0 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
1c8e0 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
1c8f0 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
1c900 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
1c910 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
1c920 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
1c930 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
1c940 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1c950 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c960 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
1c970 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
1c980 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1c990 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1c9a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
1c9b0 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
1c9c0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1c9d0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
1c9e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1c9f0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
1ca00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
1ca10 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1ca20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1ca30 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1ca40 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
1ca50 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ca60 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
1ca70 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
1ca80 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1ca90 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
1caa0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1cab0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1cac0 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
1cad0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1cae0 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
1caf0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1cb00 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1cb10 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
1cb20 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
1cb30 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
1cb40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1cb50 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
1cb60 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
1cb70 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
1cb80 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
1cb90 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1cba0 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
1cbb0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
1cbc0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1cbd0 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
1cbe0 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
1cbf0 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
1cc00 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
1cc10 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
1cc20 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
1cc30 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
1cc40 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
1cc50 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
1cc60 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1cc70 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
1cc80 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
1cc90 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
1cca0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
1ccb0 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
1ccc0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
1ccd0 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
1cce0 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
1ccf0 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
1cd00 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
1cd10 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
1cd20 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
1cd30 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
1cd40 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
1cd50 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
1cd60 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
1cd70 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
1cd80 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
1cd90 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
1cda0 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
1cdb0 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
1cdc0 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
1cdd0 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
1cde0 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
1cdf0 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
1ce00 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1ce10 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1ce20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
1ce30 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
1ce40 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
1ce50 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1ce60 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
1ce70 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
1ce80 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
1ce90 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
1cea0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
1ceb0 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
1cec0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
1ced0 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
1cee0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
1cef0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1cf00 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
1cf10 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1cf20 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1cf30 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1cf40 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
1cf50 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
1cf60 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
1cf70 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1cf80 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1cf90 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
1cfa0 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
1cfb0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1cfc0 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
1cfd0 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
1cfe0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
1cff0 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
1d000 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
1d010 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
1d020 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
1d030 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d040 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Stmt = 0;.  unsi
1d050 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
1d060 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
1d070 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
1d080 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1d090 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1d0a0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c  re_v2(p->db,"SEL
1d0b0 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71  ECT data FROM sq
1d0c0 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20  lite_dbpage(?1) 
1d0d0 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20  WHERE pgno=1",. 
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
1d100 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  0);.  sqlite3_bi
1d110 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
1d120 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54  , zDb, -1, SQLIT
1d130 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
1d140 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1d150 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1d160 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63  .   && sqlite3_c
1d170 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1d180 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20  t,0)>100.  ){.  
1d190 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73    memcpy(aHdr, s
1d1a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1d1b0 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30  ob(pStmt,0), 100
1d1c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1d1d0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1d1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
1d1f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d200 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "unable to read 
1d210 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c  database header\
1d220 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1d230 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1d240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
1d250 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79    }.  i = get2by
1d260 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a  teInt(aHdr+16);.
1d270 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d    if( i==1 ) i =
1d280 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70   65536;.  utf8_p
1d290 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1d2a0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74  -20s %d\n", "dat
1d2b0 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a  abase page size:
1d2c0 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72  ", i);.  utf8_pr
1d2d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1d2e0 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74  20s %d\n", "writ
1d2f0 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  e format:", aHdr
1d300 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [18]);.  utf8_pr
1d310 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1d320 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64  20s %d\n", "read
1d330 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
1d340 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  19]);.  utf8_pri
1d350 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1d360 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72  0s %d\n", "reser
1d370 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64  ved bytes:", aHd
1d380 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  r[20]);.  for(i=
1d390 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1d3a0 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20  Field); i++){.  
1d3b0 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69    int ofst = aFi
1d3c0 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20  eld[i].ofst;.   
1d3d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61   unsigned int va
1d3e0 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28  l = get4byteInt(
1d3f0 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20  aHdr + ofst);.  
1d400 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1d410 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22  >out, "%-20s %u"
1d420 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d  , aField[i].zNam
1d430 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69  e, val);.    swi
1d440 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20  tch( ofst ){.   
1d450 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20     case 56: {.  
1d460 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31        if( val==1
1d470 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
1d480 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29  >out, " (utf8)")
1d490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  ;.        if( va
1d4a0 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74  l==2 ) raw_print
1d4b0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
1d4c0 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20  16le)");.       
1d4d0 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61   if( val==3 ) ra
1d4e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
1d4f0 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a   " (utf16be)");.
1d500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d510 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
1d520 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  out, "\n");.  }.
1d530 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a    if( zDb==0 ){.
1d540 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
1d550 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1d560 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  ("main.sqlite_ma
1d570 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ster");.  }else 
1d580 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22  if( strcmp(zDb,"
1d590 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  temp")==0 ){.   
1d5a0 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
1d5b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1d5c0 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  s", "sqlite_temp
1d5d0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
1d5e0 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54  se{.    zSchemaT
1d5f0 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
1d600 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c  intf("\"%w\".sql
1d610 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62  ite_master", zDb
1d620 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1d630 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51  ; i<ArraySize(aQ
1d640 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  uery); i++){.   
1d650 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1d660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51  lite3_mprintf(aQ
1d670 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53  uery[i].zSql, zS
1d680 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69  chemaTab);.    i
1d690 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28  nt val = db_int(
1d6a0 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  p, zSql);.    sq
1d6b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1d6c0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
1d6d0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1d6e0 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69   %d\n", aQuery[i
1d6f0 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
1d700 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1d710 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20  e(zSchemaTab);. 
1d720 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d730 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
1d740 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
1d750 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
1d760 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1d770 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1d780 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
1d790 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
1d7a0 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
1d7b0 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
1d7c0 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
1d7d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1d7e0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
1d7f0 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
1d800 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 1;.}../*.** Pr
1d810 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  int an out-of-me
1d820 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20  mory message to 
1d830 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1d840 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1d850 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72  nt shellNomemErr
1d860 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f  or(void){.  raw_
1d870 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1d880 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
1d890 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75  mory\n");.  retu
1d8a0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1d8b0 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65  ompare the patte
1d8c0 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67  rn in zGlob[] ag
1d8d0 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69  ainst the text i
1d8e0 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54  n z[].  Return T
1d8f0 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d  RUE.** if they m
1d900 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28  atch and FALSE (
1d910 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f  0) if they do no
1d920 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47  t match..**.** G
1d930 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
1d940 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
1d950 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
1d960 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
1d970 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
1d980 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
1d990 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
1d9a0 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
1d9b0 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
1d9c0 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
1d9d0 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
1d9e0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
1d9f0 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
1da20 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
1da30 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
1da40 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
1da50 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
1da60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20  .**.**      '#' 
1da70 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
1da80 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  y sequence of on
1da90 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
1daa0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20   with an.**     
1dab0 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f             optio
1dac0 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20  nal + or - sign 
1dad0 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20  in front.**.**  
1dae0 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e      ' '       An
1daf0 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73  y span of whites
1db00 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79  pace matches any
1db10 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a   other span of.*
1db20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1db30 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a   whitespace..**.
1db40 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70  ** Extra whitesp
1db50 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
1db60 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64  f z[] is ignored
1db70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db80 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f  testcase_glob(co
1db90 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
1dba0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1dbb0 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
1dbc0 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
1dbd0 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
1dbe0 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
1dbf0 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
1dc00 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
1dc10 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70  .      if( !IsSp
1dc20 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  ace(*z) ) return
1dc30 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
1dc40 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29   IsSpace(*zGlob)
1dc50 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20   ) zGlob++;.    
1dc60 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
1dc70 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
1dc80 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27  }else if( c=='*'
1dc90 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
1dca0 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29   (c=(*(zGlob++))
1dcb0 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27  ) == '*' || c=='
1dcc0 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ?' ){.        if
1dcd0 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a  ( c=='?' && (*(z
1dce0 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1dcf0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1dd00 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1dd10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1dd20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dd30 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
1dd40 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74    while( *z && t
1dd50 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1dd60 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  ob-1,z)==0 ){.  
1dd70 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
1dd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1dd90 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
1dda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1ddb0 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
1ddc0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
1ddd0 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
1dde0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
1ddf0 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
1de00 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
1de10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
1de20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74   }.        if( t
1de30 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1de40 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31  ob,z) ) return 1
1de50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1de60 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
1de70 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29  lse if( c=='?' )
1de80 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a  {.      if( (*(z
1de90 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1dea0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1deb0 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
1dec0 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
1ded0 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  0;.      seen = 
1dee0 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
1def0 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 0;.      c = *
1df00 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  (z++);.      if(
1df10 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
1df20 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a  ;.      c2 = *(z
1df30 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69  Glob++);.      i
1df40 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
1df50 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31        invert = 1
1df60 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
1df70 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1df80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
1df90 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
1dfa0 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
1dfb0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
1dfc0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1dfd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1dfe0 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
1dff0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
1e000 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c  ( c2=='-' && zGl
1e010 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47  ob[0]!=']' && zG
1e020 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  lob[0]!=0 && pri
1e030 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
1e040 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1e050 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++);.          i
1e060 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
1e070 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
1e080 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  1;.          pri
1e090 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
1e0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e0b0 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a     if( c==c2 ){.
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
1e0d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1e0e0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  }.          prio
1e0f0 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20  r_c = c2;.      
1e100 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d    }.        c2 =
1e110 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1e120 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1e130 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
1e140 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74  invert)==0 ) ret
1e150 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1e160 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20   if( c=='#' ){. 
1e170 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d       if( (z[0]==
1e180 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27  '-' || z[0]=='+'
1e190 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31  ) && IsDigit(z[1
1e1a0 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  ]) ) z++;.      
1e1b0 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30  if( !IsDigit(z[0
1e1c0 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ]) ) return 0;. 
1e1d0 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1e1e0 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
1e1f0 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  [0]) ){ z++; }. 
1e200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e210 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20  if( c!=(*(z++)) 
1e220 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e230 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49  }.  }.  while( I
1e240 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b  sSpace(*z) ){ z+
1e250 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  +; }.  return *z
1e260 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ==0;.}.../*.** C
1e270 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e  ompare the strin
1e280 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c  g as a command-l
1e290 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20  ine option with 
1e2a0 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77  either one or tw
1e2b0 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22  o.** initial "-"
1e2c0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e2d0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f  static int optio
1e2e0 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1e2f0 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
1e300 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66  har *zOpt){.  if
1e310 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29  ( zStr[0]!='-' )
1e320 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74   return 0;.  zSt
1e330 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b  r++;.  if( zStr[
1e340 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b  0]=='-' ) zStr++
1e350 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d  ;.  return strcm
1e360 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30  p(zStr, zOpt)==0
1e370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1e380 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  e a file..*/.int
1e390 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
1e3a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1e3b0 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  lename){.  int r
1e3c0 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  c;.#ifdef _WIN32
1e3d0 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20  .  wchar_t *z = 
1e3e0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
1e3f0 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46  f8_to_unicode(zF
1e400 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d  ilename);.  rc =
1e410 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20   _wunlink(z);.  
1e420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
1e430 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e  .#else.  rc = un
1e440 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
1e450 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1e460 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1e470 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1e480 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
1e490 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f  function fkey_co
1e4a0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20  llate_clause(), 
1e4b0 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22  used.** by the "
1e4c0 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
1e4d0 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  es" command. Thi
1e4e0 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  s scalar functio
1e4f0 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63  n is always.** c
1e500 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20  alled with four 
1e510 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20  arguments - the 
1e520 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d  parent table nam
1e530 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  e, the parent co
1e540 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  lumn name,.** th
1e550 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61  e child table na
1e560 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64  me and the child
1e570 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a   column name..**
1e580 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61  .**   fkey_colla
1e590 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e  te_clause('paren
1e5a0 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d  t-tab', 'parent-
1e5b0 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62  col', 'child-tab
1e5c0 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a  ', 'child-col').
1e5d0 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
1e5e0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  of the named tab
1e5f0 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64  les or columns d
1e600 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  o not exist, thi
1e610 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
1e620 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73  turns an empty s
1e630 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20  tring. An empty 
1e640 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72  string is also r
1e650 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20  eturned if both 
1e660 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f  tables.** and co
1e670 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20  lumns exist but 
1e680 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65  have the same de
1e690 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1e6a0 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a  sequence. Or,.**
1e6b0 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62   if both exist b
1e6c0 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ut the default c
1e6d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e6e0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
1e6f0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
1e700 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
1e710 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20  tring " COLLATE 
1e720 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
1e730 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70  n>", where.** <p
1e740 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
1e750 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
1e760 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e770 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ce of the parent
1e780 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
1e790 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65  ic void shellFke
1e7a0 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a  yCollateClause(.
1e7b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1e7c0 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
1e7d0 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
1e7e0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
1e7f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e800 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
1e810 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
1e820 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e830 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  Parent;.  const 
1e840 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c  char *zParentCol
1e850 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1e860 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f  zParentSeq;.  co
1e870 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
1e880 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1e890 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e  zChildCol;.  con
1e8a0 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53  st char *zChildS
1e8b0 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74  eq = 0;  /* Init
1e8c0 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20  ialize to avoid 
1e8d0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
1e8e0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  arning */.  int 
1e8f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1e900 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
1e910 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
1e920 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e930 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
1e940 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
1e950 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e960 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1e970 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
1e980 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
1e990 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e9a0 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
1e9b0 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
1e9c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1e9d0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1e9e0 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
1e9f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1ea00 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
1ea10 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1ea20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
1ea30 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1ea40 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
1ea50 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
1ea60 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
1ea70 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
1ea80 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
1ea90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eaa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eab0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1eac0 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
1ead0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
1eae0 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
1eaf0 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
1eb00 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
1eb10 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1eb20 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1eb30 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
1eb40 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
1eb50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1eb60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1eb70 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
1eb80 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
1eb90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1eba0 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
1ebb0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1ebc0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
1ebd0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
1ebe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
1ebf0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
1ec00 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
1ec10 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
1ec20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
1ec30 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
1ec40 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
1ec50 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1ec60 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
1ec70 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
1ec80 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
1ecb0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1ecc0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
1ecd0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ed00 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
1ed10 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
1ed20 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
1ed30 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
1ed40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
1ed50 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
1ed60 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
1ed70 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
1ed80 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
1ed90 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
1eda0 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
1edb0 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
1edc0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1edd0 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
1ede0 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
1edf0 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
1ee00 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
1ee10 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
1ee20 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
1ee30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
1ee60 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1ee70 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
1ee80 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
1ee90 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
1eea0 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
1eeb0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
1eec0 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1eef0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
1ef00 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
1ef10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
1ef20 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
1ef30 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
1ef40 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
1ef50 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
1ef60 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
1ef70 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
1ef80 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
1ef90 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
1efa0 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
1efb0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1efc0 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
1efd0 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
1efe0 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
1eff0 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
1f000 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
1f010 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
1f020 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1f030 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
1f040 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45   child_table WHE
1f050 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a  RE child_key=?".
1f060 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69    **.  **    Thi
1f070 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69  s SELECT is simi
1f080 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74  lar to the one t
1f090 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
1f0a0 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  keys implementat
1f0b0 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64  ion.  **    need
1f0c0 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61  s to run interna
1f0d0 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62  lly on child tab
1f0e0 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  les. If there is
1f0f0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
1f100 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73  an.  **    be us
1f110 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
1f120 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
1f130 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75  it can also be u
1f140 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20  sed by the FK.  
1f150 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61  **    implementa
1f160 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65  tion to optimize
1f170 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
1f180 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
1f190 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
1f1a0 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20     table..  **. 
1f1b0 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61   ** 1. A GLOB pa
1f1c0 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66  ttern suitable f
1f1d0 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  or sqlite3_strgl
1f1e0 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61  ob(). If the pla
1f1f0 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a  n output by.  **
1f200 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20      the EXPLAIN 
1f210 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
1f220 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  nd matches this 
1f230 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68  pattern, then th
1f240 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20  e schema.  **   
1f250 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64   contains an ind
1f260 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ex that can be u
1f270 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
1f280 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
1f290 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65    ** 2. Human re
1f2a0 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
1f2b0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
1f2c0 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63  hild table and c
1f2d0 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
1f2e0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68  *.  **       "ch
1f2f0 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
1f300 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32  key1, child_key2
1f310 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20  )".  **.  ** 3. 
1f320 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
1f330 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
1f340 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  es the parent ta
1f350 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
1f360 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
1f370 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61        "parent_ta
1f380 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c  ble(parent_key1,
1f390 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20   parent_key2)". 
1f3a0 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75   **.  ** 4. A fu
1f3b0 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ll CREATE INDEX 
1f3c0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e  statement for an
1f3d0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c   index that coul
1f3e0 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  d be used to.  *
1f3f0 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45  *    optimize DE
1f400 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
1f410 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
1f420 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65   parent table. e
1f430 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
1f440 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
1f450 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68  X child_table_ch
1f460 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64  ild_key ON child
1f470 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
1f480 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20  )".  **.  ** 5. 
1f490 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
1f4a0 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  parent table..  
1f4b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69  **.  ** These si
1f4c0 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65  x values are use
1f4d0 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63  d by the C logic
1f4e0 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61   below to genera
1f4f0 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20  te the report.. 
1f500 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1f510 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45   *zSql =.  "SELE
1f520 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  CT ".    "     '
1f530 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1f540 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
1f550 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
1f560 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
1f570 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
1f580 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
1f590 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
1f5a0 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
1f5b0 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
1f5c0 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
1f5d0 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
1f5e0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1f5f0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1f600 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1f610 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1f620 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
1f630 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
1f640 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
1f650 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
1f660 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
1f670 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
1f680 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
1f690 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
1f6a0 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
1f6b0 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
1f6c0 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
1f6d0 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
1f6e0 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
1f6f0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
1f700 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
1f710 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
1f720 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
1f730 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
1f740 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
1f750 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
1f760 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
1f770 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
1f780 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
1f790 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
1f7a0 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
1f7b0 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
1f7c0 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
1f7d0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
1f7e0 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
1f7f0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
1f800 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
1f810 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
1f820 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1f830 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1f840 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1f850 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1f860 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
1f870 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
1f880 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
1f890 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
1f8a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
1f8b0 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
1f8c0 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
1f8d0 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
1f8e0 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
1f8f0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
1f900 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
1f910 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
1f920 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
1f930 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
1f940 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
1f950 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
1f960 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
1f970 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
1f980 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
1f990 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
1f9a0 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
1f9b0 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1f9c0 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
1f9d0 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
1f9e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
1f9f0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
1fa00 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  len(azArg[i]);. 
1fa10 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71     if( n>1 && sq
1fa20 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
1fa30 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67  -verbose", azArg
1fa40 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
1fa50 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31      bVerbose = 1
1fa60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
1fa70 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
1fa80 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67  te3_strnicmp("-g
1fa90 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61  roupbyparent", a
1faa0 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
1fab0 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79  {.      bGroupBy
1fac0 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  Parent = 1;.    
1fad0 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20    zIndent = "   
1fae0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   ";.    }.    el
1faf0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
1fb00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
1fb10 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72  age: %s %s ?-ver
1fb20 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70  bose? ?-groupbyp
1fb30 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20  arent?\n",.     
1fb40 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61       azArg[0], a
1fb50 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b  zArg[1].      );
1fb60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fb70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1fb80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  }.  }..  /* Regi
1fb90 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
1fba0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
1fbb0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
1fbc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1fbd0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1fbe0 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
1fbf0 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
1fc00 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
1fc10 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
1fc20 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
1fc30 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
1fc40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fc50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1fc60 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
1fc70 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
1fc80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1fc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fca0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1fcb0 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
1fcc0 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
1fcd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
1fcf0 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
1fd00 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
1fd10 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
1fd20 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
1fd30 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
1fd40 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
1fd50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1fd60 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
1fd70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1fd80 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
1fd90 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1fda0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
1fdb0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1fdc0 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
1fdd0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1fde0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
1fdf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
1fe00 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
1fe10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1fe20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1fe30 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
1fe40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1fe50 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
1fe60 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1fe70 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
1fe80 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1fe90 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
1fea0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1feb0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1fec0 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
1fed0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
1fee0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1fef0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1ff00 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
1ff10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1ff20 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
1ff30 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
1ff40 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
1ff50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1ff70 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
1ff80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
1ff90 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
1ffa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
1ffb0 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
1ffc0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1ffd0 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
1ffe0 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
1fff0 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
20000 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
20010 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
20020 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
20030 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
20040 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
20050 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
20060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
20070 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
20080 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
20090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
200a0 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
200b0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
200c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
200d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
200e0 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
200f0 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
20100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
20110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
20120 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a   bGroupByParent.
20130 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72          && (bVer
20140 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a  bose || res==0).
20150 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65          && (zPre
20160 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
20170 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c  stricmp(zParent,
20180 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20   zPrev)).       
20190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
201a0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
201b0 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25  - Parent table %
201c0 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  s\n", zParent);.
201d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
201e0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20  3_free(zPrev);. 
201f0 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d           zPrev =
20200 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20210 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b  ("%s", zParent);
20220 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20230 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
20240 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
20250 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
20260 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e  s --> %s\n", zIn
20270 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67  dent, zCI, zTarg
20280 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
20290 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20  se if( bVerbose 
202a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
202b0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
202c0 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65  /* no extra inde
202d0 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  xes required for
202e0 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c   %s -> %s */\n",
202f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
20300 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a  Indent, zFrom, z
20310 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  Target.         
20320 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
20330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
20350 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ev);..    if( rc
20360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20370 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
20380 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
20390 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
203a0 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  b));.    }..    
203b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
203c0 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20  nalize(pSql);.  
203d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
203e0 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49  _OK && rc2!=SQLI
203f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20400 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72  c = rc2;.      r
20410 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20420 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
20430 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
20440 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20450 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
20460 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
20470 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
20480 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
204a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
204b0 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61  .lint" dot comma
204c0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
204d0 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64  t lintDotCommand
204e0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
204f0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
20500 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
20510 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
20520 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
20530 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
20540 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20550 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
20560 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
20570 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
205a0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
205b0 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Arg[] */.){.  in
205c0 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67  t n;.  n = (nArg
205d0 3e 3d 32 20 3f 20 28 69 6e 74 29 73 74 72 6c 65  >=2 ? (int)strle
205e0 6e 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  n(azArg[1]) : 0)
205f0 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73  ;.  if( n<1 || s
20600 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
20610 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d  azArg[1], "fkey-
20620 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67  indexes", n) ) g
20630 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74  oto usage;.  ret
20640 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65  urn lintFkeyInde
20650 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72  xes(pState, azAr
20660 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67  g, nArg);.. usag
20670 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  e:.  raw_printf(
20680 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20 25  stderr, "Usage %
20690 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73  s sub-command ?s
206a0 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20  witches...?\n", 
206b0 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77  azArg[0]);.  raw
206c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
206d0 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61  "Where sub-comma
206e0 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20  nds are:\n");.  
206f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
20700 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64  r, "    fkey-ind
20710 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75  exes\n");.  retu
20720 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
20730 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
20740 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20  shellPrepare(.  
20750 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
20760 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e  int *pRc, .  con
20770 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a  st char *zSql, .
20780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20790 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70  *ppStmt.){.  *pp
207a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
207b0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
207c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
207d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
207e0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
207f0 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
20800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
20820 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20830 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25  sql error: %s (%
20840 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  d)\n", .        
20850 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
20860 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  (db), sqlite3_er
20870 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20  rcode(db).      
20880 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  );.      *pRc = 
20890 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
208a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
208b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
208c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
208d0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
208e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
208f0 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pStmt,.  const c
20900 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e  har *zFmt, .  ..
20910 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ..){.  *ppStmt =
20920 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
20930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20940 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
20950 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61   char *z;.    va
20960 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
20970 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
20980 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
20990 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d   ap);.    if( z=
209a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
209b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
209c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
209d0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
209e0 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d  b, pRc, z, ppStm
209f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20a00 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  3_free(z);.    }
20a10 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
20a20 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
20a30 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
20a40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20a50 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
20a60 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
20a70 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
20a80 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
20a90 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
20aa0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20ab0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
20ac0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
20ad0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
20ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20af0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
20b00 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
20b10 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
20b20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
20b30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20b40 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
20b50 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
20b60 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28  void shellReset(
20b70 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
20b80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
20b90 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  tmt.){.  int rc 
20ba0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
20bb0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70  pStmt);.  if( *p
20bc0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
20bd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20bf0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
20c00 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
20c10 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61  pStmt);.      ra
20c20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
20c30 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
20c40 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
20c50 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
20c60 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
20c70 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 74 72 75  }.}../* .** Stru
20c80 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69  cture representi
20c90 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72  ng a single ".ar
20ca0 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79  " command..*/.ty
20cb0 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72 43  pedef struct ArC
20cc0 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64  ommand ArCommand
20cd0 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61  ;.struct ArComma
20ce0 6e 64 20 7b 0a 20 20 69 6e 74 20 65 43 6d 64 3b  nd {.  int eCmd;
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f         /* An AR_
20d10 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  CMD_* value */. 
20d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
20d30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
20d40 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d   /* --file argum
20d50 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
20d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
20d70 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ir;             
20d80 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79    /* --directory
20d90 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
20da0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72  LL */.  int bVer
20db0 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
20dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20dd0 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a  if --verbose */.
20de0 20 20 69 6e 74 20 62 5a 69 70 3b 20 20 20 20 20    int bZip;     
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 7a    /* True if --z
20e10 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ip */.  int nArg
20e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e40 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  r of command arg
20e50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
20e60 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
20e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20e80 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
20e90 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a  arguments */.};.
20ea0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75  ./*.** Print a u
20eb0 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72  sage message for
20ec0 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
20ed0 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
20ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
20ef0 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
20f00 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a  t arUsage(FILE *
20f10 66 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  f){.  raw_printf
20f20 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67 65 3a  (f,."\n"."Usage:
20f30 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d   .ar [OPTION...]
20f40 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22 54   [FILE...]\n"."T
20f50 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 6d  he .ar command m
20f60 61 6e 61 67 65 73 20 73 71 6c 61 72 20 61 72 63  anages sqlar arc
20f70 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22 0a 22  hives.\n"."\n"."
20f80 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22 20 20  Examples:\n"."  
20f90 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65 2e  .ar -cf archive.
20fa0 73 61 72 20 66 6f 6f 20 62 61 72 20 20 20 20 23  sar foo bar    #
20fb0 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e   Create archive.
20fc0 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  sar from files f
20fd0 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a 22 20  oo and bar\n"." 
20fe0 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69 76 65   .ar -tf archive
20ff0 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20 20  .sar            
21000 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f  # List members o
21010 66 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22  f archive.sar\n"
21020 0a 22 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63  ."  .ar -xvf arc
21030 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
21040 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79 20 65     # Verbosely e
21050 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
21060 6d 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22  m archive.sar\n"
21070 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f 6d 6d  ."\n"."Each comm
21080 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20 66 65  and line must fe
21090 61 74 75 72 65 20 65 78 61 63 74 6c 79 20 6f 6e  ature exactly on
210a0 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e  e command option
210b0 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d 63 72  :\n"."  -c, --cr
210c0 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  eate            
210d0 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
210e0 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 75  archive\n"."  -u
210f0 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20 20  , --update      
21100 20 20 20 20 20 20 20 20 20 55 70 64 61 74 65 20           Update 
21110 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f 20  or add files to 
21120 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63 68  an existing arch
21130 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20 2d 2d  ive\n"."  -t, --
21140 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
21150 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e       List conten
21160 74 73 20 6f 66 20 61 72 63 68 69 76 65 5c 6e 22  ts of archive\n"
21170 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63  ."  -x, --extrac
21180 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  t              E
21190 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
211a0 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 5c 6e  m archive\n"."\n
211b0 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72 20 6d  "."And zero or m
211c0 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f 70 74  ore optional opt
211d0 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76 2c 20  ions:\n"."  -v, 
211e0 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20 20  --verbose       
211f0 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61 63         Print eac
21200 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69 74  h filename as it
21210 20 69 73 20 70 72 6f 63 65 73 73 65 64 5c 6e 22   is processed\n"
21220 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66  ."  -f FILE, --f
21230 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f  ile FILE       O
21240 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76  perate on archiv
21250 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20  e FILE (default 
21260 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 5c 6e  is current db)\n
21270 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64  "."  -C DIR, --d
21280 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20 20  irectory DIR    
21290 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  Change to direct
212a0 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f  ory DIR to read/
212b0 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e 22  extract files\n"
212c0 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a  ."\n"."See also:
212d0 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f   http://sqlite.o
212e0 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61  rg/cli.html#sqla
212f0 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72  r_archive_suppor
21300 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72  t\n"."\n".);.  r
21310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21320 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  OR;.}../*.** Pri
21330 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
21340 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
21350 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
21360 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a  r and return .**
21370 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
21380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
21390 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
213a0 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
213b0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
213c0 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74  char *z;.  va_st
213d0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
213e0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
213f0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
21400 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
21410 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
21420 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28  rr, "Error: %s (
21430 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70  try \".ar --help
21440 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71  \")\n", z);.  sq
21450 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
21460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21470 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56  RROR;.}../*.** V
21480 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d  alues for ArComm
21490 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65  and.eCmd..*/.#de
214a0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  fine AR_CMD_CREA
214b0 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69  TE       1.#defi
214c0 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ne AR_CMD_EXTRAC
214d0 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65  T      2.#define
214e0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20   AR_CMD_LIST    
214f0 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41       3.#define A
21500 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20  R_CMD_UPDATE    
21510 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f     4.#define AR_
21520 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20  CMD_HELP        
21530 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20   5../*.** Other 
21540 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77  (non-command) sw
21550 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  itches..*/.#defi
21560 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  ne AR_SWITCH_VER
21570 42 4f 53 45 20 20 20 36 0a 23 64 65 66 69 6e 65  BOSE   6.#define
21580 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20   AR_SWITCH_FILE 
21590 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 41       7.#define A
215a0 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
215b0 52 59 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f  RY 8.#define AR_
215c0 53 57 49 54 43 48 5f 5a 49 50 20 20 20 20 20 20  SWITCH_ZIP      
215d0 20 39 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61   9..static int a
215e0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
215f0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
21600 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
21610 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
21620 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
21630 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
21640 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
21650 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
21660 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
21670 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
21680 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
21690 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
216a0 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69  MD_HELP:.      i
216b0 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a  f( pAr->eCmd ){.
216c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
216d0 72 45 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69  rErrorMsg("multi
216e0 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
216f0 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
21700 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
21710 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
21720 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
21730 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
21740 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
21750 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
21760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
21770 73 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50  se AR_SWITCH_ZIP
21780 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 5a 69  :.      pAr->bZi
21790 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  p = 1;.      bre
217a0 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52  ak;..    case AR
217b0 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20  _SWITCH_FILE:.  
217c0 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d      pAr->zFile =
217d0 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65   zArg;.      bre
217e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
217f0 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
21800 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69  :.      pAr->zDi
21810 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  r = zArg;.      
21820 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
21830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21840 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74  }../*.** Parse t
21850 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
21860 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d  for an ".ar" com
21870 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74  mand. The result
21880 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
21890 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  to.** structure 
218a0 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f  (*pAr). SQLITE_O
218b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
218c0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
218d0 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73  e is parsed.** s
218e0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68  uccessfully, oth
218f0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
21900 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
21910 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  en to stderr and
21920 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
21930 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  R returned..*/.s
21940 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72 73  tatic int arPars
21950 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72  eCommand(.  char
21960 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
21970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21980 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
21990 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
219a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
219b0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219d0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
219e0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
219f0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
21a20 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
21a30 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
21a40 68 20 7b 0a 20 20 20 20 63 68 61 72 20 63 53 68  h {.    char cSh
21a50 6f 72 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ort;.    const c
21a60 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
21a70 69 6e 74 20 65 53 77 69 74 63 68 3b 0a 20 20 20  int eSwitch;.   
21a80 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 7d 20 61   int bArg;.  } a
21a90 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20  Switch[] = {.   
21aa0 20 7b 20 27 63 27 2c 20 22 63 72 65 61 74 65 22   { 'c', "create"
21ab0 2c 20 20 20 20 41 52 5f 43 4d 44 5f 43 52 45 41  ,    AR_CMD_CREA
21ac0 54 45 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27  TE, 0 },.    { '
21ad0 78 27 2c 20 22 65 78 74 72 61 63 74 22 2c 20 20  x', "extract",  
21ae0 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c   AR_CMD_EXTRACT,
21af0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 74 27 2c   0 },.    { 't',
21b00 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20 41 52   "list",      AR
21b10 5f 43 4d 44 5f 4c 49 53 54 2c 20 30 20 7d 2c 0a  _CMD_LIST, 0 },.
21b20 20 20 20 20 7b 20 27 75 27 2c 20 22 75 70 64 61      { 'u', "upda
21b30 74 65 22 2c 20 20 20 20 41 52 5f 43 4d 44 5f 55  te",    AR_CMD_U
21b40 50 44 41 54 45 2c 20 30 20 7d 2c 0a 20 20 20 20  PDATE, 0 },.    
21b50 7b 20 27 68 27 2c 20 22 68 65 6c 70 22 2c 20 20  { 'h', "help",  
21b60 20 20 20 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c      AR_CMD_HELP,
21b70 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 76 27 2c   0 },.    { 'v',
21b80 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20 41 52   "verbose",   AR
21b90 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c  _SWITCH_VERBOSE,
21ba0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 66 27 2c   0 },.    { 'f',
21bb0 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 41 52   "file",      AR
21bc0 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 31 20  _SWITCH_FILE, 1 
21bd0 7d 2c 0a 20 20 20 20 7b 20 27 43 27 2c 20 22 64  },.    { 'C', "d
21be0 69 72 65 63 74 6f 72 79 22 2c 20 41 52 5f 53 57  irectory", AR_SW
21bf0 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20  ITCH_DIRECTORY, 
21c00 31 20 7d 2c 0a 20 20 20 20 7b 20 27 7a 27 2c 20  1 },.    { 'z', 
21c10 22 7a 69 70 22 2c 20 20 20 20 20 20 20 41 52 5f  "zip",       AR_
21c20 53 57 49 54 43 48 5f 5a 49 50 2c 20 30 20 7d 0a  SWITCH_ZIP, 0 }.
21c30 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74    };.  int nSwit
21c40 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69  ch = sizeof(aSwi
21c50 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74  tch) / sizeof(st
21c60 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a  ruct ArSwitch);.
21c70 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
21c80 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74  h *pEnd = &aSwit
21c90 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20  ch[nSwitch];..  
21ca0 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20  if( nArg<=1 ){. 
21cb0 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67     return arUsag
21cc0 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c  e(stderr);.  }el
21cd0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  se{.    char *z 
21ce0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
21cf0 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20 73  memset(pAr, 0, s
21d00 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29  izeof(ArCommand)
21d10 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  );..    if( z[0]
21d20 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
21d30 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
21d40 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
21d50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
21d60 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
21d70 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
21d80 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
21d90 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
21da0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
21db0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
21dc0 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
21dd0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
21de0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
21df0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
21e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21e10 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
21e20 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
21e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21e40 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
21e50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21e60 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
21e70 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
21e80 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
21e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ea0 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
21eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21ec0 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
21ed0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21ee0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70  n arErrorMsg("op
21ef0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
21f00 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
21f10 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
21f20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
21f30 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
21f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21f50 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
21f60 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
21f70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
21f80 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
21f90 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
21fa0 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
21fb0 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
21fc0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
21fd0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21fe0 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
21ff0 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
22000 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22010 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
22020 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
22030 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
22040 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
22050 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
22060 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
22070 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
22080 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
22090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
220a0 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
220b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
220c0 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
220d0 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
220e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
220f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
22100 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
22110 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
22120 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
22130 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
22140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22150 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
22160 73 74 72 6c 65 6e 28 7a 29 3b 0a 0a 20 20 20 20  strlen(z);..    
22170 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d      if( z[1]!='-
22180 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
22190 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
221a0 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  /* One or more s
221b0 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  hort options */.
221c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
221d0 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
221e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
221f0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
22200 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
22210 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
22220 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  t;.            f
22230 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
22240 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
22250 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
22260 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
22270 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20  =pOpt->cShort ) 
22280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
222a0 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
222b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
222c0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
222d0 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  sg("unrecognized
222e0 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e 22 2c 20   option: %c\n", 
222f0 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
22300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22310 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
22320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22330 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
22380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22390 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
223a0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
223b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
223c0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
223d0 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65  orMsg("option re
223e0 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
223f0 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69 5d 29 3b  nt: %c\n",z[i]);
22400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22420 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
22430 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
22440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22460 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
22470 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
22480 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
22490 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
224a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
224b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
224c0 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27  e if( z[2]=='\0'
224d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
224e0 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e   A -- option, in
224f0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c  dicating that al
22500 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
22510 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20  and line words. 
22520 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
22530 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
22540 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
22550 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
22560 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20  zArg[iArg+1];.  
22570 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
22580 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b  g = nArg-iArg-1;
22590 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
225a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
225b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
225c0 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  long option */. 
225d0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
225e0 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20  har *zArg = 0;  
225f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22600 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f  gument for optio
22610 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  n, if any */.   
22620 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
22630 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d  Switch *pMatch =
22640 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63   0;      /* Matc
22650 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  hing option */. 
22660 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
22670 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20  ArSwitch *pOpt; 
22680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
22690 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
226a0 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
226b0 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
226c0 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
226d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
226e0 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f  char *zLong = pO
226f0 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20  pt->zLong;.     
22700 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29         if( (n-2)
22710 3c 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c  <=(int)strlen(zL
22720 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
22730 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
22740 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
22750 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
22760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22770 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
22780 6f 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73  orMsg("ambiguous
22790 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
227a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
227b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
227c0 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
227d0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
227e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
227f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
22800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
22810 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
22820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
22830 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f  ErrorMsg("unreco
22840 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25  gnized option: %
22850 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
22860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
22870 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29  ( pMatch->bArg )
22880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
22890 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29  ( iArg>=(nArg-1)
228a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
228b0 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
228c0 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75  Msg("option requ
228d0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
228e0 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
228f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22900 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
22910 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
22920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22930 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
22940 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68  itch(pAr, pMatch
22950 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
22960 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22970 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
22980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22990 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
229a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
229b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
229c0 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c  assumes that all
229d0 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69   arguments withi
229e0 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e  n the ArCommand.
229f0 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79  azArg[].** array
22a00 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76   refer to archiv
22a10 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f  e members, as fo
22a20 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20  r the --extract 
22a30 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e  or --list comman
22a40 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ds. .** It check
22a50 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  s that each of t
22a60 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e  hem are present.
22a70 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65   If any specifie
22a80 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  d file is not.**
22a90 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
22aa0 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f  archive, an erro
22ab0 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20  r is printed to 
22ac0 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72  stderr and an er
22ad0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75  ror.** code retu
22ae0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
22af0 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65   if all specifie
22b00 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  d arguments are 
22b10 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
22b20 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54  e archive, SQLIT
22b30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
22b50 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79  ction strips any
22b60 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68   trailing '/' ch
22b70 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61  aracters from ea
22b80 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  ch argument..** 
22b90 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65  This is consiste
22ba0 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20  nt with the way 
22bb0 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e  the [tar] comman
22bc0 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20  d seems to work 
22bd0 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a  on.** Linux..*/.
22be0 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65  static int arChe
22bf0 63 6b 45 6e 74 72 69 65 73 28 73 71 6c 69 74 65  ckEntries(sqlite
22c00 33 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64  3 *db, ArCommand
22c10 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63   *pAr){.  int rc
22c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22c30 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b  if( pAr->nArg ){
22c40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22c50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
22c60 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68  est = 0;..    sh
22c70 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
22c80 28 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74  (db, &rc, &pTest
22c90 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
22ca0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d  ROM %s WHERE nam
22cb0 65 3d 3f 31 22 2c 20 0a 20 20 20 20 20 20 20 20  e=?1", .        
22cc0 70 41 72 2d 3e 62 5a 69 70 20 3f 20 22 7a 69 70  pAr->bZip ? "zip
22cd0 66 69 6c 65 28 3f 32 29 22 20 3a 20 22 73 71 6c  file(?2)" : "sql
22ce0 61 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ar".    );.    i
22cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22d00 20 26 26 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b   && pAr->bZip ){
22d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
22d20 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20  ind_text(pTest, 
22d30 32 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d  2, pAr->zFile, -
22d40 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
22d50 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ENT);.    }.    
22d60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
22d70 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
22d80 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
22d90 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
22da0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
22db0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
22dc0 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  (z);.      int b
22dd0 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  Ok = 0;.      wh
22de0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
22df0 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20  1]=='/' ) n--;. 
22e00 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27       z[n] = '\0'
22e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22e20 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
22e30 20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   1, z, -1, SQLIT
22e40 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
22e50 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
22e60 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
22e70 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
22e80 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
22e90 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
22ea0 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  t(&rc, pTest);. 
22eb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22ec0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30  ITE_OK && bOk==0
22ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
22ee0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
22ef0 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63  not found in arc
22f00 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  hive: %s\n", z);
22f10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22f20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
22f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
22f40 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
22f50 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pTest);.  }..  
22f60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22f70 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45  .** Format a WHE
22f80 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
22f90 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  an be used again
22fa0 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  st the "sqlar" t
22fb0 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74  able to.** ident
22fc0 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20  ify all archive 
22fd0 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74  members that mat
22fe0 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  ch the command a
22ff0 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a  rguments held.**
23000 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76   in (*pAr). Leav
23010 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61  e this WHERE cla
23020 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65  use in (*pzWhere
23030 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
23040 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  ng..** The calle
23050 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
23060 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20   for eventually 
23070 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
23080 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79  free() on.** any
23090 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68   non-NULL (*pzWh
230a0 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ere) value..*/.s
230b0 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65  tatic void arWhe
230c0 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20  reClause(.  int 
230d0 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61  *pRc, .  ArComma
230e0 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72  nd *pAr, .  char
230f0 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20   **pzWhere      
23100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23110 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c  UT: New WHERE cl
23120 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ause */.){.  cha
23130 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
23140 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
23150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23160 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a  pAr->nArg==0 ){.
23170 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
23180 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23190 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1");.    }else{.
231a0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
231b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
231c0 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
231d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
231e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
231f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23200 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
23210 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72  ];.        zWher
23220 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
23230 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
23240 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
23250 71 27 20 4f 52 20 6e 61 6d 65 20 42 45 54 57 45  q' OR name BETWE
23260 45 4e 20 27 25 71 2f 27 20 41 4e 44 20 27 25 71  EN '%q/' AND '%q
23270 30 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  0'", .          
23280 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
23290 7a 2c 20 7a 2c 20 7a 0a 20 20 20 20 20 20 20 20  z, z, z.        
232a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
232b0 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a  f( zWhere==0 ){.
232c0 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d            *pRc =
232d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
232e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
232f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23300 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b    zSep = " OR ";
23310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23320 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20   }.  *pzWhere = 
23330 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zWhere;.}../*.**
23340 20 41 72 67 75 6d 65 6e 74 20 7a 4d 6f 64 65 20   Argument zMode 
23350 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
23360 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
23370 31 31 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  11 bytes in size
23380 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
23390 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 74 68 69  on populates thi
233a0 73 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  s buffer with th
233b0 65 20 73 74 72 69 6e 67 20 69 6e 74 65 72 70 72  e string interpr
233c0 65 74 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  etation of.** th
233d0 65 20 75 6e 69 78 20 66 69 6c 65 20 6d 6f 64 65  e unix file mode
233e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
233f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
23400 65 2e 67 2e 20 22 64 72 77 78 72 2d 78 72 2d 78  e.g. "drwxr-xr-x
23410 22 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ")..*/.static vo
23420 69 64 20 73 68 65 6c 6c 4d 6f 64 65 54 6f 53 74  id shellModeToSt
23430 72 69 6e 67 28 63 68 61 72 20 2a 7a 4d 6f 64 65  ring(char *zMode
23440 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 69  , int mode){.  i
23450 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4d 61 67 69  nt i;..  /* Magi
23460 63 20 6e 75 6d 62 65 72 73 20 63 6f 70 69 65 64  c numbers copied
23470 20 66 72 6f 6d 20 5b 6d 61 6e 20 32 20 73 74 61   from [man 2 sta
23480 74 5d 20 2a 2f 0a 20 20 69 66 28 20 6d 6f 64 65  t] */.  if( mode
23490 20 26 20 30 30 34 30 30 30 30 20 29 7b 0a 20 20   & 0040000 ){.  
234a0 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20 27 64 27    zMode[0] = 'd'
234b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d  ;.  }else if( (m
234c0 6f 64 65 20 26 20 30 31 32 30 30 30 30 29 3d 3d  ode & 0120000)==
234d0 30 31 32 30 30 30 30 20 29 7b 0a 20 20 20 20 7a  0120000 ){.    z
234e0 4d 6f 64 65 5b 30 5d 20 3d 20 27 6c 27 3b 0a 20  Mode[0] = 'l';. 
234f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 6f 64   }else{.    zMod
23500 65 5b 30 5d 20 3d 20 27 2d 27 3b 0a 20 20 7d 0a  e[0] = '-';.  }.
23510 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
23520 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
23530 20 3d 20 28 6d 6f 64 65 20 3e 3e 20 28 28 32 2d   = (mode >> ((2-
23540 69 29 2a 33 29 29 3b 0a 20 20 20 20 63 68 61 72  i)*3));.    char
23550 20 2a 61 20 3d 20 26 7a 4d 6f 64 65 5b 31 20 2b   *a = &zMode[1 +
23560 20 69 2a 33 5d 3b 0a 20 20 20 20 61 5b 30 5d 20   i*3];.    a[0] 
23570 3d 20 28 6d 20 26 20 30 78 34 29 20 3f 20 27 72  = (m & 0x4) ? 'r
23580 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 61 5b 31  ' : '-';.    a[1
23590 5d 20 3d 20 28 6d 20 26 20 30 78 32 29 20 3f 20  ] = (m & 0x2) ? 
235a0 27 77 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 61  'w' : '-';.    a
235b0 5b 32 5d 20 3d 20 28 6d 20 26 20 30 78 31 29 20  [2] = (m & 0x1) 
235c0 3f 20 27 78 27 20 3a 20 27 2d 27 3b 0a 20 20 7d  ? 'x' : '-';.  }
235d0 0a 20 20 7a 4d 6f 64 65 5b 31 30 5d 20 3d 20 27  .  zMode[10] = '
235e0 5c 30 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  \0';.}../*.** Im
235f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23600 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61  .ar "lisT" comma
23610 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
23620 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64  nt arListCommand
23630 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
23640 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43  sqlite3 *db, ArC
23650 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
23660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
23670 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52   = "SELECT %s FR
23680 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b  OM %s WHERE %s";
23690 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
236a0 7a 54 62 6c 20 3d 20 28 70 41 72 2d 3e 62 5a 69  zTbl = (pAr->bZi
236b0 70 20 3f 20 22 7a 69 70 66 69 6c 65 28 3f 29 22  p ? "zipfile(?)"
236c0 20 3a 20 22 73 71 6c 61 72 22 29 3b 0a 20 20 63   : "sqlar");.  c
236d0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
236e0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d  s[] = {.    "nam
236f0 65 22 2c 0a 20 20 20 20 22 6d 6f 64 65 2c 20 73  e",.    "mode, s
23700 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  z, datetime(mtim
23710 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c  e, 'unixepoch'),
23720 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63   name".  };..  c
23730 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
23740 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
23750 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pSql = 0;.  int
23760 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43   rc;..  rc = arC
23770 68 65 63 6b 45 6e 74 72 69 65 73 28 64 62 2c 20  heckEntries(db, 
23780 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43  pAr);.  arWhereC
23790 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20  lause(&rc, pAr, 
237a0 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68 65  &zWhere);..  she
237b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
237c0 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20  db, &rc, &pSql, 
237d0 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72  zSql, azCols[pAr
237e0 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 20 7a 54 62  ->bVerbose], zTb
237f0 6c 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66  l, zWhere);.  if
23800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23810 26 26 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  && pAr->bZip ){.
23820 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23830 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 2c 20 70  _text(pSql, 1, p
23840 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53  Ar->zFile, -1, S
23850 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
23860 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 72  ;.  }.  while( r
23870 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23880 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
23890 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
238a0 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  {.    if( pAr->b
238b0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
238c0 20 63 68 61 72 20 7a 4d 6f 64 65 5b 31 31 5d 3b   char zMode[11];
238d0 0a 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 65  .      shellMode
238e0 54 6f 53 74 72 69 6e 67 28 7a 4d 6f 64 65 2c 20  ToString(zMode, 
238f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
23900 6e 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 0a 20  nt(pSql, 0));.. 
23910 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
23920 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30  p->out, "%s % 10
23930 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 20 7a 4d  d  %s  %s\n", zM
23940 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ode,.          s
23950 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
23960 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20  t(pSql, 1), .   
23970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
23980 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23990 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73   2),.          s
239a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
239b0 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20  xt(pSql, 3).    
239c0 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
239d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
239e0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
239f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23a00 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
23a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65      }.  }..  she
23a20 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
23a30 70 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSql);.  return 
23a40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
23a50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23a60 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
23a70 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
23a80 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
23a90 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74  ommand(ShellStat
23aa0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  e *p, sqlite3 *d
23ab0 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  b, ArCommand *pA
23ac0 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
23ad0 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22   *zSql1 = .    "
23ae0 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
23af0 3a 31 20 7c 7c 20 6e 61 6d 65 2c 20 22 0a 20 20  :1 || name, ".  
23b00 20 20 22 20 20 77 72 69 74 65 66 69 6c 65 28 3f    "  writefile(?
23b10 31 20 7c 7c 20 6e 61 6d 65 2c 20 25 73 2c 20 6d  1 || name, %s, m
23b20 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20  ode, mtime) ".  
23b30 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45    "FROM %s WHERE
23b40 20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20   (%s) AND (data 
23b50 49 53 20 4e 55 4c 4c 20 4f 52 20 3f 32 20 3d 20  IS NULL OR ?2 = 
23b60 30 29 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  0)";..  const ch
23b70 61 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d  ar *azExtraArg[]
23b80 20 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72   = { .    "sqlar
23b90 5f 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61  _uncompress(data
23ba0 2c 20 73 7a 29 22 2c 0a 20 20 20 20 22 7a 69 70  , sz)",.    "zip
23bb0 66 69 6c 65 5f 75 6e 63 6f 6d 70 72 65 73 73 28  file_uncompress(
23bc0 64 61 74 61 2c 20 73 7a 2c 20 6d 65 74 68 6f 64  data, sz, method
23bd0 29 22 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  )".  };.  const 
23be0 63 68 61 72 20 2a 61 7a 53 6f 75 72 63 65 5b 5d  char *azSource[]
23bf0 20 3d 20 7b 0a 20 20 20 20 22 73 71 6c 61 72 22   = {.    "sqlar"
23c00 2c 20 22 7a 69 70 66 69 6c 65 28 3f 33 29 22 0a  , "zipfile(?3)".
23c10 20 20 7d 3b 0a 0a 0a 0a 20 20 73 74 72 75 63 74    };....  struct
23c20 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 73 5b   timespec times[
23c30 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  2];.  sqlite3_st
23c40 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
23c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23c60 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72  OK;.  char *zDir
23c70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57   = 0;.  char *zW
23c80 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  here = 0;.  int 
23c90 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  i;..  /* If argu
23ca0 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66  ments are specif
23cb0 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ied, check that 
23cc0 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78  they actually ex
23cd0 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ist within.  ** 
23ce0 74 68 65 20 61 72 63 68 69 76 65 20 62 65 66 6f  the archive befo
23cf0 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41  re proceeding. A
23d00 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57  nd formulate a W
23d10 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20  HERE clause to. 
23d20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20   ** match them. 
23d30 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65   */.  rc = arChe
23d40 63 6b 45 6e 74 72 69 65 73 28 64 62 2c 20 70 41  ckEntries(db, pA
23d50 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61  r);.  arWhereCla
23d60 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a  use(&rc, pAr, &z
23d70 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72  Where);..  if( r
23d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23d90 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69      if( pAr->zDi
23da0 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20  r ){.      zDir 
23db0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23dc0 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44  f("%s/", pAr->zD
23dd0 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ir);.    }else{.
23de0 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c        zDir = sql
23df0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29  ite3_mprintf("")
23e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23e10 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53  zDir==0 ) rc = S
23e20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
23e30 0a 0a 20 20 6d 65 6d 73 65 74 28 74 69 6d 65 73  ..  memset(times
23e40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 69 6d 65  , 0, sizeof(time
23e50 73 29 29 3b 0a 20 20 74 69 6d 65 73 5b 30 5d 2e  s));.  times[0].
23e60 74 76 5f 73 65 63 20 3d 20 74 69 6d 65 28 30 29  tv_sec = time(0)
23e70 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
23e80 65 50 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c  ePrintf(db, &rc,
23e90 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a   &pSql, zSql1, .
23ea0 20 20 20 20 20 20 61 7a 45 78 74 72 61 41 72 67        azExtraArg
23eb0 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 61 7a 53  [pAr->bZip], azS
23ec0 6f 75 72 63 65 5b 70 41 72 2d 3e 62 5a 69 70 5d  ource[pAr->bZip]
23ed0 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20  , zWhere.  );.. 
23ee0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23ef0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
23f00 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
23f10 2c 20 31 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53  , 1, zDir, -1, S
23f20 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
23f30 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70     if( pAr->bZip
23f40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23f50 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
23f60 2c 20 33 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c  , 3, pAr->zFile,
23f70 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
23f80 49 43 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IC);.    }..    
23f90 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
23fa0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
23fb0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
23fc0 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
23fd0 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
23fe0 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
23ff0 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
24000 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
24010 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
24020 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
24030 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
24040 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
24050 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
24060 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
24070 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
24080 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
24090 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
240a0 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
240b0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
240c0 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
240d0 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
240e0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
240f0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
24100 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24110 28 70 53 71 6c 2c 20 32 2c 20 69 29 3b 0a 20 20  (pSql, 2, i);.  
24120 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
24130 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
24140 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
24150 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
24160 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
24170 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20  & pAr->bVerbose 
24180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
24190 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
241a0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
241b0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
241c0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 0));.        }
241d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
241e0 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
241f0 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
24200 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
24210 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
24220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
24230 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
24240 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
24250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
24260 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
24270 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
24280 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20  e" and "update" 
24290 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  commands..**.** 
242a0 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
242b0 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
242c0 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
242d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
242e0 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
242f0 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
24300 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
24310 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
24320 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
24330 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
24340 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
24350 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
24360 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
24370 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
24380 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
24390 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
243a0 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
243b0 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
243c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
243d0 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
243e0 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
243f0 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
24400 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
24410 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eginning..*/.sta
24420 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
24430 55 70 64 61 74 65 28 0a 20 20 53 68 65 6c 6c 53  Update(.  ShellS
24440 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
24450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65            /* She
24460 6c 6c 20 73 74 61 74 65 20 70 6f 69 6e 74 65 72  ll state pointer
24470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24480 62 2c 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  b,.  ArCommand *
24490 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
244a0 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
244b0 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
244c0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
244d0 55 70 64 61 74 65 0a 29 7b 0a 20 20 63 6f 6e 73  Update.){.  cons
244e0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22  t char *zSql = "
244f0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d 6f 64  SELECT name, mod
24500 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61 20 46  e, mtime, data F
24510 52 4f 4d 20 66 73 64 69 72 28 3f 2c 20 3f 29 22  ROM fsdir(?, ?)"
24520 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
24530 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20  zCreate = .     
24540 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
24550 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c  F NOT EXISTS sql
24560 61 72 28 22 0a 20 20 20 20 20 20 22 6e 61 6d 65  ar(".      "name
24570 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
24580 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74  Y,  -- name of t
24590 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20  he file\n".     
245a0 20 22 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20   "mode INT,     
245b0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63            -- acc
245c0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c  ess permissions\
245d0 6e 22 0a 20 20 20 20 20 20 22 6d 74 69 6d 65 20  n".      "mtime 
245e0 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  INT,            
245f0 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69    -- last modifi
24600 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20  cation time\n". 
24610 20 20 20 20 20 22 73 7a 20 49 4e 54 2c 20 20 20       "sz INT,   
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
24630 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 73   original file s
24640 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22 64 61  ize\n".      "da
24650 74 61 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20  ta BLOB         
24660 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73        -- compres
24670 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20  sed content\n". 
24680 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68   ")";.  const ch
24690 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f  ar *zDrop = "DRO
246a0 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
246b0 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73  S sqlar";.  cons
246c0 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20  t char *zInsert 
246d0 3d 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  = "REPLACE INTO 
246e0 73 71 6c 61 72 20 56 41 4c 55 45 53 28 3f 2c 3f  sqlar VALUES(?,?
246f0 2c 3f 2c 3f 2c 73 71 6c 61 72 5f 63 6f 6d 70 72  ,?,?,sqlar_compr
24700 65 73 73 28 3f 29 29 22 3b 0a 0a 20 20 73 71 6c  ess(?))";..  sql
24710 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
24720 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
24730 44 69 72 65 63 74 6f 72 79 20 74 72 61 76 65 72  Directory traver
24740 73 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ser */.  sqlite3
24750 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
24760 20 30 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70   0;      /* Comp
24770 69 6c 61 74 69 6f 6e 20 6f 66 20 7a 49 6e 73 65  ilation of zInse
24780 72 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rt */.  int i;  
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
247b0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
247c0 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69   azFile[] */.  i
247d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
247f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24800 0a 0a 20 20 61 73 73 65 72 74 28 20 70 41 72 2d  ..  assert( pAr-
24810 3e 62 5a 69 70 3d 3d 30 20 29 3b 0a 0a 20 20 72  >bZip==0 );..  r
24820 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
24830 28 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20  (db, "SAVEPOINT 
24840 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ar;", 0, 0, 0);.
24850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24860 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
24870 0a 0a 20 20 69 66 28 20 62 55 70 64 61 74 65 3d  ..  if( bUpdate=
24880 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
24890 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
248a0 7a 44 72 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  zDrop, 0, 0, 0);
248b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
248c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
248d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
248e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
248f0 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
24900 30 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  0);.  shellPrepa
24910 72 65 28 64 62 2c 20 26 72 63 2c 20 7a 49 6e 73  re(db, &rc, zIns
24920 65 72 74 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a  ert, &pInsert);.
24930 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
24940 62 2c 20 26 72 63 2c 20 7a 53 71 6c 2c 20 26 70  b, &rc, zSql, &p
24950 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Stmt);.  sqlite3
24960 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
24970 2c 20 32 2c 20 70 41 72 2d 3e 7a 44 69 72 2c 20  , 2, pAr->zDir, 
24980 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
24990 43 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  C);..  for(i=0; 
249a0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
249b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
249c0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
249d0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
249e0 20 31 2c 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69   1, pAr->azArg[i
249f0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
24a00 41 54 49 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  ATIC);.    while
24a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
24a30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
24a40 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
24a50 73 7a 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  sz;.      const 
24a60 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
24a70 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
24a80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
24a90 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
24aa0 69 6e 74 20 6d 6f 64 65 20 3d 20 73 71 6c 69 74  int mode = sqlit
24ab0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
24ac0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 75  tmt, 1);.      u
24ad0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 74 69 6d  nsigned int mtim
24ae0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
24af0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
24b00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  ;..      if( pAr
24b10 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
24b20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
24b30 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
24b40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
24b50 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
24b60 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72  bind_text(pInser
24b70 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  t, 1, zName, -1,
24b80 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
24b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
24ba0 69 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72 74 2c  ind_int(pInsert,
24bb0 20 32 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 20   2, mode);.     
24bc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
24bd0 74 36 34 28 70 49 6e 73 65 72 74 2c 20 33 2c 20  t64(pInsert, 3, 
24be0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6d  (sqlite3_int64)m
24bf0 74 69 6d 65 29 3b 0a 0a 20 20 20 20 20 20 69 66  time);..      if
24c00 28 20 53 5f 49 53 44 49 52 28 6d 6f 64 65 29 20  ( S_ISDIR(mode) 
24c10 29 7b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  ){.        sz = 
24c20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
24c30 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
24c40 73 65 72 74 2c 20 35 29 3b 0a 20 20 20 20 20 20  sert, 5);.      
24c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24c60 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
24c70 65 28 70 49 6e 73 65 72 74 2c 20 35 2c 20 73 71  e(pInsert, 5, sq
24c80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
24c90 75 65 28 70 53 74 6d 74 2c 20 33 29 29 3b 0a 20  ue(pStmt, 3));. 
24ca0 20 20 20 20 20 20 20 69 66 28 20 53 5f 49 53 4c         if( S_ISL
24cb0 4e 4b 28 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  NK(mode) ){.    
24cc0 20 20 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20        sz = -1;. 
24cd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24ce0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 73 71 6c          sz = sql
24cf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
24d00 73 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  s(pStmt, 3);.   
24d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
24d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24d30 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72 74 2c 20  nd_int(pInsert, 
24d40 34 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 73 71  4, sz);.      sq
24d50 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
24d60 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rt);.      rc = 
24d70 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49  sqlite3_reset(pI
24d80 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nsert);.    }.  
24d90 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63    shellReset(&rc
24da0 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  , pStmt);.  }.. 
24db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24dc0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
24dd0 33 5f 65 78 65 63 28 64 62 2c 20 22 52 4f 4c 4c  3_exec(db, "ROLL
24de0 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45  BACK TO ar; RELE
24df0 41 53 45 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20  ASE ar;", 0, 0, 
24e00 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
24e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
24e20 65 63 28 64 62 2c 20 22 52 45 4c 45 41 53 45 20  ec(db, "RELEASE 
24e30 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ar;", 0, 0, 0);.
24e40 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c    }.  shellFinal
24e50 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
24e60 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
24e70 28 26 72 63 2c 20 70 49 6e 73 65 72 74 29 3b 0a  (&rc, pInsert);.
24e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24e90 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
24ea0 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 43 72 65  tion of .ar "Cre
24eb0 61 74 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  ate" command. .*
24ec0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
24ed0 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 69 6e  "sqlar" table in
24ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 66   the database if
24ef0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
24f00 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54  eady exist..** T
24f10 68 65 6e 20 61 64 64 20 65 61 63 68 20 66 69 6c  hen add each fil
24f20 65 20 69 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b  e in the azFile[
24f30 5d 20 61 72 72 61 79 20 74 6f 20 74 68 65 20 61  ] array to the a
24f40 72 63 68 69 76 65 2e 20 44 69 72 65 63 74 6f 72  rchive. Director
24f50 69 65 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64  ies.** are added
24f60 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 49 66   recursively. If
24f70 20 61 72 67 75 6d 65 6e 74 20 62 56 65 72 62 6f   argument bVerbo
24f80 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  se is non-zero, 
24f90 61 20 6d 65 73 73 61 67 65 20 69 73 0a 2a 2a 20  a message is.** 
24fa0 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75  printed on stdou
24fb0 74 20 66 6f 72 20 65 61 63 68 20 66 69 6c 65 20  t for each file 
24fc0 61 72 63 68 69 76 65 64 2e 0a 2a 2f 0a 73 74 61  archived..*/.sta
24fd0 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
24fe0 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
24ff0 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
25000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
25010 65 6c 6c 20 73 74 61 74 65 20 70 6f 69 6e 74 65  ell state pointe
25020 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
25030 64 62 2c 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20  db,.  ArCommand 
25040 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20  *pAr            
25050 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64        /* Command
25060 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
25070 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 72  ptions */.){.  r
25080 65 74 75 72 6e 20 61 72 43 72 65 61 74 65 55 70  eturn arCreateUp
25090 64 61 74 65 28 70 2c 20 64 62 2c 20 70 41 72 2c  date(p, db, pAr,
250a0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   0);.}../*.** Im
250b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
250c0 2e 61 72 20 22 55 70 64 61 74 65 22 20 63 6f 6d  .ar "Update" com
250d0 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mand. .*/.static
250e0 20 69 6e 74 20 61 72 55 70 64 61 74 65 43 6d 64   int arUpdateCmd
250f0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
25100 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43  sqlite3 *db, ArC
25110 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
25120 72 65 74 75 72 6e 20 61 72 43 72 65 61 74 65 55  return arCreateU
25130 70 64 61 74 65 28 70 2c 20 64 62 2c 20 70 41 72  pdate(p, db, pAr
25140 2c 20 31 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 1);.}.../*.** 
25150 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25160 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d  f ".ar" dot comm
25170 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
25180 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28  nt arDotCommand(
25190 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
251a0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
251b0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
251c0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
251d0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
251e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
251f0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
25200 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
25210 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
25220 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25250 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
25260 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43  rg[] */.){.  ArC
25270 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e  ommand cmd;.  in
25280 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 72 50  t rc;.  rc = arP
25290 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72  arseCommand(azAr
252a0 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a  g, nArg, &cmd);.
252b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
252c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
252d0 65 33 20 2a 64 62 20 3d 20 30 3b 20 20 20 20 20  e3 *db = 0;     
252e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
252f0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 75  base handle to u
25300 73 65 20 61 73 20 61 72 63 68 69 76 65 20 2a 2f  se as archive */
25310 0a 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 62 5a  ..    if( cmd.bZ
25320 69 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ip ){.      if( 
25330 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  cmd.zFile==0 ){.
25340 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
25350 74 66 28 73 74 64 65 72 72 2c 20 22 7a 69 70 20  tf(stderr, "zip 
25360 66 6f 72 6d 61 74 20 72 65 71 75 69 72 65 73 20  format requires 
25370 61 20 2d 2d 66 69 6c 65 20 73 77 69 74 63 68 5c  a --file switch\
25380 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
25390 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
253a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
253b0 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
253c0 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  ==AR_CMD_CREATE 
253d0 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
253e0 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  CMD_UPDATE ){.  
253f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25400 28 73 74 64 65 72 72 2c 20 22 7a 69 70 20 61 72  (stderr, "zip ar
25410 63 68 69 76 65 73 20 61 72 65 20 72 65 61 64 2d  chives are read-
25420 6f 6e 6c 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  only\n");.      
25430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25440 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
25450 20 20 20 20 20 64 62 20 3d 20 70 53 74 61 74 65       db = pState
25460 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->db;.    }else 
25470 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b  if( cmd.zFile ){
25480 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
25490 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
254a0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd==AR_CMD_CRE
254b0 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ATE || cmd.eCmd=
254c0 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
254d0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
254e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
254f0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
25500 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
25510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25520 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
25530 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
25540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
25550 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
25560 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 64 62  2(cmd.zFile, &db
25570 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
25580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
255a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
255b0 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
255c0 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c 6e 22  file: %s (%s)\n"
255d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  , .            c
255e0 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  md.zFile, sqlite
255f0 33 5f 65 72 72 6d 73 67 28 64 62 29 0a 20 20 20  3_errmsg(db).   
25600 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25610 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
25620 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
25630 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
25640 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
25650 69 6f 5f 69 6e 69 74 28 64 62 2c 20 30 2c 20 30  io_init(db, 0, 0
25660 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25670 5f 73 71 6c 61 72 5f 69 6e 69 74 28 64 62 2c 20  _sqlar_init(db, 
25680 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
25690 7b 0a 20 20 20 20 20 20 64 62 20 3d 20 70 53 74  {.      db = pSt
256a0 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 7d 0a 0a  ate->db;.    }..
256b0 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e      switch( cmd.
256c0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61  eCmd ){.      ca
256d0 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
256e0 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
256f0 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 70  rCreateCommand(p
25700 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29  State, db, &cmd)
25710 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
25720 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
25730 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20  CMD_EXTRACT:.   
25740 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72       rc = arExtr
25750 61 63 74 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74  actCommand(pStat
25760 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20  e, db, &cmd);.  
25770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
25780 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
25790 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63  LIST:.        rc
257a0 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64   = arListCommand
257b0 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d  (pState, db, &cm
257c0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
257d0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
257e0 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
257f0 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74 61      arUsage(pSta
25800 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20  te->out);.      
25810 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
25820 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
25830 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43 6d   assert( cmd.eCm
25840 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
25850 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
25860 20 61 72 55 70 64 61 74 65 43 6d 64 28 70 53 74   arUpdateCmd(pSt
25870 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a  ate, db, &cmd);.
25880 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25890 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 63 6d     }..    if( cm
258a0 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
258b0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
258c0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
258d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
258e0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
258f0 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22  ion of ".expert"
25900 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
25910 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65  .static int expe
25920 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  rtDotCommand(.  
25930 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
25940 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
25950 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
25960 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
25970 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25990 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
259a0 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
259b0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
259c0 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
259f0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
25a00 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ] */.){.  int rc
25a10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25a20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
25a30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
25a40 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61  Sample = 0;..  a
25a50 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65  ssert( pState->e
25a60 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
25a70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   );.  memset(&pS
25a80 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c  tate->expert, 0,
25a90 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e   sizeof(ExpertIn
25aa0 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  fo));..  for(i=1
25ab0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
25ac0 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  && i<nArg; i++){
25ad0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
25ae0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  zArg[i];.    int
25af0 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d   n;.    if( z[0]
25b00 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
25b10 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20  -' ) z++;.    n 
25b20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
25b30 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
25b40 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72  strncmp(z, "-ver
25b50 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  bose", n) ){.   
25b60 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
25b70 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  t.bVerbose = 1;.
25b80 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
25b90 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74  f( n>=2 && 0==st
25ba0 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c  rncmp(z, "-sampl
25bb0 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20  e", n) ){.      
25bc0 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20  if( i==(nArg-1) 
25bd0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
25be0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
25bf0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
25c00 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e  n argument: %s\n
25c10 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
25c20 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25c40 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d         iSample =
25c50 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
25c60 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a  ue(azArg[++i]);.
25c70 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d          if( iSam
25c80 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65  ple<0 || iSample
25c90 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
25ca0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
25cb0 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20  err, "value out 
25cc0 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c  of range: %s\n",
25cd0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
25ce0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25cf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
25d00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25d10 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
25d20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25d30 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
25d40 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ion: %s\n", z);.
25d50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25d60 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
25d70 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
25d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
25d90 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
25da0 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  xpert = sqlite3_
25db0 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74  expert_new(pStat
25dc0 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20  e->db, &zErr);. 
25dd0 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65     if( pState->e
25de0 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
25df0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
25e00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
25e10 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77  lite3_expert_new
25e20 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
25e30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25e40 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
25e50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
25e60 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28  3_expert_config(
25e70 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74  .          pStat
25e80 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
25e90 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47  t, EXPERT_CONFIG
25ea0 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65  _SAMPLE, iSample
25eb0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
25ec0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
25ed0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ;.}.../*.** If a
25ee0 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67  n input line beg
25ef0 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65  ins with "." the
25f00 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  n invoke this ro
25f10 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63  utine to.** proc
25f20 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a  ess that line..*
25f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
25f40 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
25f50 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
25f60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
25f70 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  t do_meta_comman
25f80 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53  d(char *zLine, S
25f90 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
25fa0 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e   int h = 1;.  in
25fb0 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  t nArg = 0;.  in
25fc0 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63  t n, c;.  int rc
25fd0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a   = 0;.  char *az
25fe0 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20  Arg[50];..  if( 
25ff0 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  p->expert.pExper
26000 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46  t ){.    expertF
26010 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a  inish(p, 1, 0);.
26020 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20    }..  /* Parse 
26030 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69  the input line i
26040 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  nto tokens..  */
26050 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b  .  while( zLine[
26060 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79  h] && nArg<Array
26070 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20  Size(azArg) ){. 
26080 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
26090 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
260a0 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c  ++; }.    if( zL
260b0 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61  ine[h]==0 ) brea
260c0 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  k;.    if( zLine
260d0 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69  [h]=='\'' || zLi
260e0 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  ne[h]=='"' ){.  
260f0 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20      int delim = 
26100 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20  zLine[h++];.    
26110 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20    azArg[nArg++] 
26120 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20  = &zLine[h];.   
26130 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
26140 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d  h] && zLine[h]!=
26150 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
26160 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27   if( zLine[h]=='
26170 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22  \\' && delim=='"
26180 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21  ' && zLine[h+1]!
26190 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20  =0 ) h++;.      
261a0 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    h++;.      }. 
261b0 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
261c0 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20  ]==delim ){.    
261d0 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d      zLine[h++] =
261e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
261f0 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27    if( delim=='"'
26200 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73   ) resolve_backs
26210 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
26220 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g-1]);.    }else
26230 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  {.      azArg[nA
26240 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
26250 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
26260 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53  zLine[h] && !IsS
26270 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29  pace(zLine[h]) )
26280 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { h++; }.      i
26290 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c  f( zLine[h] ) zL
262a0 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20  ine[h++] = 0;.  
262b0 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b      resolve_back
262c0 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
262d0 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg-1]);.    }.  
262e0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
262f0 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a  the input line..
26300 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d    */.  if( nArg=
26310 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  =0 ) return 0; /
26320 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20  * no tokens, no 
26330 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73  error */.  n = s
26340 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d  trlen30(azArg[0]
26350 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30  );.  c = azArg[0
26360 5d 5b 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ][0];..#ifndef S
26370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
26380 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63  RIZATION.  if( c
26390 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
263a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68  (azArg[0], "auth
263b0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
263c0 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
263d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
263e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
263f0 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29  .auth ON|OFF\n")
26400 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
26410 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
26420 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
26430 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
26440 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  p, 0);.    if( b
26450 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
26460 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  g[1]) ){.      s
26470 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
26480 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65  rizer(p->db, she
26490 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20  llAuth, p);.    
264a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
264b0 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
264c0 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  zer(p->db, 0, 0)
264d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
264e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
264f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26500 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63  UALTABLE.  if( c
26510 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
26520 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72 22 2c  (azArg[0], "ar",
26530 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
26540 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
26550 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61   rc = arDotComma
26560 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
26570 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
26580 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
26590 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
265a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
265b0 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
265c0 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
265d0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
265e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
265f0 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
26600 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26610 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
26620 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
26630 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
26640 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
26650 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
26660 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
26670 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  j;.    for(j=1; 
26680 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nArg; j++){.  
26690 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
266a0 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  z = azArg[j];.  
266b0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
266c0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
266d0 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  le( z[0]=='-' ) 
266e0 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  z++;.        /* 
266f0 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72  No options to pr
26700 6f 63 65 73 73 20 61 74 20 74 68 69 73 20 74 69  ocess at this ti
26710 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a  me */.        {.
26720 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
26730 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
26740 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
26750 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b  s\n", azArg[j]);
26760 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
26770 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
26780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
26790 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  DestFile==0 ){. 
267a0 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
267b0 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
267c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62     }else if( zDb
267d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
267e0 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a  Db = zDestFile;.
267f0 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
26800 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
26810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26820 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
26830 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  derr, "too many 
26840 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61  arguments to .ba
26850 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ckup\n");.      
26860 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
26870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26880 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
26890 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
268a0 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73  tf(stderr, "miss
268b0 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67  ing FILENAME arg
268c0 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70  ument on .backup
268d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
268e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
268f0 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62  if( zDb==0 ) zDb
26900 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72   = "main";.    r
26910 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
26920 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65  (zDestFile, &pDe
26930 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  st);.    if( rc!
26940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26950 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26960 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
26970 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
26980 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65  \"\n", zDestFile
26990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
269a0 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
269b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
269c0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
269d0 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63  (p, 0);.    pBac
269e0 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
269f0 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
26a00 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20   "main", p->db, 
26a10 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  zDb);.    if( pB
26a20 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
26a30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26a40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
26a50 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
26a60 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
26a70 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
26a80 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
26a90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
26aa0 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
26ab0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
26ac0 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
26ad0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
26ae0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
26af0 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
26b00 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
26b10 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
26b20 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
26b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b40 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
26b50 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
26b60 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
26b70 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
26b80 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
26b90 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
26ba0 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65  (pDest);.  }else
26bb0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
26bc0 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
26bd0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69  p(azArg[0], "bai
26be0 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  l", n)==0 ){.   
26bf0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
26c00 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72        bail_on_er
26c10 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  ror = booleanVal
26c20 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
26c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26c40 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
26c50 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20  , "Usage: .bail 
26c60 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
26c70 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
26c80 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
26c90 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
26ca0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
26cb0 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d  ], "binary", n)=
26cc0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
26cd0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rg==2 ){.      i
26ce0 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
26cf0 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20  azArg[1]) ){.   
26d00 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f       setBinaryMo
26d10 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
26d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26d30 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28      setTextMode(
26d40 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
26d50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
26d60 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
26d70 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
26d80 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e  .binary on|off\n
26d90 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
26da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
26db0 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
26dc0 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d   strcmp(azArg[0]
26dd0 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"cd")==0 ){.   
26de0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
26df0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
26e00 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
26e10 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61  IN32).      wcha
26e20 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  r_t *z = sqlite3
26e30 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75  _win32_utf8_to_u
26e40 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29  nicode(azArg[1])
26e50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65  ;.      rc = !Se
26e60 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72  tCurrentDirector
26e70 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  yW(z);.      sql
26e80 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
26e90 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63  lse.      rc = c
26ea0 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  hdir(azArg[1]);.
26eb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
26ec0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
26ed0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26ee0 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67  r, "Cannot chang
26ef0 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c  e to directory \
26f00 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
26f10 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1]);.        rc 
26f20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
26f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
26f40 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
26f50 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52   "Usage: .cd DIR
26f60 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20  ECTORY\n");.    
26f70 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
26f80 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68    }else..  /* Th
26f90 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22  e undocumented "
26fa0 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d  .breakpoint" com
26fb0 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61  mand causes a ca
26fc0 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a  ll to the no-op.
26fd0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d    ** routine nam
26fe0 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  ed test_breakpoi
26ff0 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nt()..  */.  if(
27000 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
27010 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
27020 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74  [0], "breakpoint
27030 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27040 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
27050 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
27060 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
27070 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
27080 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c  g[0], "changes",
27090 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
270a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
270b0 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61     setOrClearFla
270c0 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74  g(p, SHFLG_Count
270d0 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31  Changes, azArg[1
270e0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
270f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27100 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
27110 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c  .changes on|off\
27120 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
27130 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
27140 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75  ..  /* Cancel ou
27150 74 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e  tput redirection
27160 2c 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65  , if it is curre
27170 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65  ntly set (by .te
27180 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65  stcase).  ** The
27190 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  n read the conte
271a0 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61  nt of the testca
271b0 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20  se-out.txt file 
271c0 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69  and compare agai
271d0 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31  nst.  ** azArg[1
271e0 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  ].  If there are
271f0 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65   differences, re
27200 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e  port an error an
27210 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  d exit..  */.  i
27220 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d  f( c=='c' && n>=
27230 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
27240 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20  rg[0], "check", 
27250 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  n)==0 ){.    cha
27260 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20  r *zRes = 0;.   
27270 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
27280 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
27290 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
272a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
272b0 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f  sage: .check GLO
272c0 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20  B-PATTERN\n");. 
272d0 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20       rc = 2;.   
272e0 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73   }else if( (zRes
272f0 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73   = readFile("tes
27300 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20  tcase-out.txt", 
27310 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
27320 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
27330 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
27340 74 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65  t read 'testcase
27350 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20  -out.txt'\n");. 
27360 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20       rc = 2;.   
27370 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63   }else if( testc
27380 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31  ase_glob(azArg[1
27390 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20  ],zRes)==0 ){.  
273a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
273b0 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
273c0 20 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61           "testca
273d0 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45  se-%s FAILED\n E
273e0 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20  xpected: [%s]\n 
273f0 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e       Got: [%s]\n
27400 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27410 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65      p->zTestcase
27420 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73  , azArg[1], zRes
27430 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
27440 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27450 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27460 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d  dout, "testcase-
27470 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65  %s ok\n", p->zTe
27480 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70  stcase);.      p
27490 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20  ->nCheck++;.    
274a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
274b0 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73  ee(zRes);.  }els
274c0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
274d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
274e0 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29  [0], "clone", n)
274f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
27500 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
27510 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a  tryToClone(p, az
27520 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
27530 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
27540 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
27550 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45  age: .clone FILE
27560 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  NAME\n");.      
27570 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
27580 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
27590 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  'd' && n>1 && st
275a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
275b0 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d  "databases", n)=
275c0 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  =0 ){.    ShellS
275d0 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63  tate data;.    c
275e0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
275f0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
27600 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   0);.    memcpy(
27610 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
27620 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
27630 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
27640 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65  ;.    data.cMode
27650 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
27660 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71  ODE_List;.    sq
27670 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
27680 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65  izeof(data.colSe
27690 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f  parator),data.co
276a0 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29  lSeparator,": ")
276b0 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d  ;.    data.cnt =
276c0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
276d0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
276e0 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46  ECT name, file F
276f0 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62  ROM pragma_datab
27700 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20  ase_list",.     
27710 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c              call
27720 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
27730 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
27740 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
27750 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
27760 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
27770 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
27780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27790 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
277a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
277b0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
277c0 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
277d0 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f  zArg[0], "dbinfo
277e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
277f0 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66  rc = shell_dbinf
27800 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72  o_command(p, nAr
27810 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
27820 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
27830 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
27840 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
27850 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
27860 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
27870 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
27880 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
27890 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
278a0 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43  ader;.    ShellC
278b0 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
278c0 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 7c  G_PreserveRowid|
278d0 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b  SHFLG_Newlines);
278e0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
278f0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
27900 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30    if( azArg[i][0
27910 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
27920 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
27930 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20  = azArg[i]+1;.  
27940 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
27950 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
27960 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
27970 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  "preserve-rowids
27980 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
27990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
279a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
279b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
279c0 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65  derr, "The --pre
279d0 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74  serve-rowids opt
279e0 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  ion is not compa
279f0 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20  tible".         
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54      " with SQLIT
27a20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27a30 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  BLE\n");.       
27a40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
27a50 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
27a60 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c  ommand_exit;.#el
27a70 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  se.          She
27a80 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
27a90 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
27aa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
27ab0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
27ac0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65  if( strcmp(z,"ne
27ad0 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20  wlines")==0 ){. 
27ae0 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
27af0 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  tFlag(p, SHFLG_N
27b00 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20  ewlines);.      
27b10 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
27b20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
27b30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
27b40 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
27b50 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70  "%s\" on \".dump
27b60 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  \"\n", azArg[i])
27b70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27b80 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
27b90 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
27ba0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
27bb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27bc0 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20  zLike ){.       
27bd0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
27be0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d  rr, "Usage: .dum
27bf0 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  p ?--preserve-ro
27c00 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20  wids? ".        
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f     "?--newlines?
27c30 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
27c40 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
27c50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
27c60 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
27c70 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
27c80 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
27c90 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
27ca0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70    }.    }.    op
27cb0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
27cc0 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
27cd0 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
27ce0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
27cf0 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
27d00 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
27d10 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
27d20 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
27d30 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
27d40 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
27d50 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
27d60 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
27d70 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
27d80 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
27d90 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ems. */.    raw_
27da0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
27db0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
27dc0 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
27dd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
27de0 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
27df0 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
27e00 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
27e10 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ema = 0;.    p->
27e20 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
27e30 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61      /* Set writa
27e40 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69  ble_schema=ON si
27e50 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72  nce doing so for
27e60 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e  ces SQLite to in
27e70 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
27e80 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
27e90 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20  chema as it can 
27ea0 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69  even if the sqli
27eb0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
27ec0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  is.    ** corrup
27ed0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
27ee0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
27ef0 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
27f00 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
27f10 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
27f20 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
27f30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c   = 0;.    if( zL
27f40 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ike==0 ){.      
27f50 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
27f60 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
27f70 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
27f80 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
27f90 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
27fa0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
27fb0 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
27fc0 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
27fd0 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
27fe0 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
27ff0 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
28000 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
28010 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
28020 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
28030 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
28040 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
28050 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69  HERE name=='sqli
28060 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
28070 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
28080 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
28090 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
280a0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
280b0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
280c0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
280d0 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
280e0 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
280f0 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
28100 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ", 0.      );.  
28110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
28120 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
28130 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
28140 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
28150 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
28160 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
28170 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
28180 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
28190 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e  _name LIKE %Q AN
281a0 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
281b0 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
281c0 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  sql NOT NULL", z
281d0 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
281e0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
281f0 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20  ry(p,zSql);.    
28200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28210 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Sql);.      zSql
28220 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
28230 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
28240 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
28250 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
28260 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
28270 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
28280 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
28290 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
282a0 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
282b0 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
282c0 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a  name LIKE %Q", z
282d0 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
282e0 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
282f0 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  y(p, zSql, 0);. 
28300 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28310 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
28320 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
28330 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
28340 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
28350 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
28360 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
28370 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
28380 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
28390 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
283a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
283b0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
283c0 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
283d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
283e0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
283f0 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70  b, "RELEASE dump
28400 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
28410 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
28420 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22  out, p->nErr ? "
28430 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65  ROLLBACK; -- due
28440 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20   to errors\n" : 
28450 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
28460 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
28470 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  = savedShowHeade
28480 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  r;.  }else..  if
28490 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
284a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
284b0 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  cho", n)==0 ){. 
284c0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
284d0 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
284e0 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
284f0 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  Echo, azArg[1]);
28500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28510 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
28520 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63  err, "Usage: .ec
28530 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ho on|off\n");. 
28540 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
28550 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
28560 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
28570 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
28580 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  qp", n)==0 ){.  
28590 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
285a0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
285b0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c  p(azArg[1],"full
285c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
285d0 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
285e0 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20  TOEQP_full;.    
285f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
28600 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69  mp(azArg[1],"tri
28610 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  gger")==0 ){.   
28620 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
28630 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  = AUTOEQP_trigge
28640 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
28650 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
28660 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  QP = booleanValu
28670 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
28680 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
28690 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
286a0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
286b0 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69   .eqp off|on|tri
286c0 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20  gger|full\n");. 
286d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
286e0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
286f0 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
28700 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
28710 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  xit", n)==0 ){. 
28720 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
28730 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65   (rc = (int)inte
28740 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
28750 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63  ]))!=0 ) exit(rc
28760 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  );.    rc = 2;. 
28770 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
28780 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d   ".explain" comm
28790 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63  and is automatic
287a0 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72   now.  It is lar
287b0 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20  gely pointless. 
287c0 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65   It.  ** retaine
287d0 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63  d purely for bac
287e0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
287f0 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d  lity */.  if( c=
28800 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
28810 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
28820 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
28830 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20    int val = 1;. 
28840 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
28850 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
28860 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74  mp(azArg[1],"aut
28870 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
28880 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20    val = 99;.    
28890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
288a0 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56   val =  booleanV
288b0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
288c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
288d0 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20    if( val==1 && 
288e0 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78  p->mode!=MODE_Ex
288f0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  plain ){.      p
28900 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70  ->normalMode = p
28910 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  ->mode;.      p-
28920 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
28930 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61  lain;.      p->a
28940 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
28950 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
28960 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l==0 ){.      if
28970 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
28980 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
28990 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
289a0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
289b0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
289c0 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
289d0 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  99 ){.      if( 
289e0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
289f0 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
28a00 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
28a10 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
28a20 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  plain = 1;.    }
28a30 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
28a40 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
28a50 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
28a60 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ert", n)==0 ){. 
28a70 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
28a80 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74 43  ;.    expertDotC
28a90 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c  ommand(p, azArg,
28aa0 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
28ab0 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26  .  if( c=='f' &&
28ac0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
28ad0 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c  ], "fullschema",
28ae0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
28af0 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
28b00 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
28b10 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f   = 0;.    int do
28b20 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d  Stats = 0;.    m
28b30 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
28b40 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
28b50 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
28b60 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
28b70 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
28b80 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
28b90 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
28ba0 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  && optionMatch(a
28bb0 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74  zArg[1], "indent
28bc0 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  ") ){.      data
28bd0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
28be0 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79  de = MODE_Pretty
28bf0 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31  ;.      nArg = 1
28c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28c10 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20  nArg!=1 ){.     
28c20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28c30 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c  rr, "Usage: .ful
28c40 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
28c50 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t?\n");.      rc
28c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
28c70 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
28c80 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
28c90 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
28ca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
28cb0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
28cc0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
28cd0 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45  M".       "  (SE
28ce0 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
28cf0 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
28d00 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
28d10 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
28d20 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f         "     FRO
28d30 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
28d40 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
28d50 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
28d60 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
28d70 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52  , name, rowid FR
28d80 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
28d90 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
28da0 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
28db0 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
28dc0 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
28dd0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
28de0 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52   ".       "ORDER
28df0 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
28e00 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
28e10 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
28e20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
28e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28e40 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
28e50 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63  *pStmt;.      rc
28e60 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
28e70 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
28e80 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
28e90 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
28ea0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
28ec0 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
28ed0 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
28ee0 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
28ef0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
28f00 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73  );.      doStats
28f10 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
28f20 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
28f30 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OW;.      sqlite
28f40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
28f50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28f60 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20   doStats==0 ){. 
28f70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28f80 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53  p->out, "/* No S
28f90 54 41 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c  TAT tables avail
28fa0 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20  able */\n");.   
28fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
28fc0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
28fd0 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
28fe0 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
28ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
29000 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29010 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  'ANALYZE sqlite_
29020 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20  master'",.      
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
29040 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
29050 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
29060 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
29070 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  .mode = MODE_Ins
29080 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  ert;.      data.
29090 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
290a0 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20  lite_stat1";.   
290b0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
290c0 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
290d0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ROM sqlite_stat1
290e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
290f0 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
29100 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d  ck, &data,&zErrM
29110 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
29120 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
29130 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20  lite_stat3";.   
29140 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
29150 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
29160 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ROM sqlite_stat3
29170 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29180 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
29190 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d  ck, &data,&zErrM
291a0 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
291b0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
291c0 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20  lite_stat4";.   
291d0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
291e0 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >db, "SELECT * F
291f0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ROM sqlite_stat4
29200 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29210 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61      shell_callba
29220 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
29230 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  Msg);.      raw_
29240 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
29250 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
29260 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
29270 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
29280 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
29290 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
292a0 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  aders", n)==0 ){
292b0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
292c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f   ){.      p->sho
292d0 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61  wHeader = boolea
292e0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
292f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29300 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29310 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68  derr, "Usage: .h
29320 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22  eaders on|off\n"
29330 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
29340 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
29350 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20    if( c=='h' && 
29360 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
29370 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20  , "help", n)==0 
29380 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
29390 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
293a0 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   zHelp);.  }else
293b0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26  ..  if( c=='i' &
293c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
293d0 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29  0], "import", n)
293e0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
293f0 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
29400 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
29410 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
29420 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
29430 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
29440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
29450 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72   of file to extr
29460 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a  a content from *
29470 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
29480 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
29490 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
294a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
294b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
294c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
294d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
294e0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
294f0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
29500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29510 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
29520 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
29530 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
29560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
29570 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
29580 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43      /* True to C
29590 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
295a0 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20  K at end */.    
295b0 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
295c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
295d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
295e0 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  n p->colSeparato
295f0 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  r[] */.    char 
29600 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
29610 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
29620 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
29630 20 20 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78    ImportCtx sCtx
29640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29650 20 52 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20   Reader context 
29660 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51  */.    char *(SQ
29670 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61  LITE_CDECL *xRea
29680 64 29 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20  d)(ImportCtx*); 
29690 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20  /* Func to read 
296a0 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  one value */.   
296b0 20 69 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45   int (SQLITE_CDE
296c0 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c  CL *xCloser)(FIL
296d0 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e  E*);      /* Fun
296e0 63 20 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20  c to close file 
296f0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  */..    if( nArg
29700 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=3 ){.      raw
29710 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29720 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20  "Usage: .import 
29730 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a  FILE TABLE\n");.
29740 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
29750 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
29760 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
29770 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54  azArg[1];.    zT
29780 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  able = azArg[2];
29790 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75  .    seenInterru
297a0 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  pt = 0;.    mems
297b0 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
297c0 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
297d0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
297e0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
297f0 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
29800 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
29810 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
29820 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29840 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75    "Error: non-nu
29850 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ll column separa
29860 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
29870 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
29880 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
29890 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
298a0 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
298b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
298c0 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
298d0 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70  acter column sep
298e0 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
298f0 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
29900 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
29910 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
29920 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
29930 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74   }.    nSep = st
29940 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
29950 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
29960 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
29970 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29980 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e  err, "Error: non
29990 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61  -null row separa
299a0 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
299b0 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
299c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
299d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d   }.    if( nSep=
299e0 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d  =2 && p->mode==M
299f0 4f 44 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d  ODE_Csv && strcm
29a00 70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  p(p->rowSeparato
29a10 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20  r, SEP_CrLf)==0 
29a20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ){.      /* When
29a30 20 69 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28   importing CSV (
29a40 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f  only), if the ro
29a50 77 20 73 65 70 61 72 61 74 6f 72 20 69 73 20 73  w separator is s
29a60 65 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  et to the.      
29a70 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75  ** default outpu
29a80 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c  t row separator,
29a90 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68   change it to th
29aa0 65 20 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a  e default input.
29ab0 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70        ** row sep
29ac0 61 72 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76  arator.  This av
29ad0 6f 69 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d  oids having to m
29ae0 61 69 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e  aintain differen
29af0 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
29b00 20 61 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20   and output row 
29b10 73 65 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20  separators. */. 
29b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
29b30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
29b40 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
29b50 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
29b60 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20  SEP_Row);.      
29b70 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
29b80 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
29b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29ba0 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
29bb0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29bc0 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
29bd0 2d 63 68 61 72 61 63 74 65 72 20 72 6f 77 20 73  -character row s
29be0 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
29bf0 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
29c10 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
29c20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29c30 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46     }.    sCtx.zF
29c40 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20  ile = zFile;.   
29c50 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b   sCtx.nLine = 1;
29c60 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46  .    if( sCtx.zF
29c70 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23  ile[0]=='|' ){.#
29c80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
29c90 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61  T_POPEN.      ra
29ca0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29cb0 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61   "Error: pipes a
29cc0 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
29cd0 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b   in this OS\n");
29ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
29cf0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74  .#else.      sCt
29d00 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74  x.in = popen(sCt
29d10 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b  x.zFile+1, "r");
29d20 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c  .      sCtx.zFil
29d30 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20  e = "<pipe>";.  
29d40 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63      xCloser = pc
29d50 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  lose;.#endif.   
29d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43   }else{.      sC
29d70 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43  tx.in = fopen(sC
29d80 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  tx.zFile, "rb");
29d90 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
29da0 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20   fclose;.    }. 
29db0 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
29dc0 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20  MODE_Ascii ){.  
29dd0 20 20 20 20 78 52 65 61 64 20 3d 20 61 73 63 69      xRead = asci
29de0 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
29df0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29e00 20 20 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72     xRead = csv_r
29e10 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
29e20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74     }.    if( sCt
29e30 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x.in==0 ){.     
29e40 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29e50 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
29e60 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
29e70 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
29e80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29e90 7d 0a 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53  }.    sCtx.cColS
29ea0 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72  ep = p->colSepar
29eb0 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74  ator[0];.    sCt
29ec0 78 2e 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72  x.cRowSep = p->r
29ed0 6f 77 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  owSeparator[0];.
29ee0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
29ef0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
29f00 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a  CT * FROM %s", z
29f10 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
29f20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
29f30 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29f40 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
29f50 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
29f60 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
29f70 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  x.in);.      ret
29f80 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
29f90 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
29fa0 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
29fb0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
29fc0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
29fd0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
29fe0 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70  ;.    import_app
29ff0 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20  end_char(&sCtx, 
2a000 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73  0);    /* To ens
2a010 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c  ure sCtx.z is al
2a020 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
2a030 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33  f( rc && sqlite3
2a040 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63  _strglob("no suc
2a050 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c  h table: *", sql
2a060 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2a070 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))==0 ){.      
2a080 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
2a090 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2a0a0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
2a0b0 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
2a0c0 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
2a0d0 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ';.      while( 
2a0e0 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a  xRead(&sCtx) ){.
2a0f0 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20          zCreate 
2a100 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a110 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c  f("%z%c\n  \"%w\
2a120 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65  " TEXT", zCreate
2a130 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b  , cSep, sCtx.z);
2a140 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d 20  .        cSep = 
2a150 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
2a160 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2a170 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61  x.cColSep ) brea
2a180 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a190 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29   if( cSep=='(' )
2a1a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a1b0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2a1c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a1d0 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
2a1e0 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73         xCloser(s
2a1f0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20  Ctx.in);.       
2a200 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a210 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66  err,"%s: empty f
2a220 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69  ile\n", sCtx.zFi
2a230 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  le);.        ret
2a240 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2a250 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
2a260 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2a270 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29  %z\n)", zCreate)
2a280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2a290 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2a2a0 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
2a2b0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2a2c0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2a2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2a2e0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2a2f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52  intf(stderr, "CR
2a300 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e  EATE TABLE %s(..
2a310 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  .) failed: %s\n"
2a320 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  , zTable,.      
2a330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a340 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2a350 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a360 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
2a370 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
2a380 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2a390 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a3a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2a3b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2a3c0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2a3d0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2a3e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a3f0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2a400 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2a410 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
2a420 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2a430 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  mt);.      utf8_
2a440 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
2a450 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2a460 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2a470 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b));.      xClos
2a480 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2a490 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2a4a0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
2a4b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2a4c0 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
2a4d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2a4e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
2a4f0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
2a500 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
2a510 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
2a520 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
2a530 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2a540 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65  _malloc64( nByte
2a550 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  *2 + 20 + nCol*2
2a560 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
2a570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2a580 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a590 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
2a5a0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
2a5b0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2a5c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a5d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
2a5e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2a5f0 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+20, zSql, "I
2a600 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
2a610 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
2a620 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
2a630 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
2a640 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
2a650 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
2a660 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
2a670 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2a680 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
2a690 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
2a6a0 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
2a6b0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
2a6c0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2a6d0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2a6e0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2a6f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2a700 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2a710 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2a720 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2a730 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2a740 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2a750 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  );.      if (pSt
2a760 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
2a770 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2a780 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2a790 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2a7a0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2a7b0 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69  eedCommit = sqli
2a7c0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
2a7d0 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  it(p->db);.    i
2a7e0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
2a7f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2a800 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
2a810 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  0, 0);.    do{. 
2a820 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69       int startLi
2a830 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b  ne = sCtx.nLine;
2a840 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a850 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
2a860 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
2a870 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
2a880 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
2a890 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
2a8a0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66   end-of-file bef
2a8b0 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20  ore finding any 
2a8c0 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20  columns?.       
2a8d0 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20   ** If so, stop 
2a8e0 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20  instead of NULL 
2a8f0 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61  filling the rema
2a900 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
2a910 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a920 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d    if( z==0 && i=
2a930 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2a940 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
2a950 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
2a960 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e  nd-of-file OR en
2a970 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65  d-of-line before
2a980 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20   finding any.   
2a990 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
2a9a0 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20  in ASCII mode?  
2a9b0 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
2a9c0 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
2a9d0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
2a9e0 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
2a9f0 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
2aa00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2aa10 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69  mode==MODE_Ascii
2aa20 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30   && (z==0 || z[0
2aa30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20  ]==0) && i==0 ) 
2aa40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
2aa50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2aa60 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20  (pStmt, i+1, z, 
2aa70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
2aa80 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69  IENT);.        i
2aa90 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73  f( i<nCol-1 && s
2aaa0 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
2aab0 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20  cColSep ){.     
2aac0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2aad0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
2aae0 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
2aaf0 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
2ab00 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73  "filling the res
2ab30 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a  t with NULL\n",.
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab50 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
2ab60 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
2ab70 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
2ab80 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
2ab90 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2aba0 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74  i<=nCol ){ sqlit
2abb0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
2abc0 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20  mt, i); i++; }. 
2abd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2abe0 0a 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e  .      if( sCtx.
2abf0 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c  cTerm==sCtx.cCol
2ac00 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64  Sep ){.        d
2ac10 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78 52 65  o{.          xRe
2ac20 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
2ac30 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2ac40 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
2ac50 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53  Term==sCtx.cColS
2ac60 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74  ep );.        ut
2ac70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ac80 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
2ac90 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
2aca0 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69         "extras i
2acd0 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20  gnored\n",.     
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
2ad00 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
2ad10 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
2ad20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b    if( i>=nCol ){
2ad30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ad40 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
2ad50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ad60 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
2ad70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2ad80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad90 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ada0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
2adb0 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65  %d: INSERT faile
2adc0 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a  d: %s\n", sCtx.z
2add0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72              star
2adf0 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65  tLine, sqlite3_e
2ae00 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
2ae10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ae20 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74  .    }while( sCt
2ae30 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a  x.cTerm!=EOF );.
2ae40 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74  .    xCloser(sCt
2ae50 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  x.in);.    sqlit
2ae60 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
2ae70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
2ae80 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2ae90 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
2aea0 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
2aeb0 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  p->db, "COMMIT",
2aec0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
2aed0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
2aee0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
2aef0 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
2af00 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2af10 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d  "imposter", n)==
2af20 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2af30 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sql;.    char *z
2af40 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Collist = 0;.   
2af50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2af60 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e  Stmt;.    int tn
2af70 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  um = 0;.    int 
2af80 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  i;.    if( nArg!
2af90 3d 33 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =3 ){.      utf8
2afa0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2afb0 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65  "Usage: .imposte
2afc0 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52  r INDEX IMPOSTER
2afd0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2afe0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2aff0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2b000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2b010 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a  _db(p, 0);.    z
2b020 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2b030 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f  rintf("SELECT ro
2b040 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
2b050 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
2b080 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
2b090 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67  ='index'", azArg
2b0a0 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
2b0b0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2b0c0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2b0d0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2b0e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2b0f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2b100 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
2b110 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2b120 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65     tnum = sqlite
2b130 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2b140 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 0);.    }.  
2b150 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2b160 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
2b170 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  f( tnum==0 ){.  
2b180 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b190 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68  stderr, "no such
2b1a0 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e   index: \"%s\"\n
2b1b0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2b1c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2b1d0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2b1e0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2b1f0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2b200 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
2b210 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27  MA index_xinfo='
2b220 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  %q'", azArg[1]);
2b230 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b240 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2b250 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2b260 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2b270 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2b280 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20  ;.    i = 0;.   
2b290 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
2b2a0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2b2b0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2b2c0 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d   char zLabel[20]
2b2d0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
2b2e0 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  ar *zCol = (cons
2b2f0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2b300 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2b310 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  t,2);.      i++;
2b320 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d  .      if( zCol=
2b330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
2b340 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
2b350 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d  _int(pStmt,1)==-
2b360 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  1 ){.          z
2b370 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
2b380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b3a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2b3b0 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c  f(zLabel),zLabel
2b3c0 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20  ,"expr%d",i);.  
2b3d0 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a          zCol = z
2b3e0 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Label;.        }
2b3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b400 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29  f( zCollist==0 )
2b410 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69  {.        zColli
2b420 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
2b430 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
2b440 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
2b450 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  e{.        zColl
2b460 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ist = sqlite3_mp
2b470 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22  rintf("%z,\"%w\"
2b480 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ", zCollist, zCo
2b490 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2b4a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
2b4b0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2b4c0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2b4d0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2b4e0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
2b4f0 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49  LE \"%w\"(%s,PRI
2b500 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57 49 54  MARY KEY(%s))WIT
2b510 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20  HOUT ROWID",.   
2b520 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c         azArg[2],
2b530 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c   zCollist, zColl
2b540 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2b550 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29  3_free(zCollist)
2b560 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b570 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2b580 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2b590 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
2b5a0 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d   "main", 1, tnum
2b5b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2b5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2b5e0 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
2b5f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
2b600 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2b610 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2b620 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
2b630 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30  p->db, "main", 0
2b640 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2b650 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2b660 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b670 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d  , "Error in [%s]
2b680 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73  : %s\n", zSql, s
2b690 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2b6a0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >db));.      }el
2b6b0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
2b6c0 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
2b6d0 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  "%s;\n", zSql);.
2b6e0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2b6f0 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20  tf(stdout,.     
2b700 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20        "WARNING: 
2b710 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d  writing to an im
2b720 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c  poster table wil
2b730 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e  l corrupt the in
2b740 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20  dex!\n".        
2b750 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b760 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2b770 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b780 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2b790 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73  IMPOSTER returns
2b7a0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
2b7b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2b7c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b7d0 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65  e(zSql);.  }else
2b7e0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2b7f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2b800 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f  TEST_CONTROL) */
2b810 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2b820 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
2b830 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
2b840 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b850 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d   "iotrace", n)==
2b860 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f  0 ){.    SQLITE_
2b870 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20  API extern void 
2b880 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73  (SQLITE_CDECL *s
2b890 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63  qlite3IoTrace)(c
2b8a0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29  onst char*, ...)
2b8b0 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63  ;.    if( iotrac
2b8c0 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74  e && iotrace!=st
2b8d0 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f  dout ) fclose(io
2b8e0 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72  trace);.    iotr
2b8f0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ace = 0;.    if(
2b900 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
2b910 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2b920 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2b930 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
2b940 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20  1], "-")==0 ){. 
2b950 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
2b960 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
2b970 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61  ntf;.      iotra
2b980 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ce = stdout;.   
2b990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
2b9a0 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a  trace = fopen(az
2b9b0 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20  Arg[1], "w");.  
2b9c0 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d      if( iotrace=
2b9d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2b9e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b9f0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2ba00 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
2ba10 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2ba20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
2ba30 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2ba40 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
2ba50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2ba60 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
2ba70 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
2ba80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2ba90 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
2baa0 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20   c=='l' && n>=5 
2bab0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2bac0 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e  [0], "limits", n
2bad0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
2bae0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2baf0 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {.       const c
2bb00 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b  har *zLimitName;
2bb10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
2bb20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20  limit */.       
2bb30 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20  int limitCode;  
2bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
2bb50 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68  eger code for th
2bb60 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  at limit */.    
2bb70 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  } aLimit[] = {. 
2bb80 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c       { "length",
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2bbb0 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
2bbc0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2bbd0 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20  { "sql_length", 
2bbe0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2bbf0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
2bc00 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
2bc10 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f    },.      { "co
2bc20 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lumn",          
2bc30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2bc40 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2bc60 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65        { "expr_de
2bc70 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  pth",           
2bc80 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58   SQLITE_LIMIT_EX
2bc90 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  PR_DEPTH        
2bca0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2bcb0 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c   { "compound_sel
2bcc0 65 63 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ect",       SQLI
2bcd0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
2bce0 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  D_SELECT        
2bcf0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
2bd00 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20  dbe_op",        
2bd10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2bd20 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20  MIT_VDBE_OP     
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2bd40 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69  .      { "functi
2bd50 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20  on_arg",        
2bd60 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
2bd70 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
2bd80 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2bd90 20 20 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20    { "attached", 
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2bdb0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
2bdc0 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
2bdd0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2bde0 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e  like_pattern_len
2bdf0 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c  gth",   SQLITE_L
2be00 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
2be10 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d  N_LENGTH       }
2be20 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72 69 61  ,.      { "varia
2be30 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20  ble_number",    
2be40 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2be50 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
2be60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2be70 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65     { "trigger_de
2be80 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 53 51  pth",         SQ
2be90 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
2bea0 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
2beb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2bec0 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22  "worker_threads"
2bed0 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
2bee0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
2bef0 45 41 44 53 20 20 20 20 20 20 20 20 20 20 20 20  EADS            
2bf00 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
2bf10 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65  t i, n2;.    ope
2bf20 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2bf30 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
2bf40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2bf50 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74  ArraySize(aLimit
2bf60 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
2bf70 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64   printf("%20s %d
2bf80 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a  \n", aLimit[i].z
2bf90 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
2bfa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bfb0 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
2bfc0 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f  Limit[i].limitCo
2bfd0 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  de, -1));.      
2bfe0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2bff0 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20  nArg>3 ){.      
2c000 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c010 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69  r, "Usage: .limi
2c020 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55  t NAME ?NEW-VALU
2c030 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  E?\n");.      rc
2c040 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2c050 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2c060 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  it;.    }else{. 
2c070 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20       int iLimit 
2c080 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d  = -1;.      n2 =
2c090 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
2c0a0 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  1]);.      for(i
2c0b0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2c0c0 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
2c0d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2c0e0 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d  e3_strnicmp(aLim
2c0f0 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  it[i].zLimitName
2c100 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d  , azArg[1], n2)=
2c110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c120 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a  if( iLimit<0 ){.
2c130 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d              iLim
2c140 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  it = i;.        
2c150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c160 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2c170 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75  (stderr, "ambigu
2c180 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  ous limit: \"%s\
2c190 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2c1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c1b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2c1c0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2c1d0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
2c1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c200 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
2c210 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2c220 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
2c230 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  n limit: \"%s\"\
2c240 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2c250 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 74 65             "ente
2c260 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69  r \".limits\" wi
2c270 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
2c280 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a  for a list.\n",.
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2a0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
2c2b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
2c2c0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2c2d0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2c2e0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2c2f0 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
2c300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c310 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c  _limit(p->db, aL
2c320 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d  imit[iLimit].lim
2c330 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  itCode,.        
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
2c350 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
2c360 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20  azArg[2]));.    
2c370 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
2c380 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
2c390 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69  imit[iLimit].zLi
2c3a0 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
2c3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
2c3c0 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
2c3d0 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
2c3e0 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ode, -1));.    }
2c3f0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2c400 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26  c=='l' && n>2 &&
2c410 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c420 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30  ], "lint", n)==0
2c430 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
2c440 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44  p, 0);.    lintD
2c450 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
2c460 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
2c470 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
2c480 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2c490 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d  ENSION.  if( c==
2c4a0 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
2c4b0 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c  zArg[0], "load",
2c4c0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
2c4d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
2c4e0 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61   *zProc;.    cha
2c4f0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2c500 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
2c510 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c520 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c530 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45  e: .load FILE ?E
2c540 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a  NTRYPOINT?\n");.
2c550 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2c560 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2c570 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2c580 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
2c590 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f  Arg[1];.    zPro
2c5a0 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  c = nArg>=3 ? az
2c5b0 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20  Arg[2] : 0;.    
2c5c0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2c5d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2c5e0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
2c5f0 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
2c600 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
2c610 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74  E_OK ){.      ut
2c630 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2c640 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2c650 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
2c660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2c670 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
2c680 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c690 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
2c6a0 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
2c6b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
2c6c0 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  og", n)==0 ){.  
2c6d0 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
2c6e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2c6f0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2c700 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c  : .log FILENAME\
2c710 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2c720 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2c730 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c740 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
2c750 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66  ;.      output_f
2c760 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f  ile_close(p->pLo
2c770 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f  g);.      p->pLo
2c780 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  g = output_file_
2c790 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20  open(zFile);.   
2c7a0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2c7b0 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e  ( c=='m' && strn
2c7c0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d  cmp(azArg[0], "m
2c7d0 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ode", n)==0 ){. 
2c7e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c7f0 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  Mode = nArg>=2 ?
2c800 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a   azArg[1] : "";.
2c810 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 28 69 6e      int n2 = (in
2c820 74 29 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b  t)strlen(zMode);
2c830 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d  .    int c2 = zM
2c840 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ode[0];.    if( 
2c850 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
2c860 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c870 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d  [1],"lines",n2)=
2c880 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2c890 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b  ode = MODE_Line;
2c8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2c8b0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2c8c0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2c8d0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2c8e0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
2c8f0 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63  }else if( c2=='c
2c900 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2c910 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
2c920 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2c930 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
2c940 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c  olumn;.      sql
2c950 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2c960 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2c970 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2c980 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2c990 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2c9a0 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
2c9b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c9c0 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
2c9d0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2c9e0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
2c9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2ca00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2ca10 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
2ca20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
2ca30 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20   SEP_Column);.  
2ca40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2ca50 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2ca60 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2ca70 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2ca80 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
2ca90 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26  se if( c2=='h' &
2caa0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2cab0 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30  1],"html",n2)==0
2cac0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2cad0 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20  e = MODE_Html;. 
2cae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2caf0 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
2cb00 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e  azArg[1],"tcl",n
2cb10 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2cb20 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63  ->mode = MODE_Tc
2cb30 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
2cb40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2cb50 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2cb60 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2cb70 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a  or, SEP_Space);.
2cb80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2cb90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2cba0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2cbb0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2cbc0 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2cbd0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27  else if( c2=='c'
2cbe0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2cbf0 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d  g[1],"csv",n2)==
2cc00 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2cc10 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
2cc20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2cc30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2cc40 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2cc50 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
2cc60 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
2cc70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2cc80 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2cc90 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2cca0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2ccb0 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73  _CrLf);.    }els
2ccc0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
2ccd0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2cce0 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20  ],"tabs",n2)==0 
2ccf0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2cd00 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
2cd10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2cd20 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2cd30 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2cd40 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2cd50 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c  EP_Tab);.    }el
2cd60 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26  se if( c2=='i' &
2cd70 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2cd80 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d  1],"insert",n2)=
2cd90 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2cda0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
2cdb0 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62  t;.      set_tab
2cdc0 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e  le_name(p, nArg>
2cdd0 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
2cde0 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65  "table");.    }e
2cdf0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20  lse if( c2=='q' 
2ce00 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2ce10 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d  [1],"quote",n2)=
2ce20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2ce30 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65  ode = MODE_Quote
2ce40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ce50 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63  c2=='a' && strnc
2ce60 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63  mp(azArg[1],"asc
2ce70 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ii",n2)==0 ){.  
2ce80 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2ce90 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20  DE_Ascii;.      
2cea0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2ceb0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
2cec0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
2ced0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55  Separator, SEP_U
2cee0 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nit);.      sqli
2cef0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2cf00 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2cf10 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2cf20 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72  rator, SEP_Recor
2cf30 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
2cf40 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
2cf50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2cf60 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f  >out, "current o
2cf70 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e  utput mode: %s\n
2cf80 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e  ", modeDescr[p->
2cf90 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  mode]);.    }els
2cfa0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2cfb0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2cfc0 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20  or: mode should 
2cfd0 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
2cfe0 20 20 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c        "ascii col
2cff0 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
2d000 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75  ert line list qu
2d010 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29  ote tabs tcl\n")
2d020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2d030 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f      }.    p->cMo
2d040 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
2d050 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2d060 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
2d070 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
2d080 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  lue", n)==0 ){. 
2d090 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2d0a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d0b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2d0c0 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70  p->nullValue), p
2d0d0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20  ->nullValue,.   
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0f0 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
2d100 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
2d110 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llValue)-1, azAr
2d120 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2d130 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2d140 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2d150 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54  e: .nullvalue ST
2d160 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20  RING\n");.      
2d170 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2d180 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2d190 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'o' && strncmp(a
2d1a0 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c  zArg[0], "open",
2d1b0 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29   n)==0 && n>=2 )
2d1c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
2d1d0 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61  Filename;  /* Na
2d1e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2d1f0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2d200 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65  */.    int iName
2d210 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 1;       /* I
2d220 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ndex in azArg[] 
2d230 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
2d240 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c  */.    int newFl
2d250 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ag = 0;     /* T
2d260 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69  rue to delete fi
2d270 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e  le before openin
2d280 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g */.    /* Clos
2d290 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  e the existing d
2d2a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73  atabase */.    s
2d2b0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
2d2c0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
2d2d0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
2d2e0 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
2d2f0 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
2d300 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2d310 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f  3_free(p->zFreeO
2d320 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e  nClose);.    p->
2d330 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  zFreeOnClose = 0
2d340 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ;.    /* Check f
2d350 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  or command-line 
2d360 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
2d370 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e   for(iName=1; iN
2d380 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a 41 72  ame<nArg && azAr
2d390 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27  g[iName][0]=='-'
2d3a0 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20  ; iName++){.    
2d3b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2d3c0 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a  = azArg[iName];.
2d3d0 20 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e        if( option
2d3e0 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29 20 29  Match(z,"new") )
2d3f0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46 6c 61  {.        newFla
2d400 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 1;.      }el
2d410 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  se if( z[0]=='-'
2d420 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2d430 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d440 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
2d450 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
2d460 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d470 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2d480 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2d490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
2d4a0 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69   If a filename i
2d4b0 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72 79  s specified, try
2d4c0 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73   to open it firs
2d4d0 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c  t */.    zNewFil
2d4e0 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61  ename = nArg>iNa
2d4f0 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72  me ? sqlite3_mpr
2d500 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67  intf("%s", azArg
2d510 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20  [iName]) : 0;.  
2d520 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61    if( zNewFilena
2d530 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  me ){.      if( 
2d540 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44  newFlag ) shellD
2d550 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69  eleteFile(zNewFi
2d560 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  lename);.      p
2d570 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
2d580 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
2d590 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31      open_db(p, 1
2d5a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2d5b0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  db==0 ){.       
2d5c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d5d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2d5e0 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22  not open '%s'\n"
2d5f0 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  , zNewFilename);
2d600 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d610 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
2d620 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
2d630 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72  {.        p->zFr
2d640 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77  eeOnClose = zNew
2d650 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2d660 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2d670 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
2d680 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62    /* As a fall-b
2d690 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20  ack open a TEMP 
2d6a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2d6b0 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
2d6c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
2d6d0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  _db(p, 0);.    }
2d6e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2d6f0 63 3d 3d 27 6f 27 0a 20 20 20 26 26 20 28 73 74  c=='o'.   && (st
2d700 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d710 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20  "output", n)==0 
2d720 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
2d730 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
2d740 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
2d750 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
2d760 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
2d770 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
2d780 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29      if( nArg>2 )
2d790 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2d7a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2d7b0 67 65 3a 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c  ge: .%s FILE\n",
2d7c0 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
2d7d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2d7e0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2d7f0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2d800 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
2d810 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2d820 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
2d830 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
2d840 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
2d850 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d860 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c  Usage: .once FIL
2d870 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  E\n");.        r
2d880 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2d890 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2d8a0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2d8b0 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
2d8c0 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 2;.    }else{
2d8d0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
2d8e0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nt = 0;.    }.  
2d8f0 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
2d900 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  );.    if( zFile
2d910 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
2d920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
2d930 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
2d940 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2d950 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
2d960 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
2d970 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
2d980 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d990 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
2d9a0 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  t;.#else.      p
2d9b0 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46  ->out = popen(zF
2d9c0 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20  ile + 1, "w");. 
2d9d0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
2d9e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2d9f0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2da00 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
2da10 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22  open pipe \"%s\"
2da20 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b  \n", zFile + 1);
2da30 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
2da40 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
2da50 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2da60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2da70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2da80 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
2da90 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
2daa0 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
2dab0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2dad0 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69  >out = output_fi
2dae0 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a  le_open(zFile);.
2daf0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74        if( p->out
2db00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2db10 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
2db20 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20  "off")!=0 ){.   
2db30 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2db40 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2db50 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  : cannot write t
2db60 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  o \"%s\"\n", zFi
2db70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
2db80 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20         p->out = 
2db90 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  stdout;.        
2dba0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20  rc = 1;.      } 
2dbb0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
2dbc0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2dbd0 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
2dbe0 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
2dbf0 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
2dc00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2dc10 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70  lse..  if( c=='p
2dc20 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2dc30 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2dc40 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  print", n)==0 ){
2dc50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2dc60 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b  for(i=1; i<nArg;
2dc70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2dc80 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74   i>1 ) raw_print
2dc90 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a  f(p->out, " ");.
2dca0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2dcb0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
2dcc0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  azArg[i]);.    }
2dcd0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2dce0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
2dcf0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2dd00 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='p' && strncmp(
2dd10 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70  azArg[0], "promp
2dd20 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2dd30 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20   if( nArg >= 2) 
2dd40 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
2dd50 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67  mainPrompt,azArg
2dd60 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [1],(int)ArraySi
2dd70 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31  ze(mainPrompt)-1
2dd80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2dd90 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20   nArg >= 3) {.  
2dda0 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74      strncpy(cont
2ddb0 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67  inuePrompt,azArg
2ddc0 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [2],(int)ArraySi
2ddd0 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  ze(continuePromp
2dde0 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t)-1);.    }.  }
2ddf0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2de00 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
2de10 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20  Arg[0], "quit", 
2de20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
2de30 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
2de40 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e  if( c=='r' && n>
2de50 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2de60 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20  Arg[0], "read", 
2de70 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c  n)==0 ){.    FIL
2de80 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20  E *alt;.    if( 
2de90 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
2dea0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2deb0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61  rr, "Usage: .rea
2dec0 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  d FILE\n");.    
2ded0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2dee0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2def0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2df00 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a    alt = fopen(az
2df10 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20  Arg[1], "rb");. 
2df20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b     if( alt==0 ){
2df30 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2df40 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2df50 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2df60 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2df70 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
2df80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2df90 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
2dfa0 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20  input(p, alt);. 
2dfb0 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29       fclose(alt)
2dfc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2dfd0 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
2dfe0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2dff0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74  (azArg[0], "rest
2e000 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ore", n)==0 ){. 
2e010 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e020 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  SrcFile;.    con
2e030 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
2e040 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b    sqlite3 *pSrc;
2e050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
2e060 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
2e070 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d    int nTimeout =
2e080 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72   0;..    if( nAr
2e090 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53  g==2 ){.      zS
2e0a0 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  rcFile = azArg[1
2e0b0 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22  ];.      zDb = "
2e0c0 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  main";.    }else
2e0d0 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
2e0e0 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
2e0f0 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20   azArg[2];.     
2e100 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b   zDb = azArg[1];
2e110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e120 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2e130 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65  err, "Usage: .re
2e140 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c  store ?DB? FILE\
2e150 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2e160 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2e170 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2e180 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e190 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72  sqlite3_open(zSr
2e1a0 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20  cFile, &pSrc);. 
2e1b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e1c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74  E_OK ){.      ut
2e1d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2e1e0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2e1f0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
2e200 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20   zSrcFile);.    
2e210 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2e220 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
2e230 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2e240 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2e250 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
2e260 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
2e270 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
2e280 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
2e290 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
2e2a0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2e2b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2e2c0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2e2d0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2e2e0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e2f0 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
2e300 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2e310 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
2e320 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
2e330 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
2e340 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
2e350 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  OK.          || 
2e360 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
2e370 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
2e380 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2e390 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69  .        if( nTi
2e3a0 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62  meout++ >= 3 ) b
2e3b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
2e3c0 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
2e3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e3e0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
2e3f0 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
2e400 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
2e410 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
2e420 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
2e430 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2e440 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
2e450 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  ==SQLITE_LOCKED 
2e460 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2e470 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2e480 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
2e490 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
2e4a0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2e4b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e4c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2e4d0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2e4e0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2e4f0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2e500 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2e510 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2e520 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a  (pSrc);.  }else.
2e530 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
2e540 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e550 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c  0], "scanstats",
2e560 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2e570 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2e580 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f     p->scanstatsO
2e590 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
2e5a0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e  (azArg[1]);.#ifn
2e5b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2e5c0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
2e5d0 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  S.      raw_prin
2e5e0 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
2e5f0 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  ing: .scanstats 
2e600 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
2e610 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29   this build.\n")
2e620 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2e630 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2e640 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e650 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  age: .scanstats 
2e660 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2e670 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2e680 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2e690 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
2e6a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65  (azArg[0], "sche
2e6b0 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ma", n)==0 ){.  
2e6c0 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c    ShellText sSel
2e6d0 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74  ect;.    ShellSt
2e6e0 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
2e6f0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2e700 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e710 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20  *zDiv = "(";.   
2e720 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2e730 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  me = 0;.    int 
2e740 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  iSchema = 0;.   
2e750 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b   int bDebug = 0;
2e760 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  .    int ii;..  
2e770 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2e780 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2e790 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
2e7a0 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
2e7b0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
2e7c0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
2e7d0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
2e7e0 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54 65  Semi;.    initTe
2e7f0 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
2e800 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
2e810 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Arg; ii++){.    
2e820 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63    if( optionMatc
2e830 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64  h(azArg[ii],"ind
2e840 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ent") ){.       
2e850 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2e860 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
2e870 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c  retty;.      }el
2e880 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
2e890 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65  ch(azArg[ii],"de
2e8a0 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20 20 20  bug") ){.       
2e8b0 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20   bDebug = 1;.   
2e8c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61     }else if( zNa
2e8d0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
2e8e0 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69   zName = azArg[i
2e8f0 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i];.      }else{
2e900 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2e910 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e920 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69  ge: .schema ?--i
2e930 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54  ndent? ?LIKE-PAT
2e940 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  TERN?\n");.     
2e950 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2e960 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e970 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2e980 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2e990 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20   zName!=0 ){.   
2e9a0 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65 72 20     int isMaster 
2e9b0 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  = sqlite3_strlik
2e9c0 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  e(zName, "sqlite
2e9d0 5f 6d 61 73 74 65 72 22 2c 20 30 29 3d 3d 30 3b  _master", 0)==0;
2e9e0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 73  .      if( isMas
2e9f0 74 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ter || sqlite3_s
2ea00 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71  trlike(zName,"sq
2ea10 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2ea20 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",0)==0 ){.     
2ea30 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
2ea40 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
2ea50 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
2ea60 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65  argv[0] = sqlite
2ea70 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea90 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
2eaa0 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s (\n".         
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2eac0 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
2eaf0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
2eb00 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
2eb10 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb30 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
2eb40 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb60 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
2eb70 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2eb80 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69 73           ")", is
2eb90 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65  Master ? "sqlite
2eba0 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69  _master" : "sqli
2ebb0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
2ebc0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
2ebd0 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
2ebe0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
2ebf0 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
2ec00 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
2ec10 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
2ec20 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
2ec30 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
2ec40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ec50 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30  _free(new_argv[0
2ec60 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2ec70 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20 29  }.    if( zDiv )
2ec80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ec90 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2eca0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ecb0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2ecc0 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61  ->db, "SELECT na
2ecd0 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  me FROM pragma_d
2ece0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
2ed10 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2ed20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ed30 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2ed40 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2ed50 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2ed60 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2ed70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ed80 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2ed90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2eda0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
2edb0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2edc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2edd0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2ede0 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20  ct, "SELECT sql 
2edf0 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20  FROM", 0);.     
2ee00 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
2ee10 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
2ee20 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
2ee30 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2ee40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ee50 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
2ee60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2ee70 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2ee80 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  0);.        char
2ee90 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20   zScNum[30];.   
2eea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2eeb0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63  rintf(sizeof(zSc
2eec0 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25  Num), zScNum, "%
2eed0 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a  d", ++iSchema);.
2eee0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2eef0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69  xt(&sSelect, zDi
2ef00 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  v, 0);.        z
2ef10 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Div = " UNION AL
2ef20 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70  L ";.        app
2ef30 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2ef40 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  , "SELECT shell_
2ef50 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22  add_schema(sql,"
2ef60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2ef70 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2ef80 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
2ef90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
2efa0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2efb0 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
2efc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2efd0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2efe0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55  xt(&sSelect, "NU
2eff0 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
2f000 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
2f010 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f020 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20  ",name) AS sql, 
2f030 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
2f040 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30  name, rowid,", 0
2f050 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2f060 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f070 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
2f080 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f090 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
2f0a0 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
2f0b0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2f0c0 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27  Select, zDb, '\'
2f0d0 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
2f0e0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2f0f0 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d   " AS sname FROM
2f100 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
2f110 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2f120 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
2f130 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2f140 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73  xt(&sSelect, ".s
2f150 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
2f160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f170 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2f180 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66  e(pStmt);.#ifdef
2f190 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
2f1a0 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
2f1b0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
2f1c0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2f1d0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20  ext(&sSelect,.  
2f1e0 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
2f1f0 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c   ALL SELECT shel
2f200 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28  l_module_schema(
2f210 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20  name),".        
2f220 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61     " 'table', na
2f230 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  me, name, name, 
2f240 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52  9e+99, 'main' FR
2f250 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65  OM pragma_module
2f260 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  _list", 0);.    
2f270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f280 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2f290 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20 22  lect, ") WHERE "
2f2a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f2b0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
2f2c0 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73   char *zQarg = s
2f2d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2f2e0 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %Q", zName);.   
2f2f0 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28       if( strchr(
2f300 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20  zName, '.') ){. 
2f310 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
2f320 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c  ext(&sSelect, "l
2f330 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e  ower(printf('%s.
2f340 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61  %s',sname,tbl_na
2f350 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  me))", 0);.     
2f360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f370 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f380 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28  sSelect, "lower(
2f390 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a  tbl_name)", 0);.
2f3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f3b0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2f3c0 65 6c 65 63 74 2c 20 73 74 72 63 68 72 28 7a 4e  elect, strchr(zN
2f3d0 61 6d 65 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c  ame, '*') ? " GL
2f3e0 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c  OB " : " LIKE ",
2f3f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
2f400 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2f410 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20  , zQarg, 0);.   
2f420 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f430 26 73 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20  &sSelect, " AND 
2f440 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  ", 0);.        s
2f450 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72  qlite3_free(zQar
2f460 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2f470 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2f480 65 6c 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d  elect, "type!='m
2f490 65 74 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20  eta' AND sql IS 
2f4a0 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
2f4d0 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29  snum, rowid", 0)
2f4e0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 62  ;.      if( bDeb
2f4f0 75 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  ug ){.        ut
2f500 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2f510 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20  , "SQL: %s;\n", 
2f520 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20  sSelect.z);.    
2f530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2f550 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63  ec(p->db, sSelec
2f560 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26  t.z, callback, &
2f570 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
2f580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2f590 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74  reeText(&sSelect
2f5a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f5b0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
2f5c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f5d0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
2f5e0 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
2f5f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f600 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
2f610 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2f620 73 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c  se if( rc != SQL
2f630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f640 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f650 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69  r,"Error: queryi
2f660 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ng schema inform
2f670 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20  ation\n");.     
2f680 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2f690 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
2f6a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2f6b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2f6c0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
2f6d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2f6e0 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
2f6f0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
2f700 20 6e 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d   n==11 && strncm
2f710 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
2f720 65 63 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30  ecttrace", n)==0
2f730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
2f740 65 6c 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e  electTrace = (in
2f750 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
2f760 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
2f770 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  e.#endif..#if de
2f780 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2f790 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69  BLE_SESSION).  i
2f7a0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
2f7b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73  ncmp(azArg[0],"s
2f7c0 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26  ession",n)==0 &&
2f7d0 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65   n>=3 ){.    Ope
2f7e0 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
2f7f0 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f  on = &p->aSessio
2f800 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  n[0];.    char *
2f810 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b  *azCmd = &azArg[
2f820 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73  1];.    int iSes
2f830 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
2f840 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20  md = nArg - 1;. 
2f850 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
2f860 28 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f  ( nArg<=1 ) goto
2f870 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2f880 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f  error;.    open_
2f890 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
2f8a0 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20  ( nArg>=3 ){.   
2f8b0 20 20 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69     for(iSes=0; i
2f8c0 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  Ses<p->nSession;
2f8d0 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20   iSes++){.      
2f8e0 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
2f8f0 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a  aSession[iSes].z
2f900 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d  Name, azArg[1])=
2f910 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2f920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53    }.      if( iS
2f930 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  es<p->nSession )
2f940 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69  {.        pSessi
2f950 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f  on = &p->aSessio
2f960 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20  n[iSes];.       
2f970 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20   azCmd++;.      
2f980 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20    nCmd--;.      
2f990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2f9a0 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53  Session = &p->aS
2f9b0 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20  ession[0];.     
2f9c0 20 20 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20     iSes = 0;.   
2f9d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2f9e0 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61  /* .session atta
2f9f0 63 68 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20  ch TABLE.    ** 
2fa00 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
2fa10 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68  e3session_attach
2fa20 28 29 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  () interface to 
2fa30 61 74 74 61 63 68 20 61 20 70 61 72 74 69 63 75  attach a particu
2fa40 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  lar.    ** table
2fa50 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
2fa60 65 76 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20  ever filtered.. 
2fa70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
2fa80 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61  rcmp(azCmd[0],"a
2fa90 74 74 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  ttach")==0 ){.  
2faa0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20      if( nCmd!=2 
2fab0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
2fac0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
2fad0 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
2fae0 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >p==0 ){.       
2faf0 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65   session_not_ope
2fb00 6e 3a 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  n:.        raw_p
2fb10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2fb20 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e  RROR: No session
2fb30 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a  s are open\n");.
2fb40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fb50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fb60 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28  3session_attach(
2fb70 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43  pSession->p, azC
2fb80 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  md[1]);.        
2fb90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fba0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2fbb0 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73  tderr, "ERROR: s
2fbc0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74  qlite3session_at
2fbd0 74 61 63 68 28 29 20 72 65 74 75 72 6e 73 20 25  tach() returns %
2fbe0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2fbf0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
2fc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2fc10 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
2fc20 20 2e 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65   .session change
2fc30 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20  set FILE.    ** 
2fc40 2e 73 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65  .session patchse
2fc50 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72  t FILE.    ** Wr
2fc60 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
2fc70 6f 72 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f  or patchset into
2fc80 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69   a file.  The fi
2fc90 6c 65 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  le is overwritte
2fca0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2fcb0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
2fcc0 5d 2c 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d  ],"changeset")==
2fcd0 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d  0 || strcmp(azCm
2fce0 64 5b 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29  d[0],"patchset")
2fcf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c  ==0 ){.      FIL
2fd00 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  E *out = 0;.    
2fd10 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
2fd20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
2fd30 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
2fd40 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
2fd50 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69  ==0 ) goto sessi
2fd60 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20  on_not_open;.   
2fd70 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61     out = fopen(a
2fd80 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a  zCmd[1], "wb");.
2fd90 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30        if( out==0
2fda0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2fdb0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2fdc0 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f  "ERROR: cannot o
2fdd0 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77  pen \"%s\" for w
2fde0 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64  riting\n", azCmd
2fdf0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [1]);.      }els
2fe00 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  e{.        int s
2fe10 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76  zChng;.        v
2fe20 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20  oid *pChng;.    
2fe30 20 20 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d      if( azCmd[0]
2fe40 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20  [0]=='c' ){.    
2fe50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fe60 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
2fe70 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c  set(pSession->p,
2fe80 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67   &szChng, &pChng
2fe90 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2fea0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2feb0 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2fec0 70 61 74 63 68 73 65 74 28 70 53 65 73 73 69 6f  patchset(pSessio
2fed0 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26  n->p, &szChng, &
2fee0 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  pChng);.        
2fef0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
2ff00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
2ff10 69 6e 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72  intf("Error: err
2ff20 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72  or code %d\n", r
2ff30 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
2ff40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2ff50 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 6e          if( pChn
2ff60 67 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 66  g.          && f
2ff70 77 72 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43  write(pChng, szC
2ff80 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20  hng, 1, out)!=1 
2ff90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
2ffa0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ffb0 22 45 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74  "ERROR: Failed t
2ffc0 6f 20 77 72 69 74 65 20 65 6e 74 69 72 65 20 25  o write entire %
2ffd0 64 2d 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22  d-byte output\n"
2ffe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fff0 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20      szChng);.   
30000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
30010 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e  qlite3_free(pChn
30020 67 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f  g);.        fclo
30030 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  se(out);.      }
30040 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
30050 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73  /* .session clos
30060 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74  e.    ** Close t
30070 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 73 65  he identified se
30080 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  ssion.    */.   
30090 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
300a0 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d  d[0], "close")==
300b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
300c0 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65  Cmd!=1 ) goto se
300d0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
300e0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
300f0 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
30100 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f       session_clo
30110 73 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20  se(pSession);.  
30120 20 20 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f        p->aSessio
30130 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65  n[iSes] = p->aSe
30140 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73  ssion[--p->nSess
30150 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion];.      }.  
30160 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
30170 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20  .session enable 
30180 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a  ?BOOLEAN?.    **
30190 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
301a0 65 20 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20  e enable flag.  
301b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
301c0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65  cmp(azCmd[0], "e
301d0 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  nable")==0 ){.  
301e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
301f0 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67    if( nCmd>2 ) g
30200 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
30210 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
30220 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d  ii = nCmd==1 ? -
30230 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  1 : booleanValue
30240 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20  (azCmd[1]);.    
30250 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
30260 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
30270 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
30280 5f 65 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e  _enable(pSession
30290 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ->p, ii);.      
302a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
302b0 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25  >out, "session %
302c0 73 20 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20  s enable flag = 
302d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
302e0 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
302f0 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
30300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30310 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
30320 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20  ion filter GLOB 
30330 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  .....    ** Set 
30340 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70  a list of GLOB p
30350 61 74 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65  atterns of table
30360 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63   names to be exc
30370 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  luded..    */.  
30380 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
30390 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29  md[0], "filter")
303a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
303b0 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20   ii, nByte;.    
303c0 20 20 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67    if( nCmd<2 ) g
303d0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
303e0 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
303f0 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
30400 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
30410 69 3d 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e  i=0; ii<pSession
30420 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29  ->nFilter; ii++)
30430 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30440 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
30450 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29  n->azFilter[ii])
30460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30480 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
30490 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42  ter);.        nB
304a0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65  yte = sizeof(pSe
304b0 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
304c0 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20  0])*(nCmd-1);.  
304d0 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
304e0 61 7a 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  azFilter = sqlit
304f0 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
30500 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
30510 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
30520 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  er==0 ){.       
30530 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
30540 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
30550 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t or memory\n");
30560 0a 20 20 20 20 20 20 20 20 20 20 65 78 69 74 28  .          exit(
30570 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
30580 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20        for(ii=1; 
30590 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a  ii<nCmd; ii++){.
305a0 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
305b0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d  on->azFilter[ii-
305c0 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  1] = sqlite3_mpr
305d0 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64  intf("%s", azCmd
305e0 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  [ii]);.        }
305f0 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
30600 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d  n->nFilter = ii-
30610 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
30620 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
30630 73 73 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f  ssion indirect ?
30640 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20  BOOLEAN?.    ** 
30650 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65  Query or set the
30660 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20   indirect flag. 
30670 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
30680 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
30690 69 6e 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b  indirect")==0 ){
306a0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
306b0 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20       if( nCmd>2 
306c0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
306d0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
306e0 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20     ii = nCmd==1 
306f0 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61  ? -1 : booleanVa
30700 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  lue(azCmd[1]);. 
30710 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73       if( p->nSes
30720 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
30730 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  ii = sqlite3sess
30740 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65  ion_indirect(pSe
30750 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20  ssion->p, ii);. 
30760 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
30770 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73  tf(p->out, "sess
30780 69 6f 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20  ion %s indirect 
30790 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20  flag = %d\n",.  
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
307c0 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a  e, ii);.      }.
307d0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
307e0 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70  * .session isemp
307f0 74 79 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d  ty.    ** Determ
30800 69 6e 65 20 69 66 20 74 68 65 20 73 65 73 73 69  ine if the sessi
30810 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20  on is empty.    
30820 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
30830 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65  p(azCmd[0], "ise
30840 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mpty")==0 ){.   
30850 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
30860 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67   if( nCmd!=1 ) g
30870 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
30880 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
30890 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
308a0 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
308b0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69  sqlite3session_i
308c0 73 65 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d  sempty(pSession-
308d0 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  >p);.        utf
308e0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
308f0 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65   "session %s ise
30900 6d 70 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e  mpty flag = %d\n
30910 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30920 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
30930 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20  >zName, ii);.   
30940 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
30950 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
30960 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74  list.    ** List
30970 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f   all currently o
30980 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20  pen sessions.   
30990 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
309a0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73  mp(azCmd[0],"lis
309b0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
309c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
309d0 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
309e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
309f0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73  f(p->out, "%d %s
30a00 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73  \n", i, p->aSess
30a10 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ion[i].zName);. 
30a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
30a30 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
30a40 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20  n open DB NAME. 
30a50 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77     ** Open a new
30a60 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20   session called 
30a70 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61  NAME on the atta
30a80 63 68 65 64 20 64 61 74 61 62 61 73 65 20 44 42  ched database DB
30a90 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e  ..    ** DB is n
30aa0 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a  ormally "main"..
30ab0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
30ac0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
30ad0 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  open")==0 ){.   
30ae0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
30af0 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d        if( nCmd!=
30b00 33 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  3 ) goto session
30b10 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
30b20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43       zName = azC
30b30 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28  md[2];.      if(
30b40 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67   zName[0]==0 ) g
30b50 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
30b60 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
30b70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
30b80 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
30b90 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
30ba0 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e  (p->aSession[i].
30bb0 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20  zName,zName)==0 
30bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
30bd0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30be0 20 22 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22   "Session \"%s\"
30bf0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c   already exists\
30c00 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
30c10 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30c20 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30c40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
30c50 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65  ssion>=ArraySize
30c60 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b  (p->aSession) ){
30c70 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
30c80 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78  ntf(stderr, "Max
30c90 69 6d 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69  imum of %d sessi
30ca0 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a  ons\n", ArraySiz
30cb0 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b  e(p->aSession));
30cc0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
30cd0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
30cf0 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53  Session = &p->aS
30d00 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69  ession[p->nSessi
30d10 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  on];.      rc = 
30d20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
30d30 72 65 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43  reate(p->db, azC
30d40 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e  md[1], &pSession
30d50 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p);.      if( 
30d60 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  rc ){.        ra
30d70 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30d80 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65   "Cannot open se
30d90 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64  ssion: error cod
30da0 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  e=%d\n", rc);.  
30db0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
30dc0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30dd0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30de0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73      }.      pSes
30df0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20  sion->nFilter = 
30e00 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
30e10 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69  session_table_fi
30e20 6c 74 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70  lter(pSession->p
30e30 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72  , session_filter
30e40 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20  , pSession);.   
30e50 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b     p->nSession++
30e60 3b 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  ;.      pSession
30e70 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
30e80 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
30e90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
30ea0 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63  e.    /* If no c
30eb0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63  ommand name matc
30ec0 68 65 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74  hes, show a synt
30ed0 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  ax error */.    
30ee0 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
30ef0 72 72 6f 72 3a 0a 20 20 20 20 73 65 73 73 69 6f  rror:.    sessio
30f00 6e 5f 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c  n_help(p);.  }el
30f10 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  se.#endif..#ifde
30f20 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
30f30 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64   /* Undocumented
30f40 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e   commands for in
30f50 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20  ternal testing. 
30f60 20 53 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e   Subject to chan
30f70 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  ge.  ** without 
30f80 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28  notice. */.  if(
30f90 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30   c=='s' && n>=10
30fa0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30fb0 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d  g[0], "selftest-
30fc0 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 9)==0 ){.    
30fd0 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
30fe0 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e  g[0]+9, "boolean
30ff0 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20  ", n-9)==0 ){.  
31000 20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20      int i, v;.  
31010 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
31020 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
31030 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61     v = booleanVa
31040 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  lue(azArg[i]);. 
31050 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31060 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20  tf(p->out, "%s: 
31070 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72  %d 0x%x\n", azAr
31080 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20  g[i], v, v);.   
31090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
310a0 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
310b0 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22  [0]+9, "integer"
310c0 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20  , n-9)==0 ){.   
310d0 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65     int i; sqlite
310e0 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20  3_int64 v;.     
310f0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
31100 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31110 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
31120 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65          v = inte
31130 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69  gerValue(azArg[i
31140 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
31150 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31160 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22  eof(zBuf),zBuf,"
31170 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c  %s: %lld 0x%llx\
31180 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76  n", azArg[i],v,v
31190 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
311a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
311b0 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  %s", zBuf);.    
311c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
311d0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
311e0 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26  c=='s' && n>=4 &
311f0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
31200 30 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29  0],"selftest",n)
31210 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==0 ){.    int b
31220 49 73 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20  IsInit = 0;     
31230 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
31240 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45  nitialize the SE
31250 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a  LFTEST table */.
31260 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65      int bVerbose
31270 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
31280 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a  Verbose output *
31290 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74  /.    int bSelft
312a0 65 73 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f  estExists;     /
312b0 2a 20 54 72 75 65 20 69 66 20 53 45 4c 46 54 45  * True if SELFTE
312c0 53 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ST already exist
312d0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  s */.    int i, 
312e0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
312f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
31300 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  rs */.    int nT
31310 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
31320 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31330 74 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20  tests runs */.  
31340 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
31350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31360 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
31370 65 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c  een */.    Shell
31380 54 65 78 74 20 73 74 72 3b 20 20 20 20 20 20 20  Text str;       
31390 20 20 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f      /* Answer fo
313a0 72 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  r a query */.   
313b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
313c0 53 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65  Stmt = 0; /* Que
313d0 72 79 20 61 67 61 69 6e 73 74 20 74 68 65 20 53  ry against the S
313e0 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f  ELFTEST table */
313f0 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ..    open_db(p,
31400 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  0);.    for(i=1;
31410 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
31420 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
31430 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  *z = azArg[i];. 
31440 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
31450 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
31460 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
31470 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74   strcmp(z,"-init
31480 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
31490 20 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20   bIsInit = 1;.  
314a0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
314b0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76  if( strcmp(z,"-v
314c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
314d0 20 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20   bVerbose++;.   
314e0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b     }else.      {
314f0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31500 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
31510 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
31520 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22  s\" on \"%s\"\n"
31530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31540 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20        azArg[i], 
31550 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
31560 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31570 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65  derr, "Should be
31580 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20   one of: --init 
31590 2d 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  -v\n");.        
315a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
315b0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
315c0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
315d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
315e0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
315f0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64  mn_metadata(p->d
31600 62 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65  b,"main","selfte
31610 73 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  st",0,0,0,0,0,0)
31620 0a 20 20 20 20 20 20 20 20 20 20 20 21 3d 20 53  .           != S
31630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31640 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74    bSelftestExist
31650 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 0;.    }else
31660 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  {.      bSelftes
31670 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  tExists = 1;.   
31680 20 7d 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e   }.    if( bIsIn
31690 69 74 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61  it ){.      crea
316a0 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28  teSelftestTable(
316b0 70 29 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74  p);.      bSelft
316c0 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20  estExists = 1;. 
316d0 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78     }.    initTex
316e0 74 28 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70  t(&str);.    app
316f0 65 6e 64 54 65 78 74 28 26 73 74 72 2c 20 22 78  endText(&str, "x
31700 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b  ", 0);.    for(k
31710 3d 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73  =bSelftestExists
31720 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20  ; k>=0; k--){.  
31730 20 20 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a      if( k==1 ){.
31740 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31750 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
31760 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
31770 20 20 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f     "SELECT tno,o
31780 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73  p,cmd,ans FROM s
31790 65 6c 66 74 65 73 74 20 4f 52 44 45 52 20 42 59  elftest ORDER BY
317a0 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20   tno",.         
317b0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
317c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
317d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
317e0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
317f0 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
31800 20 22 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f   "VALUES(0,'memo
31810 27 2c 27 4d 69 73 73 69 6e 67 20 53 45 4c 46 54  ','Missing SELFT
31820 45 53 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61  EST table - defa
31830 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27  ult checks only'
31840 2c 27 27 29 2c 22 0a 20 20 20 20 20 20 20 20 20  ,''),".         
31850 20 22 20 20 20 20 20 20 28 31 2c 27 72 75 6e 27   "      (1,'run'
31860 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  ,'PRAGMA integri
31870 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22  ty_check','ok')"
31880 2c 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ,.          -1, 
31890 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
318a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
318b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
318c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
318d0 45 72 72 6f 72 20 71 75 65 72 79 69 6e 67 20 74  Error querying t
318e0 68 65 20 73 65 6c 66 74 65 73 74 20 74 61 62 6c  he selftest tabl
318f0 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e\n");.        r
31900 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  c = 1;.        s
31910 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
31920 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
31930 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31940 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
31950 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73        for(i=1; s
31960 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
31970 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20  t)==SQLITE_ROW; 
31980 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
31990 74 20 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f  t tno = sqlite3_
319a0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
319b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 0);.        co
319c0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
319d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
319e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
319f0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
31a00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31a10 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
31a20 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
31a30 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32  mn_text(pStmt, 2
31a40 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
31a50 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63   char *zAns = (c
31a60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
31a70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
31a80 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20  Stmt, 3);..     
31a90 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
31aa0 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 3e 30    if( bVerbose>0
31ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
31ac0 61 72 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c  ar *zQuote = sql
31ad0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 71  ite3_mprintf("%q
31ae0 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
31af0 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 3a 20      printf("%d: 
31b00 25 73 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a  %s %s\n", tno, z
31b10 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  Op, zSql);.     
31b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31b30 65 28 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  e(zQuote);.     
31b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31b50 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d   strcmp(zOp,"mem
31b60 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
31b70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31b80 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
31b90 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
31ba0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
31bb0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e   strcmp(zOp,"run
31bc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
31bd0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
31be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31bf0 73 74 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  str.n = 0;.     
31c00 20 20 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20       str.z[0] = 
31c10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
31c20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
31c30 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74  ->db, zSql, capt
31c40 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
31c50 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 4d 73  k, &str, &zErrMs
31c60 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54  g);.          nT
31c70 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  est++;.         
31c80 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
31c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
31ca0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
31cb0 20 22 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c   "Result: %s\n",
31cc0 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20   str.z);.       
31cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
31ce0 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67  f( rc || zErrMsg
31cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31d00 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
31d10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31d20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31d30 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a  ntf(p->out, "%d:
31d40 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20   error-code-%d: 
31d50 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20  %s\n", tno, rc, 
31d60 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
31d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
31d80 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
31d90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
31da0 20 73 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72   strcmp(zAns,str
31db0 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  .z)!=0 ){.      
31dc0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
31dd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
31de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
31df0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
31e00 2c 20 22 25 64 3a 20 45 78 70 65 63 74 65 64 3a  , "%d: Expected:
31e10 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a   [%s]\n", tno, z
31e20 41 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ans);.          
31e30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
31e40 3e 6f 75 74 2c 20 22 25 64 3a 20 20 20 20 20 20  >out, "%d:      
31e50 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e  Got: [%s]\n", tn
31e60 6f 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20  o, str.z);.     
31e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31e80 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
31e90 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
31ea0 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
31eb0 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77           "Unknow
31ec0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25 73  n operation \"%s
31ed0 5c 22 20 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c  \" on selftest l
31ee0 69 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20  ine %d\n", zOp, 
31ef0 74 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tno);.          
31f00 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
31f10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31f20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e   }.      } /* En
31f30 64 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73  d loop over rows
31f40 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d   of content from
31f50 20 53 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20   SELFTEST */.   
31f60 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
31f70 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
31f80 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
31f90 65 72 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65  er k */.    free
31fa0 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20  Text(&str);.    
31fb0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31fc0 75 74 2c 20 22 25 64 20 65 72 72 6f 72 73 20 6f  ut, "%d errors o
31fd0 75 74 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e  ut of %d tests\n
31fe0 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b  ", nErr, nTest);
31ff0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
32000 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
32010 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70  p(azArg[0], "sep
32020 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29  arator", n)==0 )
32030 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  {.    if( nArg<2
32040 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20   || nArg>3 ){.  
32050 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32060 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32070 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52  separator COL ?R
32080 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  OW?\n");.      r
32090 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
320a0 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
320b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
320c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
320d0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
320e0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
320f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32100 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
32110 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
32120 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d  ->colSeparator)-
32130 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  1, azArg[1]);.  
32140 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
32150 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=3 ){.      sql
32160 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32170 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
32180 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
32190 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
321b0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
321c0 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61  ySize(p->rowSepa
321d0 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b  rator)-1, azArg[
321e0 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  2]);.    }.  }el
321f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
32200 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e   && n>=4 && strn
32210 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68  cmp(azArg[0],"sh
32220 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a  a3sum",n)==0 ){.
32230 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
32240 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20  zLike = 0;   /* 
32250 57 68 69 63 68 20 74 61 62 6c 65 20 74 6f 20 63  Which table to c
32260 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73  hecksum. 0 means
32270 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20   everything */. 
32280 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
32290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
322a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
322b0 20 20 20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d     int bSchema =
322c0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
322d0 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73 63 68  lso hash the sch
322e0 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ema */.    int b
322f0 53 65 70 61 72 61 74 65 20 3d 20 30 3b 20 20 20  Separate = 0;   
32300 20 20 20 20 2f 2a 20 48 61 73 68 20 65 61 63 68      /* Hash each
32310 20 74 61 62 6c 65 20 73 65 70 61 72 61 74 65 6c   table separatel
32320 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 69  y */.    int iSi
32330 7a 65 20 3d 20 32 32 34 3b 20 20 20 20 20 20 20  ze = 224;       
32340 20 20 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72 69    /* Hash algori
32350 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  thm to use */.  
32360 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30    int bDebug = 0
32370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
32380 6c 79 20 73 68 6f 77 20 74 68 65 20 71 75 65 72  ly show the quer
32390 79 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76  y that would hav
323a0 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  e run */.    sql
323b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
323c0 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 71 75 65  ;     /* For que
323d0 72 79 69 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d  rying tables nam
323e0 65 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  es */.    char *
323f0 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
32400 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
32410 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  run */.    char 
32420 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20 20  *zSep;          
32430 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72      /* Separator
32440 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
32450 74 20 73 53 71 6c 3b 20 20 20 20 20 20 20 20 20  t sSql;         
32460 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c   /* Complete SQL
32470 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
32480 6f 20 72 75 6e 20 74 68 65 20 68 61 73 68 20 2a  o run the hash *
32490 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  /.    ShellText 
324a0 73 51 75 65 72 79 3b 20 20 20 20 20 20 20 20 2f  sQuery;        /
324b0 2a 20 53 65 74 20 6f 66 20 71 75 65 72 69 65 73  * Set of queries
324c0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 6c   used to read al
324d0 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20  l content */.   
324e0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
324f0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
32500 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
32510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
32520 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
32530 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
32540 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  {.        z++;. 
32550 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
32560 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
32570 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
32580 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b  ,"schema")==0 ){
32590 0a 20 20 20 20 20 20 20 20 20 20 62 53 63 68 65  .          bSche
325a0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ma = 1;.        
325b0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
325c0 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33  ( strcmp(z,"sha3
325d0 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72  -224")==0 || str
325e0 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 35 36 22  cmp(z,"sha3-256"
325f0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  )==0.         ||
32600 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d   strcmp(z,"sha3-
32610 33 38 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  384")==0 || strc
32620 6d 70 28 7a 2c 22 73 68 61 33 2d 35 31 32 22 29  mp(z,"sha3-512")
32630 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
32640 20 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d           iSize =
32650 20 61 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20   atoi(&z[5]);.  
32660 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
32670 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
32680 2c 22 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a  ,"debug")==0 ){.
32690 20 20 20 20 20 20 20 20 20 20 62 44 65 62 75 67            bDebug
326a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
326b0 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
326c0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
326d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
326e0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
326f0 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c  \" on \"%s\"\n",
32700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32710 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c         azArg[i],
32720 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
32730 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32740 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64  (stderr, "Should
32750 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63   be one of: --sc
32760 68 65 6d 61 22 0a 20 20 20 20 20 20 20 20 20 20  hema".          
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32780 20 20 20 22 20 2d 2d 73 68 61 33 2d 32 32 34 20     " --sha3-224 
32790 2d 2d 73 68 61 33 2d 32 35 35 20 2d 2d 73 68 61  --sha3-255 --sha
327a0 33 2d 33 38 34 20 2d 2d 73 68 61 33 2d 35 31 32  3-384 --sha3-512
327b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
327c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
327d0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
327e0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
327f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
32800 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20  if( zLike ){.   
32810 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32820 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
32830 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e  .sha3sum ?OPTION
32840 53 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  S? ?LIKE-PATTERN
32850 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ?\n");.        r
32860 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
32870 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32880 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
32890 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b  se{.        zLik
328a0 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 62  e = z;.        b
328b0 53 65 70 61 72 61 74 65 20 3d 20 31 3b 0a 20 20  Separate = 1;.  
328c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
328d0 33 5f 73 74 72 6c 69 6b 65 28 22 73 71 6c 69 74  3_strlike("sqlit
328e0 65 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d  e_%", zLike, 0)=
328f0 3d 30 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31  =0 ) bSchema = 1
32900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32910 20 20 20 20 69 66 28 20 62 53 63 68 65 6d 61 20      if( bSchema 
32920 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
32930 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61  "SELECT lower(na
32940 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  me) FROM sqlite_
32950 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
32960 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
32970 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f  e='table' AND co
32980 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
32990 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20  0)>1".          
329a0 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53     " UNION ALL S
329b0 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61  ELECT 'sqlite_ma
329c0 73 74 65 72 27 22 0a 20 20 20 20 20 20 20 20 20  ster'".         
329d0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31      " ORDER BY 1
329e0 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22   collate nocase"
329f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32a00 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43     zSql = "SELEC
32a10 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52  T lower(name) FR
32a20 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
32a30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
32a40 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
32a50 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  le' AND coalesce
32a60 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a  (rootpage,0)>1".
32a70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41               " A
32a80 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
32a90 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20   'sqlite_%'".   
32aa0 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
32ab0 52 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e  R BY 1 collate n
32ac0 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20  ocase";.    }.  
32ad0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
32ae0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
32af0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
32b00 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
32b10 73 51 75 65 72 79 29 3b 0a 20 20 20 20 69 6e 69  sQuery);.    ini
32b20 74 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20  tText(&sSql);.  
32b30 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
32b40 71 6c 2c 20 22 57 49 54 48 20 5b 73 68 61 33 73  ql, "WITH [sha3s
32b50 75 6d 24 71 75 65 72 79 5d 28 61 2c 62 29 20 41  um$query](a,b) A
32b60 53 28 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70  S(",0);.    zSep
32b70 20 3d 20 22 56 41 4c 55 45 53 28 22 3b 0a 20 20   = "VALUES(";.  
32b80 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
32b90 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
32ba0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
32bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
32bc0 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
32bd0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
32be0 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a  _text(pStmt,0);.
32bf0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 20        if( zLike 
32c00 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
32c10 6b 65 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20  ke(zLike, zTab, 
32c20 30 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  0)!=0 ) continue
32c30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
32c40 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
32c50 65 5f 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20  e_",7)!=0 ){.   
32c60 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
32c70 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20  &sQuery,"SELECT 
32c80 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  * FROM ", 0);.  
32c90 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
32ca0 28 26 73 51 75 65 72 79 2c 7a 54 61 62 2c 27 22  (&sQuery,zTab,'"
32cb0 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
32cc0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
32cd0 20 4e 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c 20   NOT INDEXED;", 
32ce0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
32cf0 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c  if( strcmp(zTab,
32d00 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
32d10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32d20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65  appendText(&sQue
32d30 72 79 2c 22 53 45 4c 45 43 54 20 74 79 70 65 2c  ry,"SELECT type,
32d40 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
32d50 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
32d60 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
32d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d80 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
32d90 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ;", 0);.      }e
32da0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
32db0 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  Tab, "sqlite_seq
32dc0 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
32dd0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
32de0 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
32df0 20 6e 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73   name,seq FROM s
32e00 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 0a  qlite_sequence".
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44             " ORD
32e30 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29  ER BY name;", 0)
32e40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32e50 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22  ( strcmp(zTab, "
32e60 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d  sqlite_stat1")==
32e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
32e80 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
32e90 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c  "SELECT tbl,idx,
32ea0 73 74 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65  stat FROM sqlite
32eb0 5f 73 74 61 74 31 22 0a 20 20 20 20 20 20 20 20  _stat1".        
32ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ed0 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 62     " ORDER BY tb
32ee0 6c 2c 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20  l,idx;", 0);.   
32ef0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
32f00 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
32f10 65 5f 73 74 61 74 33 22 29 3d 3d 30 0a 20 20 20  e_stat3")==0.   
32f20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
32f30 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
32f40 65 5f 73 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a  e_stat4")==0 ){.
32f50 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
32f60 78 74 28 26 73 51 75 65 72 79 2c 20 22 53 45 4c  xt(&sQuery, "SEL
32f70 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29  ECT * FROM ", 0)
32f80 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
32f90 54 65 78 74 28 26 73 51 75 65 72 79 2c 20 7a 54  Text(&sQuery, zT
32fa0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
32fb0 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65  appendText(&sQue
32fc0 72 79 2c 20 22 20 4f 52 44 45 52 20 42 59 20 74  ry, " ORDER BY t
32fd0 62 6c 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c  bl, idx, rowid;\
32fe0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  n", 0);.      }.
32ff0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33000 28 26 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29  (&sSql, zSep, 0)
33010 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
33020 78 74 28 26 73 53 71 6c 2c 20 73 51 75 65 72 79  xt(&sSql, sQuery
33030 2e 7a 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20  .z, '\'');.     
33040 20 73 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20   sQuery.n = 0;. 
33050 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33060 26 73 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a  &sSql, ",", 0);.
33070 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33080 28 26 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c  (&sSql, zTab, '\
33090 27 27 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  '');.      zSep 
330a0 3d 20 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20  = "),(";.    }. 
330b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
330c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
330d0 69 66 28 20 62 53 65 70 61 72 61 74 65 20 29 7b  if( bSeparate ){
330e0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
330f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
33100 20 20 20 20 20 20 20 20 20 22 25 73 29 29 22 0a           "%s))".
33110 20 20 20 20 20 20 20 20 20 20 22 20 53 45 4c 45            " SELE
33120 43 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61  CT lower(hex(sha
33130 33 5f 71 75 65 72 79 28 61 2c 25 64 29 29 29 20  3_query(a,%d))) 
33140 41 53 20 68 61 73 68 2c 20 62 20 41 53 20 6c 61  AS hash, b AS la
33150 62 65 6c 22 0a 20 20 20 20 20 20 20 20 20 20 22  bel".          "
33160 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d     FROM [sha3sum
33170 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20  $query]",.      
33180 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a      sSql.z, iSiz
33190 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
331a0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
331b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
331c0 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20         "%s))".  
331d0 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54          " SELECT
331e0 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f   lower(hex(sha3_
331f0 71 75 65 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63  query(group_conc
33200 61 74 28 61 2c 27 27 29 2c 25 64 29 29 29 20 41  at(a,''),%d))) A
33210 53 20 68 61 73 68 22 0a 20 20 20 20 20 20 20 20  S hash".        
33220 20 20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33    "   FROM [sha3
33230 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20  sum$query]",.   
33240 20 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69         sSql.z, i
33250 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
33260 20 66 72 65 65 54 65 78 74 28 26 73 51 75 65 72   freeText(&sQuer
33270 79 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  y);.    freeText
33280 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  (&sSql);.    if(
33290 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20   bDebug ){.     
332a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
332b0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71  out, "%s\n", zSq
332c0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
332d0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
332e0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65  p->db, zSql, she
332f0 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  ll_callback, p, 
33300 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
33310 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
33320 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
33330 20 63 3d 3d 27 73 27 0a 20 20 20 26 26 20 28 73   c=='s'.   && (s
33340 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
33350 20 22 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20   "shell", n)==0 
33360 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
33370 5b 30 5d 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d  [0],"system",n)=
33380 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0).  ){.    cha
33390 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74  r *zCmd;.    int
333a0 20 69 2c 20 78 3b 0a 20 20 20 20 69 66 28 20 6e   i, x;.    if( n
333b0 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  Arg<2 ){.      r
333c0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
333d0 2c 20 22 55 73 61 67 65 3a 20 2e 73 79 73 74 65  , "Usage: .syste
333e0 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20  m COMMAND\n");. 
333f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
33400 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
33410 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
33420 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69  .    zCmd = sqli
33430 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63  te3_mprintf(strc
33440 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29  hr(azArg[1],' ')
33450 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22  ==0?"%s":"\"%s\"
33460 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
33470 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
33480 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  g; i++){.      z
33490 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Cmd = sqlite3_mp
334a0 72 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41  rintf(strchr(azA
334b0 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25  rg[i],' ')==0?"%
334c0 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22  z %s":"%z \"%s\"
334d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334f0 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  zCmd, azArg[i]);
33500 0a 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 73  .    }.    x = s
33510 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20  ystem(zCmd);.   
33520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
33530 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 78 20 29  md);.    if( x )
33540 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33550 72 72 2c 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d  rr, "System comm
33560 61 6e 64 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  and returns %d\n
33570 22 2c 20 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  ", x);.  }else..
33580 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
33590 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
335a0 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20  , "show", n)==0 
335b0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
335c0 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c  nst char *azBool
335d0 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f  [] = { "off", "o
335e0 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22  n", "trigger", "
335f0 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20  full"};.    int 
33600 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  i;.    if( nArg!
33610 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
33620 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33630 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29  Usage: .show\n")
33640 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33650 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
33660 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
33670 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69    }.    utf8_pri
33680 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
33690 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68  .12s: %s\n","ech
336a0 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o",.            
336b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336c0 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65        azBool[She
336d0 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
336e0 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20  LG_Echo)]);.    
336f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33700 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73  ut, "%12.12s: %s
33710 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f  \n","eqp", azBoo
33720 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29  l[p->autoEQP&3])
33730 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
33740 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
33750 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61  2s: %s\n","expla
33760 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  in",.         p-
33770 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
33780 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e  ain ? "on" : p->
33790 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61  autoExplain ? "a
337a0 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  uto" : "off");. 
337b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
337c0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
337d0 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c  %s\n","headers",
337e0 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48   azBool[p->showH
337f0 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20  eader!=0]);.    
33800 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33810 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73  ut, "%12.12s: %s
33820 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65  \n","mode", mode
33830 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
33840 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
33850 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
33860 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  s: ", "nullvalue
33870 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
33880 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
33890 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  , p->nullValue);
338a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
338b0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
338c0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
338d0 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
338e0 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22  : %s\n","output"
338f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ,.            st
33900 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c  rlen30(p->outfil
33910 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20  e) ? p->outfile 
33920 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20  : "stdout");.   
33930 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
33940 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c  out,"%12.12s: ",
33950 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72 22 29   "colseparator")
33960 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
33970 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
33980 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
33990 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
339a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
339b0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
339c0 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
339d0 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61 72 61  s: ", "rowsepara
339e0 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74  tor");.      out
339f0 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
33a00 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  out, p->rowSepar
33a10 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77  ator);.      raw
33a20 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
33a30 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f  "\n");.    utf8_
33a40 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33a50 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
33a60 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70  stats", azBool[p
33a70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a  ->statsOn!=0]);.
33a80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33a90 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
33aa0 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b 0a 20  : ", "width");. 
33ab0 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69     for (i=0;i<(i
33ac0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
33ad0 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e  colWidth) && p->
33ae0 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30  colWidth[i] != 0
33af0 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 72 61  ;i++) {.      ra
33b00 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
33b10 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69   "%d ", p->colWi
33b20 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  dth[i]);.    }. 
33b30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
33b40 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
33b50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
33b60 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
33b70 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22  s\n", "filename"
33b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33b90 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
33ba0 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d   ? p->zDbFilenam
33bb0 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65  e : "");.  }else
33bc0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
33bd0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33be0 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d  0], "stats", n)=
33bf0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
33c00 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
33c10 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c  ->statsOn = bool
33c20 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
33c30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
33c40 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
33c50 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
33c60 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29 3b 0a 20  (p->db, p, 0);. 
33c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33c80 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33c90 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 74 61 74  r, "Usage: .stat
33ca0 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29 3b 0a  s ?on|off?\n");.
33cb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
33cc0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
33cd0 66 28 20 28 63 3d 3d 27 74 27 20 26 26 20 6e 3e  f( (c=='t' && n>
33ce0 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
33cf0 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c  rg[0], "tables",
33d00 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63   n)==0).   || (c
33d10 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e 63 6d  =='i' && (strncm
33d20 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
33d30 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20 20 20  ices", n)==0.   
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
33d50 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
33d60 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20 6e 29  ], "indexes", n)
33d70 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  ==0) ).  ){.    
33d80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
33d90 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  tmt;.    char **
33da0 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  azResult;.    in
33db0 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a  t nRow, nAlloc;.
33dc0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
33dd0 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 20  ShellText s;.   
33de0 20 69 6e 69 74 54 65 78 74 28 26 73 29 3b 0a 20   initText(&s);. 
33df0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
33e00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33e10 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
33e20 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74  >db, "PRAGMA dat
33e30 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c  abase_list", -1,
33e40 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
33e50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33e60 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
33e70 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20  ror(p->db);..   
33e80 20 69 66 28 20 6e 41 72 67 3e 32 20 26 26 20 63   if( nArg>2 && c
33e90 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='i' ){.      /
33ea0 2a 20 49 74 20 69 73 20 61 6e 20 68 69 73 74 6f  * It is an histo
33eb0 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74 20 74  rical accident t
33ec0 68 61 74 20 74 68 65 20 2e 69 6e 64 65 78 65 73  hat the .indexes
33ed0 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77 73 20 61   command shows a
33ee0 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20 2a 2a  n error.      **
33ef0 20 77 68 65 6e 20 63 61 6c 6c 65 64 20 77 69 74   when called wit
33f00 68 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  h the wrong numb
33f10 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
33f20 77 68 65 72 65 61 73 20 74 68 65 20 2e 74 61 62  whereas the .tab
33f30 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  les.      ** com
33f40 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 20 2a  mand does not. *
33f50 2f 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  /.      raw_prin
33f60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
33f70 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f 4c 49 4b  e: .indexes ?LIK
33f80 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
33f90 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
33fa0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
33fb0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
33fc0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
33fd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
33fe0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
33ff0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f   ii++){.      co
34000 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
34010 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
34020 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
34030 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
34040 20 20 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d        if( zDbNam
34050 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
34060 0a 20 20 20 20 20 20 69 66 28 20 73 2e 7a 20 26  .      if( s.z &
34070 26 20 73 2e 7a 5b 30 5d 20 29 20 61 70 70 65 6e  & s.z[0] ) appen
34080 64 54 65 78 74 28 26 73 2c 20 22 20 55 4e 49 4f  dText(&s, " UNIO
34090 4e 20 41 4c 4c 20 22 2c 20 30 29 3b 0a 20 20 20  N ALL ", 0);.   
340a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
340b0 74 72 69 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  tricmp(zDbName, 
340c0 22 6d 61 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  "main")==0 ){.  
340d0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
340e0 28 26 73 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d  (&s, "SELECT nam
340f0 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  e FROM ", 0);.  
34100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34110 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34120 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b  , "SELECT ", 0);
34130 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34140 65 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c  ext(&s, zDbName,
34150 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20   '\'');.        
34160 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
34170 7c 7c 27 2e 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d  ||'.'||name FROM
34180 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   ", 0);.      }.
34190 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
341a0 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 22  (&s, zDbName, '"
341b0 27 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  ');.      append
341c0 54 65 78 74 28 26 73 2c 20 22 2e 73 71 6c 69 74  Text(&s, ".sqlit
341d0 65 5f 6d 61 73 74 65 72 20 22 2c 20 30 29 3b 0a  e_master ", 0);.
341e0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27        if( c=='t'
341f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
34200 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48 45 52  ndText(&s," WHER
34210 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
34220 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  e','view')".    
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34240 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e    "   AND name N
34250 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
34260 25 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %'".            
34270 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
34280 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c  D name LIKE ?1",
34290 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
342a0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
342b0 54 65 78 74 28 26 73 2c 22 20 57 48 45 52 45 20  Text(&s," WHERE 
342c0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 0a 20 20  type='index'".  
342d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342e0 20 20 20 20 22 20 20 20 41 4e 44 20 74 62 6c 5f      "   AND tbl_
342f0 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30  name LIKE ?1", 0
34300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34320 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
34330 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
34340 74 28 26 73 2c 20 22 20 4f 52 44 45 52 20 42 59  t(&s, " ORDER BY
34350 20 31 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20   1", 0);.    rc 
34360 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
34370 65 5f 76 32 28 70 2d 3e 64 62 2c 20 73 2e 7a 2c  e_v2(p->db, s.z,
34380 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
34390 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
343a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
343b0 72 65 74 75 72 6e 20 73 68 65 6c 6c 44 61 74 61  return shellData
343c0 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29  baseError(p->db)
343d0 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  ;..    /* Run th
343e0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
343f0 70 72 65 70 61 72 65 64 20 62 79 20 74 68 65 20  prepared by the 
34400 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 53 74 6f  above block. Sto
34410 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  re the results. 
34420 20 20 20 2a 2a 20 61 73 20 61 6e 20 61 72 72 61     ** as an arra
34430 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  y of nul-termina
34440 74 65 64 20 73 74 72 69 6e 67 73 20 69 6e 20 61  ted strings in a
34450 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a 2f 0a 20  zResult[].  */. 
34460 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63     nRow = nAlloc
34470 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52 65 73 75   = 0;.    azResu
34480 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  lt = 0;.    if( 
34490 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  nArg>1 ){.      
344a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
344b0 74 28 70 53 74 6d 74 2c 20 31 2c 20 61 7a 41 72  t(pStmt, 1, azAr
344c0 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  g[1], -1, SQLITE
344d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
344e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
344f0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
34500 70 53 74 6d 74 2c 20 31 2c 20 22 25 22 2c 20 2d  pStmt, 1, "%", -
34510 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
34520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
34530 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
34540 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
34550 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ROW ){.      if(
34560 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b   nRow>=nAlloc ){
34570 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a  .        char **
34580 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69  azNew;.        i
34590 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f 63 2a 32  nt n2 = nAlloc*2
345a0 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 61   + 10;.        a
345b0 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
345c0 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65 73 75 6c  ealloc64(azResul
345d0 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52 65 73 75  t, sizeof(azResu
345e0 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20 20 20 20  lt[0])*n2);.    
345f0 20 20 20 20 69 66 28 20 61 7a 4e 65 77 3d 3d 30      if( azNew==0
34600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34610 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72   = shellNomemErr
34620 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  or();.          
34630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
34640 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  .        nAlloc 
34650 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20 61 7a  = n2;.        az
34660 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a  Result = azNew;.
34670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 7a        }.      az
34680 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20 73  Result[nRow] = s
34690 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
346a0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  %s", sqlite3_col
346b0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
346c0 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  0));.      if( 0
346d0 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d  ==azResult[nRow]
346e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
346f0 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72   shellNomemError
34700 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
34710 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
34720 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRow++;.    }. 
34730 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66     if( sqlite3_f
34740 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 21 3d  inalize(pStmt)!=
34750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34760 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 44 61 74     rc = shellDat
34770 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62  abaseError(p->db
34780 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
34790 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 74 68   Pretty-print th
347a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72  e contents of ar
347b0 72 61 79 20 61 7a 52 65 73 75 6c 74 5b 5d 20 74  ray azResult[] t
347c0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
347d0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26      if( rc==0 &&
347e0 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20   nRow>0 ){.     
347f0 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e   int len, maxlen
34800 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
34810 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, j;.      int 
34820 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e  nPrintCol, nPrin
34830 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28  tRow;.      for(
34840 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b  i=0; i<nRow; i++
34850 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
34860 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75   strlen30(azResu
34870 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lt[i]);.        
34880 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29  if( len>maxlen )
34890 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20   maxlen = len;. 
348a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72       }.      nPr
348b0 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78  intCol = 80/(max
348c0 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  len+2);.      if
348d0 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20  ( nPrintCol<1 ) 
348e0 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20  nPrintCol = 1;. 
348f0 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d       nPrintRow =
34900 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43   (nRow + nPrintC
34910 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f  ol - 1)/nPrintCo
34920 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
34930 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69  ; i<nPrintRow; i
34940 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
34950 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b  (j=i; j<nRow; j+
34960 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20  =nPrintRow){.   
34970 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 70         char *zSp
34980 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f   = j<nPrintRow ?
34990 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20   "" : "  ";.    
349a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
349b0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a  f(p->out, "%s%-*
349c0 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c  s", zSp, maxlen,
349d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
349e0 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b         azResult[
349f0 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a 5d  j] ? azResult[j]
34a00 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  :"");.        }.
34a10 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
34a20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
34a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34a40 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
34a50 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29 20 73 71  i<nRow; ii++) sq
34a60 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73  lite3_free(azRes
34a70 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20 20 73 71  ult[ii]);.    sq
34a80 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73  lite3_free(azRes
34a90 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  ult);.  }else.. 
34aa0 20 2f 2a 20 42 65 67 69 6e 20 72 65 64 69 72 65   /* Begin redire
34ab0 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20  cting output to 
34ac0 74 68 65 20 66 69 6c 65 20 22 74 65 73 74 63 61  the file "testca
34ad0 73 65 2d 6f 75 74 2e 74 78 74 22 20 2a 2f 0a 20  se-out.txt" */. 
34ae0 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73   if( c=='t' && s
34af0 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  trcmp(azArg[0],"
34b00 74 65 73 74 63 61 73 65 22 29 3d 3d 30 20 29 7b  testcase")==0 ){
34b10 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
34b20 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 6f 75 74  t(p);.    p->out
34b30 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
34b40 70 65 6e 28 22 74 65 73 74 63 61 73 65 2d 6f 75  pen("testcase-ou
34b50 74 2e 74 78 74 22 29 3b 0a 20 20 20 20 69 66 28  t.txt");.    if(
34b60 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
34b70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
34b80 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
34b90 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 74 65 73 74  annot open 'test
34ba0 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22  case-out.txt'\n"
34bb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
34bc0 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20   nArg>=2 ){.    
34bd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34be0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65  tf(sizeof(p->zTe
34bf0 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73  stcase), p->zTes
34c00 74 63 61 73 65 2c 20 22 25 73 22 2c 20 61 7a 41  tcase, "%s", azA
34c10 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
34c20 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
34c30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
34c40 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 2c 20  (p->zTestcase), 
34c50 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 22 3f  p->zTestcase, "?
34c60 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
34c70 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
34c80 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69  E_UNTESTABLE.  i
34c90 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d  f( c=='t' && n>=
34ca0 38 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  8 && strncmp(azA
34cb0 72 67 5b 30 5d 2c 20 22 74 65 73 74 63 74 72 6c  rg[0], "testctrl
34cc0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
34cd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
34ce0 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e  uct {.       con
34cf0 73 74 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61  st char *zCtrlNa
34d00 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
34d10 20 61 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20   a test-control 
34d20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
34d30 20 69 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20 20   int ctrlCode;  
34d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
34d50 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68  eger code for th
34d60 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  at option */.   
34d70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
34d80 7a 55 73 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  zUsage;      /* 
34d90 55 73 61 67 65 20 6e 6f 74 65 73 20 2a 2f 0a 20  Usage notes */. 
34da0 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b     } aCtrl[] = {
34db0 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61 79 73  .      { "always
34dc0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ",             S
34dd0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
34de0 4c 57 41 59 53 2c 20 20 20 20 20 20 20 20 22 42  LWAYS,        "B
34df0 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20  OOLEAN"         
34e00 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61     },.      { "a
34e10 73 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20  ssert",         
34e20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
34e30 54 52 4c 5f 41 53 53 45 52 54 2c 20 20 20 20 20  TRL_ASSERT,     
34e40 20 20 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20     "BOOLEAN"    
34e50 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
34e60 2a 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f  *{ "benign_mallo
34e70 63 5f 68 6f 6f 6b 73 22 2c 53 51 4c 49 54 45 5f  c_hooks",SQLITE_
34e80 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
34e90 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 22 22  MALLOC_HOOKS, ""
34ea0 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20            },*/. 
34eb0 20 20 20 2f 2a 7b 20 22 62 69 74 76 65 63 5f 74     /*{ "bitvec_t
34ec0 65 73 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c  est",        SQL
34ed0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
34ee0 56 45 43 5f 54 45 53 54 2c 20 20 20 22 22 20 20  VEC_TEST,   ""  
34ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
34f00 2a 2f 0a 20 20 20 20 20 20 7b 20 22 62 79 74 65  */.      { "byte
34f10 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20 20 20  order",         
34f20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
34f30 5f 42 59 54 45 4f 52 44 45 52 2c 20 20 20 20 20  _BYTEORDER,     
34f40 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ""              
34f50 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20       },.    /*{ 
34f60 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c  "fault_install",
34f70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
34f80 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
34f90 41 4c 4c 2c 20 22 22 20 20 20 20 20 20 20 20 20  ALL, ""         
34fa0 20 20 20 20 20 20 20 7d 2c 20 2a 2f 0a 20 20 20         }, */.   
34fb0 20 20 20 7b 20 22 69 6d 70 6f 73 74 65 72 22 2c     { "imposter",
34fc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
34fd0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
34fe0 54 45 52 2c 20 20 20 22 53 43 48 45 4d 41 20 4f  TER,   "SCHEMA O
34ff0 4e 2f 4f 46 46 20 52 4f 4f 54 50 41 47 45 22 7d  N/OFF ROOTPAGE"}
35000 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
35010 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20  N_KEYWORD.      
35020 7b 20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20 20  { "iskeyword",  
35030 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
35040 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
35050 44 2c 20 20 20 20 20 22 49 44 45 4e 54 49 46 49  D,     "IDENTIFI
35060 45 52 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  ER"         },.#
35070 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 22 6c  endif.      { "l
35080 6f 63 61 6c 74 69 6d 65 5f 66 61 75 6c 74 22 2c  ocaltime_fault",
35090 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
350a0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
350b0 55 4c 54 2c 22 42 4f 4f 4c 45 41 4e 22 20 20 20  ULT,"BOOLEAN"   
350c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
350d0 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72 72 75 70   { "never_corrup
350e0 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  t",      SQLITE_
350f0 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
35100 4f 52 52 55 50 54 2c 20 22 42 4f 4f 4c 45 41 4e  ORRUPT, "BOOLEAN
35110 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
35120 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a        { "optimiz
35130 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20 53 51  ations",      SQ
35140 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
35150 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 22 44 49  TIMIZATIONS, "DI
35160 53 41 42 4c 45 2d 4d 41 53 4b 22 20 20 20 20 20  SABLE-MASK"     
35170 20 20 7d 2c 0a 23 69 66 64 65 66 20 59 59 43 4f    },.#ifdef YYCO
35180 56 45 52 41 47 45 0a 20 20 20 20 20 20 7b 20 22  VERAGE.      { "
35190 70 61 72 73 65 72 5f 63 6f 76 65 72 61 67 65 22  parser_coverage"
351a0 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ,    SQLITE_TEST
351b0 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45  CTRL_PARSER_COVE
351c0 52 41 47 45 2c 20 22 22 20 20 20 20 20 20 20 20  RAGE, ""        
351d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
351e0 69 66 0a 20 20 20 20 20 20 7b 20 22 70 65 6e 64  if.      { "pend
351f0 69 6e 67 5f 62 79 74 65 22 2c 20 20 20 20 20 20  ing_byte",      
35200 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35210 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 20  _PENDING_BYTE,  
35220 22 4f 46 46 53 45 54 20 20 22 20 20 20 20 20 20  "OFFSET  "      
35230 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
35240 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20 20 20  "prng_reset",   
35250 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
35260 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
35270 2c 20 20 20 20 22 22 20 20 20 20 20 20 20 20 20  ,    ""         
35280 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
35290 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f     { "prng_resto
352a0 72 65 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  re",       SQLIT
352b0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
352c0 52 45 53 54 4f 52 45 2c 20 20 22 22 20 20 20 20  RESTORE,  ""    
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
352e0 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f  ,.      { "prng_
352f0 73 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  save",          
35300 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35310 50 52 4e 47 5f 53 41 56 45 2c 20 20 20 20 20 22  PRNG_SAVE,     "
35320 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
35330 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
35340 72 65 73 65 72 76 65 22 2c 20 20 20 20 20 20 20  reserve",       
35350 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
35360 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 20 20  CTRL_RESERVE,   
35370 20 20 20 20 22 42 59 54 45 53 2d 4f 46 2d 52 45      "BYTES-OF-RE
35380 53 45 52 56 45 22 20 20 20 7d 2c 0a 20 20 20 20  SERVE"   },.    
35390 7d 3b 0a 20 20 20 20 69 6e 74 20 74 65 73 74 63  };.    int testc
353a0 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  trl = -1;.    in
353b0 74 20 69 43 74 72 6c 20 3d 20 2d 31 3b 0a 20 20  t iCtrl = -1;.  
353c0 20 20 69 6e 74 20 72 63 32 20 3d 20 30 3b 20 20    int rc2 = 0;  
353d0 20 20 2f 2a 20 30 3a 20 75 73 61 67 65 2e 20 20    /* 0: usage.  
353e0 31 3a 20 25 64 20 20 32 3a 20 25 78 20 20 33 3a  1: %d  2: %x  3:
353f0 20 6e 6f 2d 6f 75 74 70 75 74 20 2a 2f 0a 20 20   no-output */.  
35400 20 20 69 6e 74 20 69 73 4f 6b 20 3d 20 30 3b 0a    int isOk = 0;.
35410 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20      int i, n2;. 
35420 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
35430 43 6d 64 20 3d 20 30 3b 0a 0a 20 20 20 20 6f 70  Cmd = 0;..    op
35440 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
35450 20 7a 43 6d 64 20 3d 20 6e 41 72 67 3e 3d 32 20   zCmd = nArg>=2 
35460 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 68 65  ? azArg[1] : "he
35470 6c 70 22 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  lp";..    /* The
35480 20 61 72 67 75 6d 65 6e 74 20 63 61 6e 20 6f 70   argument can op
35490 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77  tionally begin w
354a0 69 74 68 20 22 2d 22 20 6f 72 20 22 2d 2d 22 20  ith "-" or "--" 
354b0 2a 2f 0a 20 20 20 20 69 66 28 20 7a 43 6d 64 5b  */.    if( zCmd[
354c0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b  0]=='-' && zCmd[
354d0 31 5d 20 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64  1] ){.      zCmd
354e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  ++;.      if( zC
354f0 6d 64 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43  md[0]=='-' && zC
35500 6d 64 5b 31 5d 20 29 20 7a 43 6d 64 2b 2b 3b 0a  md[1] ) zCmd++;.
35510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2d 2d      }..    /* --
35520 68 65 6c 70 20 6c 69 73 74 73 20 61 6c 6c 20 74  help lists all t
35530 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 20 2a 2f 0a  est-controls */.
35540 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
35550 43 6d 64 2c 22 68 65 6c 70 22 29 3d 3d 30 20 29  Cmd,"help")==0 )
35560 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
35570 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 76 61  ntf(p->out, "Ava
35580 69 6c 61 62 6c 65 20 74 65 73 74 2d 63 6f 6e 74  ilable test-cont
35590 72 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 20  rols:\n");.     
355a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
355b0 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b  ySize(aCtrl); i+
355c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  +){.        utf8
355d0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
355e0 22 20 20 2e 74 65 73 74 63 74 72 6c 20 25 73 20  "  .testctrl %s 
355f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
35600 20 20 20 20 20 20 20 20 20 20 20 61 43 74 72 6c             aCtrl
35610 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 61  [i].zCtrlName, a
35620 43 74 72 6c 5b 69 5d 2e 7a 55 73 61 67 65 29 3b  Ctrl[i].zUsage);
35630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
35640 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
35650 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35660 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xit;.    }..    
35670 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65 73 74 63  /* convert testc
35680 74 72 6c 20 74 65 78 74 20 6f 70 74 69 6f 6e 20  trl text option 
35690 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c 6f 77 20  to value. allow 
356a0 61 6e 79 20 75 6e 69 71 75 65 20 70 72 65 66 69  any unique prefi
356b0 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  x.    ** of the 
356c0 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72 20  option name, or 
356d0 61 20 6e 75 6d 65 72 69 63 61 6c 20 76 61 6c 75  a numerical valu
356e0 65 2e 20 2a 2f 0a 20 20 20 20 6e 32 20 3d 20 73  e. */.    n2 = s
356f0 74 72 6c 65 6e 33 30 28 7a 43 6d 64 29 3b 0a 20  trlen30(zCmd);. 
35700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
35710 72 61 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20  raySize(aCtrl); 
35720 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
35730 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 20 61 43  strncmp(zCmd, aC
35740 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
35750 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
35760 20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c      if( testctrl
35770 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
35780 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c  testctrl = aCtrl
35790 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20  [i].ctrlCode;.  
357a0 20 20 20 20 20 20 20 20 69 43 74 72 6c 20 3d 20          iCtrl = 
357b0 69 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  i;.        }else
357c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
357d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
357e0 22 45 72 72 6f 72 3a 20 61 6d 62 69 67 75 6f 75  "Error: ambiguou
357f0 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20  s test-control: 
35800 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"%s\"\n".      
35810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35820 20 20 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e          "Use \".
35830 74 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c  testctrl --help\
35840 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a  " for help\n", z
35850 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmd);.          
35860 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
35870 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35880 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
35890 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
358a0 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 63 74  }.    if( testct
358b0 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 74  rl<0 ){.      ut
358c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
358d0 2c 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e  ,"Error: unknown
358e0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 25   test-control: %
358f0 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  s\n".           
35900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
35910 73 65 20 5c 22 2e 74 65 73 74 63 74 72 6c 20 2d  se \".testctrl -
35920 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70  -help\" for help
35930 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20  \n", zCmd);.    
35940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69  }else{.      swi
35950 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a  tch(testctrl){..
35960 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
35970 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
35980 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f  int, db, int) */
35990 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
359a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
359b0 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20  TIMIZATIONS:.   
359c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
359d0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
359e0 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  E:.          if(
359f0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
35a00 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20          int opt 
35a10 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a  = (int)strtol(az
35a20 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20  Arg[2], 0, 0);. 
35a30 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
35a40 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35a50 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
35a60 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20 20 20  p->db, opt);.   
35a70 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
35a80 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
35a90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35aa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
35ab0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
35ac0 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20  (int) */.       
35ad0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
35ae0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
35af0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
35b00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
35b10 4e 47 5f 52 45 53 54 4f 52 45 3a 0a 20 20 20 20  NG_RESTORE:.    
35b20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
35b30 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
35b40 53 45 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73  SET:.        cas
35b50 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
35b60 4c 5f 42 59 54 45 4f 52 44 45 52 3a 0a 20 20 20  L_BYTEORDER:.   
35b70 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
35b80 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =2 ){.          
35b90 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
35ba0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
35bb0 74 63 74 72 6c 29 3b 0a 20 20 20 20 20 20 20 20  tctrl);.        
35bc0 20 20 20 20 69 73 4f 6b 20 3d 20 74 65 73 74 63      isOk = testc
35bd0 74 72 6c 3d 3d 53 51 4c 49 54 45 5f 54 45 53 54  trl==SQLITE_TEST
35be0 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 20 3f  CTRL_BYTEORDER ?
35bf0 20 31 20 3a 20 33 3b 0a 20 20 20 20 20 20 20 20   1 : 3;.        
35c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
35c10 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  eak;..        /*
35c20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35c30 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29  ntrol(int, uint)
35c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
35c50 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35c60 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 0a 20  _PENDING_BYTE:. 
35c70 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
35c80 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
35c90 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
35ca0 20 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e 65 64   opt = (unsigned
35cb0 20 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75   int)integerValu
35cc0 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20  e(azArg[2]);.   
35cd0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
35ce0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
35cf0 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70  rol(testctrl, op
35d00 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
35d10 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20  isOk = 3;.      
35d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35d30 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
35d40 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
35d50 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e 74  control(int, int
35d60 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  ) */.        cas
35d70 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
35d80 4c 5f 41 53 53 45 52 54 3a 0a 20 20 20 20 20 20  L_ASSERT:.      
35d90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
35da0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 0a 20  STCTRL_ALWAYS:. 
35db0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
35dc0 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
35dd0 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f      int opt = bo
35de0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
35df0 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [2]);.          
35e00 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
35e10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
35e20 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20  tctrl, opt);.   
35e30 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
35e40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
35e50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
35e70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
35e80 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  (int, int) */.  
35e90 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
35ea0 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
35eb0 54 49 4d 45 5f 46 41 55 4c 54 3a 0a 20 20 20 20  TIME_FAULT:.    
35ec0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
35ed0 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
35ee0 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20 20 20  ORRUPT:.        
35ef0 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
35f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
35f10 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61   opt = booleanVa
35f20 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  lue(azArg[2]);. 
35f30 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
35f40 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35f50 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
35f60 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
35f70 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20    isOk = 3;.    
35f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35f90 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
35fa0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
35fb0 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 63  t_control(int, c
35fc0 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65 66  har *) */.#ifdef
35fd0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
35fe0 44 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  D.        case S
35ff0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
36000 53 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20  SKEYWORD:.      
36010 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
36020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
36030 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 20 3d  onst char *opt =
36040 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20   azArg[2];.     
36050 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
36060 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
36070 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
36080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
36090 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Ok = 1;.        
360a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
360b0 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  eak;.#endif..   
360c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
360d0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
360e0 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ER:.          if
360f0 28 20 6e 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20  ( nArg==5 ){.   
36100 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
36110 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36120 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d  rol(testctrl, p-
36130 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
36140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36150 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20  zArg[2],.       
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36170 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28     integerValue(
36180 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
36190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361a0 20 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75       integerValu
361b0 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20  e(azArg[4]));.  
361c0 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d            isOk =
361d0 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
361e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
361f0 0a 0a 23 69 66 64 65 66 20 59 59 43 4f 56 45 52  ..#ifdef YYCOVER
36200 41 47 45 0a 20 20 20 20 20 20 20 20 63 61 73 65  AGE.        case
36210 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
36220 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
36230 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
36240 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
36250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
36260 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74  est_control(test
36270 63 74 72 6c 2c 20 70 2d 3e 6f 75 74 29 3b 0a 20  ctrl, p->out);. 
36280 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
36290 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
362a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
362b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
362c0 4f 6b 3d 3d 30 20 26 26 20 69 43 74 72 6c 3e 3d  Ok==0 && iCtrl>=
362d0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
362e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
362f0 55 73 61 67 65 3a 20 2e 74 65 73 74 63 74 72 6c  Usage: .testctrl
36300 20 25 73 20 25 73 5c 6e 22 2c 20 7a 43 6d 64 2c   %s %s\n", zCmd,
36310 20 61 43 74 72 6c 5b 69 43 74 72 6c 5d 2e 7a 55   aCtrl[iCtrl].zU
36320 73 61 67 65 29 3b 0a 20 20 20 20 20 20 72 63 20  sage);.      rc 
36330 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
36340 66 28 20 69 73 4f 6b 3d 3d 31 20 29 7b 0a 20 20  f( isOk==1 ){.  
36350 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
36360 2d 3e 6f 75 74 2c 20 22 25 64 5c 6e 22 2c 20 72  ->out, "%d\n", r
36370 63 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c2);.    }else i
36380 66 28 20 69 73 4f 6b 3d 3d 32 20 29 7b 0a 20 20  f( isOk==2 ){.  
36390 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
363a0 2d 3e 6f 75 74 2c 20 22 30 78 25 30 38 78 5c 6e  ->out, "0x%08x\n
363b0 22 2c 20 72 63 32 29 3b 0a 20 20 20 20 7d 0a 20  ", rc2);.    }. 
363c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
363d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
363e0 5f 55 4e 54 45 53 54 41 42 4c 45 29 20 2a 2f 0a  _UNTESTABLE) */.
363f0 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26  .  if( c=='t' &&
36400 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70 28   n>4 && strncmp(
36410 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f  azArg[0], "timeo
36420 75 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ut", n)==0 ){.  
36430 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
36440 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
36450 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c  y_timeout(p->db,
36460 20 6e 41 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29   nArg>=2 ? (int)
36470 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
36480 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 7d  rg[1]) : 0);.  }
36490 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
364a0 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  t' && n>=5 && st
364b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
364c0 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29  "timer", n)==0 )
364d0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
364e0 32 20 29 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c  2 ){.      enabl
364f0 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  eTimer = boolean
36500 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
36510 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61 62 6c  .      if( enabl
36520 65 54 69 6d 65 72 20 26 26 20 21 48 41 53 5f 54  eTimer && !HAS_T
36530 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  IMER ){.        
36540 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36550 72 2c 20 22 45 72 72 6f 72 3a 20 74 69 6d 65 72  r, "Error: timer
36560 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
36570 6e 20 74 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e  n this system.\n
36580 22 29 3b 0a 20 20 20 20 20 20 20 20 65 6e 61 62  ");.        enab
36590 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20  leTimer = 0;.   
365a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
365b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
365c0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
365d0 20 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e   .timer on|off\n
365e0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
365f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
36600 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26  .  if( c=='t' &&
36610 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36620 5d 2c 20 22 74 72 61 63 65 22 2c 20 6e 29 3d 3d  ], "trace", n)==
36630 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
36640 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
36650 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
36660 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36670 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 72 61  rr, "Usage: .tra
36680 63 65 20 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b  ce FILE|off\n");
36690 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
366a0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
366b0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
366c0 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69   }.    output_fi
366d0 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 74 72 61 63  le_close(p->trac
366e0 65 4f 75 74 29 3b 0a 20 20 20 20 70 2d 3e 74 72  eOut);.    p->tr
366f0 61 63 65 4f 75 74 20 3d 20 6f 75 74 70 75 74 5f  aceOut = output_
36700 66 69 6c 65 5f 6f 70 65 6e 28 61 7a 41 72 67 5b  file_open(azArg[
36710 31 5d 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  1]);.#if !define
36720 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
36730 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
36740 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
36750 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
36760 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74   if( p->traceOut
36770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
36780 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 2d  ite3_trace_v2(p-
36790 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
367a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
367b0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
367c0 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 54  (p->db, SQLITE_T
367d0 52 41 43 45 5f 53 54 4d 54 2c 20 73 71 6c 5f 74  RACE_STMT, sql_t
367e0 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 2c 70 2d  race_callback,p-
367f0 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20  >traceOut);.    
36800 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
36810 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
36820 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
36830 0a 20 20 69 66 28 20 63 3d 3d 27 75 27 20 26 26  .  if( c=='u' &&
36840 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36850 5d 2c 20 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30  ], "user", n)==0
36860 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
36870 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
36880 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36890 55 73 61 67 65 3a 20 2e 75 73 65 72 20 53 55 42  Usage: .user SUB
368a0 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b  COMMAND ...\n");
368b0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
368c0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
368d0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
368e0 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
368f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
36900 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  rcmp(azArg[1],"l
36910 6f 67 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ogin")==0 ){.   
36920 20 20 20 69 66 28 20 6e 41 72 67 21 3d 34 20 29     if( nArg!=4 )
36930 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
36940 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36950 61 67 65 3a 20 2e 75 73 65 72 20 6c 6f 67 69 6e  age: .user login
36960 20 55 53 45 52 20 50 41 53 53 57 4f 52 44 5c 6e   USER PASSWORD\n
36970 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
36980 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
36990 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
369a0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
369b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
369c0 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65  ser_authenticate
369d0 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d  (p->db, azArg[2]
369e0 2c 20 61 7a 41 72 67 5b 33 5d 2c 0a 20 20 20 20  , azArg[3],.    
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a10 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72  (int)strlen(azAr
36a20 67 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  g[3]));.      if
36a30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36a40 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36a50 72 72 2c 20 22 41 75 74 68 65 6e 74 69 63 61 74  rr, "Authenticat
36a60 69 6f 6e 20 66 61 69 6c 65 64 20 66 6f 72 20 75  ion failed for u
36a70 73 65 72 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  ser %s\n", azArg
36a80 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [2]);.        rc
36a90 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
36aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36ab0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 64 64  mp(azArg[1],"add
36ac0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36ad0 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20 20  f( nArg!=5 ){.  
36ae0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36af0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
36b00 20 2e 75 73 65 72 20 61 64 64 20 55 53 45 52 20   .user add USER 
36b10 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
36b20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
36b30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
36b40 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36b50 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
36b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b70 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e 64 62 2c  _user_add(p->db,
36b80 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20   azArg[2],.     
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 33 5d 2c         azArg[3],
36bb0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41   (int)strlen(azA
36bc0 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20  rg[3]),.        
36bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36be0 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65      booleanValue
36bf0 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20  (azArg[4]));.   
36c00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
36c10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36c20 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d 41 64  stderr, "User-Ad
36c30 64 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c  d failed: %d\n",
36c40 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63   rc);.        rc
36c50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
36c60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36c70 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 65 64 69  mp(azArg[1],"edi
36c80 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
36c90 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20  if( nArg!=5 ){. 
36ca0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
36cb0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
36cc0 3a 20 2e 75 73 65 72 20 65 64 69 74 20 55 53 45  : .user edit USE
36cd0 52 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  R PASSWORD ISADM
36ce0 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  IN\n");.        
36cf0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
36d00 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36d10 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36d20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36d30 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 70  e3_user_change(p
36d40 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a  ->db, azArg[2],.
36d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
36d70 41 72 67 5b 33 5d 2c 20 28 69 6e 74 29 73 74 72  Arg[3], (int)str
36d80 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20  len(azArg[3]),. 
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
36db0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
36dc0 34 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  4]));.      if( 
36dd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  rc ){.        ra
36de0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36df0 20 22 55 73 65 72 2d 45 64 69 74 20 66 61 69 6c   "User-Edit fail
36e00 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  ed: %d\n", rc);.
36e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
36e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36e30 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
36e40 72 67 5b 31 5d 2c 22 64 65 6c 65 74 65 22 29 3d  rg[1],"delete")=
36e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
36e60 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20  nArg!=3 ){.     
36e70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36e80 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75  derr, "Usage: .u
36e90 73 65 72 20 64 65 6c 65 74 65 20 55 53 45 52 5c  ser delete USER\
36ea0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
36eb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
36ec0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
36ed0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
36ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
36ef0 75 73 65 72 5f 64 65 6c 65 74 65 28 70 2d 3e 64  user_delete(p->d
36f00 62 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  b, azArg[2]);.  
36f10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
36f20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36f30 28 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d 44  (stderr, "User-D
36f40 65 6c 65 74 65 20 66 61 69 6c 65 64 3a 20 25 64  elete failed: %d
36f50 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
36f60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36f70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
36f80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36f90 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75  derr, "Usage: .u
36fa0 73 65 72 20 6c 6f 67 69 6e 7c 61 64 64 7c 65 64  ser login|add|ed
36fb0 69 74 7c 64 65 6c 65 74 65 20 2e 2e 2e 5c 6e 22  it|delete ...\n"
36fc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
36fd0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
36fe0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36ff0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
37000 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
37010 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
37020 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27  N */..  if( c=='
37030 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  v' && strncmp(az
37040 41 72 67 5b 30 5d 2c 20 22 76 65 72 73 69 6f 6e  Arg[0], "version
37050 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
37060 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
37070 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73 20 25  ut, "SQLite %s %
37080 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72  s\n" /*extra-ver
37090 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20 20 20  sion-info*/,.   
370a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62       sqlite3_lib
370b0 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74  version(), sqlit
370c0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
370d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
370e0 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70  =='v' && strncmp
370f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73 69  (azArg[0], "vfsi
37100 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  nfo", n)==0 ){. 
37110 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
37120 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d 32  DbName = nArg==2
37130 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d   ? azArg[1] : "m
37140 61 69 6e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  ain";.    sqlite
37150 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 30 3b  3_vfs *pVfs = 0;
37160 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29  .    if( p->db )
37170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
37180 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
37190 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c  db, zDbName, SQL
371a0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f  ITE_FCNTL_VFS_PO
371b0 49 4e 54 45 52 2c 20 26 70 56 66 73 29 3b 0a 20  INTER, &pVfs);. 
371c0 20 20 20 20 20 69 66 28 20 70 56 66 73 20 29 7b       if( pVfs ){
371d0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
371e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
371f0 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c  s.zName      = \
37200 22 25 73 5c 22 5c 6e 22 2c 20 70 56 66 73 2d 3e  "%s\"\n", pVfs->
37210 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
37220 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
37230 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69 6f 6e  t, "vfs.iVersion
37240 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73     = %d\n", pVfs
37250 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20  ->iVersion);.   
37260 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
37270 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a 4f  p->out, "vfs.szO
37280 73 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22 2c  sFile   = %d\n",
37290 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
372a0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
372b0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
372c0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 25  s.mxPathname = %
372d0 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d 78 50 61  d\n", pVfs->mxPa
372e0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  thname);.      }
372f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
37300 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20    if( c=='v' && 
37310 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
37320 2c 20 22 76 66 73 6c 69 73 74 22 2c 20 6e 29 3d  , "vfslist", n)=
37330 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
37340 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 20  3_vfs *pVfs;.   
37350 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43   sqlite3_vfs *pC
37360 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  urrent = 0;.    
37370 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
37380 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f     sqlite3_file_
37390 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22  control(p->db, "
373a0 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
373b0 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 2c  NTL_VFS_POINTER,
373c0 20 26 70 43 75 72 72 65 6e 74 29 3b 0a 20 20 20   &pCurrent);.   
373d0 20 7d 0a 20 20 20 20 66 6f 72 28 70 56 66 73 3d   }.    for(pVfs=
373e0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
373f0 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d  (0); pVfs; pVfs=
37400 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pVfs->pNext){.  
37410 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
37420 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a 4e 61  p->out, "vfs.zNa
37430 6d 65 20 20 20 20 20 20 3d 20 5c 22 25 73 5c 22  me      = \"%s\"
37440 25 73 5c 6e 22 2c 20 70 56 66 73 2d 3e 7a 4e 61  %s\n", pVfs->zNa
37450 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  me,.           p
37460 56 66 73 3d 3d 70 43 75 72 72 65 6e 74 20 3f 20  Vfs==pCurrent ? 
37470 22 20 20 3c 2d 2d 2d 20 43 55 52 52 45 4e 54 22  "  <--- CURRENT"
37480 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 72 61   : "");.      ra
37490 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
374a0 20 22 76 66 73 2e 69 56 65 72 73 69 6f 6e 20 20   "vfs.iVersion  
374b0 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e   = %d\n", pVfs->
374c0 69 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20  iVersion);.     
374d0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
374e0 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73 46 69 6c  ut, "vfs.szOsFil
374f0 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66  e   = %d\n", pVf
37500 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
37510 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
37520 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d 78 50 61  ->out, "vfs.mxPa
37530 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e 22 2c 20  thname = %d\n", 
37540 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
37550 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 66  );.      if( pVf
37560 73 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  s->pNext ){.    
37570 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
37580 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
37590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
375a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
375b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
375c0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
375d0 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='v' && strncmp(
375e0 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73 6e 61  azArg[0], "vfsna
375f0 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  me", n)==0 ){.  
37600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
37610 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20  bName = nArg==2 
376