/ Hex Artifact Content
Login

Artifact 074b2129559a0aa712a367317f7e7daf4740925ec2c123b529800628eb10dc73:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  e3.h".#if SQLITE
06f0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
0700: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
0710: 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e  sqlite3userauth.
0720: 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75  h".#endif.#inclu
0730: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
0740: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0750: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
0760: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
0770: 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c  ed(WIN32).# incl
0780: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0790: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
07a0: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
07b0: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23  d(_WRS_KERNEL).#
07c0: 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68    include <pwd.h
07d0: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69 6e 63 6c  >.# endif.# incl
07e0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
07f0: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79   include <sys/ty
0800: 70 65 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  pes.h>.#endif..#
0810: 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  if HAVE_READLINE
0820: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0830: 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e  line/readline.h>
0840: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0850: 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a  line/history.h>.
0860: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
0870: 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69 6e 63 6c  _EDITLINE.# incl
0880: 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f 72 65  ude <editline/re
0890: 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64 69 66  adline.h>.#endif
08a0: 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49 54 4c  ..#if HAVE_EDITL
08b0: 49 4e 45 20 7c 7c 20 48 41 56 45 5f 52 45 41 44  INE || HAVE_READ
08c0: 4c 49 4e 45 0a 0a 23 20 64 65 66 69 6e 65 20 73  LINE..# define s
08d0: 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79  hell_add_history
08e0: 28 58 29 20 61 64 64 5f 68 69 73 74 6f 72 79 28  (X) add_history(
08f0: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0900: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0910: 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  ) read_history(X
0920: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0930: 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58  _write_history(X
0940: 29 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  ) write_history(
0950: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0960: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0970: 28 58 29 20 73 74 69 66 6c 65 5f 68 69 73 74 6f  (X) stifle_histo
0980: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ry(X).# define s
0990: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29  hell_readline(X)
09a0: 20 72 65 61 64 6c 69 6e 65 28 58 29 0a 0a 23 65   readline(X)..#e
09b0: 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49  lif HAVE_LINENOI
09c0: 53 45 0a 0a 23 20 69 6e 63 6c 75 64 65 20 22 6c  SE..# include "l
09d0: 69 6e 65 6e 6f 69 73 65 2e 68 22 0a 23 20 64 65  inenoise.h".# de
09e0: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
09f0: 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f  istory(X) lineno
0a00: 69 73 65 48 69 73 74 6f 72 79 41 64 64 28 58 29  iseHistoryAdd(X)
0a10: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
0a20: 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20  read_history(X) 
0a30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0a40: 4c 6f 61 64 28 58 29 0a 23 20 64 65 66 69 6e 65  Load(X).# define
0a50: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a60: 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73  tory(X) linenois
0a70: 65 48 69 73 74 6f 72 79 53 61 76 65 28 58 29 0a  eHistorySave(X).
0a80: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73  # define shell_s
0a90: 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29  tifle_history(X)
0aa0: 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72   linenoiseHistor
0ab0: 79 53 65 74 4d 61 78 4c 65 6e 28 58 29 0a 23 20  ySetMaxLen(X).# 
0ac0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
0ad0: 64 6c 69 6e 65 28 58 29 20 6c 69 6e 65 6e 6f 69  dline(X) linenoi
0ae0: 73 65 28 58 29 0a 0a 23 65 6c 73 65 0a 0a 23 20  se(X)..#else..# 
0af0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
0b00: 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  d_history(X).# d
0b10: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74  efine shell_writ
0b20: 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  e_history(X).# d
0b30: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66  efine shell_stif
0b40: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 0a 23  le_history(X)..#
0b50: 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 55 53   define SHELL_US
0b60: 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 20  E_LOCAL_GETLINE 
0b70: 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  1.#endif...#if d
0b80: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
0b90: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
0ba0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68  .# include <io.h
0bb0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66 63 6e  >.# include <fcn
0bc0: 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 69  tl.h>.# define i
0bd0: 73 61 74 74 79 28 68 29 20 5f 69 73 61 74 74 79  satty(h) _isatty
0be0: 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61 63 63  (h).# ifndef acc
0bf0: 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20 61 63  ess.#  define ac
0c00: 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63 65 73  cess(f,m) _acces
0c10: 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65 6e 64  s((f),(m)).# end
0c20: 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e  if.# undef popen
0c30: 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20  .# define popen 
0c40: 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70  _popen.# undef p
0c50: 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70  close.# define p
0c60: 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65  close _pclose.#e
0c70: 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72  lse. /* Make sur
0c80: 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20 61  e isatty() has a
0c90: 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20   prototype. */. 
0ca0: 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74  extern int isatt
0cb0: 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64  y(int);..# if !d
0cc0: 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
0cd0: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
0ce0: 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f  _KERNEL).  /* po
0cf0: 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61  pen and pclose a
0d00: 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74  re not C89 funct
0d10: 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a  ions and so are.
0d20: 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f    ** sometimes o
0d30: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
0d40: 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72  <stdio.h> header
0d50: 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49   */.   extern FI
0d60: 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20  LE *popen(const 
0d70: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
0d80: 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e  *);.   extern in
0d90: 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b  t pclose(FILE*);
0da0: 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  .# else.#  defin
0db0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  e SQLITE_OMIT_PO
0dc0: 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65  PEN 1.# endif.#e
0dd0: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
0de0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a  d(_WIN32_WCE)./*
0df0: 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d   Windows CE (arm
0e00: 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65  -wince-mingw32ce
0e10: 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70  -gcc) does not p
0e20: 72 6f 76 69 64 65 20 69 73 61 74 74 79 28 29 0a  rovide isatty().
0e30: 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77 61 79   * thus we alway
0e40: 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 65  s assume that we
0e50: 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e   have a console.
0e60: 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20   That can be. * 
0e70: 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74 68 20  overridden with 
0e80: 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61  the -batch comma
0e90: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a  nd line option..
0ea0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74   */.#define isat
0eb0: 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a  ty(x) 1.#endif..
0ec0: 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20  /* ctype macros 
0ed0: 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73  that work with s
0ee0: 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
0ef0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70   */.#define IsSp
0f00: 61 63 65 28 58 29 20 20 69 73 73 70 61 63 65 28  ace(X)  isspace(
0f10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
0f20: 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69 67 69  ).#define IsDigi
0f30: 74 28 58 29 20 20 69 73 64 69 67 69 74 28 28 75  t(X)  isdigit((u
0f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
0f50: 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28  #define ToLower(
0f60: 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65  X)  (char)tolowe
0f70: 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r((unsigned char
0f80: 29 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  )X)..#if defined
0f90: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
0fa0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c  ned(WIN32).#incl
0fb0: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0fc0: 0a 2f 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65  ./* string conve
0fd0: 72 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f  rsion routines o
0fe0: 6e 6c 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69  nly needed on Wi
0ff0: 6e 33 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68  n32 */.extern ch
1000: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
1010: 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66  2_unicode_to_utf
1020: 38 28 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65  8(LPCWSTR);.exte
1030: 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
1040: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1050: 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  tf8_v2(const cha
1060: 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72  r *, int);.exter
1070: 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  n char *sqlite3_
1080: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
1090: 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72  cs_v2(const char
10a0: 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e   *, int);.extern
10b0: 20 4c 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f   LPWSTR sqlite3_
10c0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
10d0: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
10e0: 20 2a 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66   *zText);.#endif
10f0: 0a 0a 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c  ../* On Windows,
1100: 20 77 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e   we normally run
1110: 20 77 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64   with output mod
1120: 65 20 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61  e of TEXT so tha
1130: 74 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a  t \n characters.
1140: 2a 2a 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  ** are automatic
1150: 61 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20  ally translated 
1160: 69 6e 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65  into \r\n.  Howe
1170: 76 65 72 2c 20 74 68 69 73 20 62 65 68 61 76 69  ver, this behavi
1180: 6f 72 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  or needs.** to b
1190: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f  e disabled in so
11a0: 6d 65 20 63 61 73 65 73 20 28 65 78 3a 20 77 68  me cases (ex: wh
11b0: 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53  en generating CS
11c0: 56 20 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65  V output and whe
11d0: 6e 0a 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71  n.** rendering q
11e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 74 68  uoted strings th
11f0: 61 74 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68  at contain \n ch
1200: 61 72 61 63 74 65 72 73 29 2e 20 20 54 68 65 20  aracters).  The 
1210: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
1220: 74 69 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20  tines take care 
1230: 6f 66 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20  of that..*/.#if 
1240: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1250: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1260: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
1270: 74 42 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45  tBinaryMode(FILE
1280: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1290: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
12a0: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
12b0: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
12c0: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
12d0: 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74  _O_BINARY);.}.st
12e0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 78  atic void setTex
12f0: 74 4d 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65  tMode(FILE *file
1300: 2c 20 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b  , int isOutput){
1310: 0a 20 20 69 66 28 20 69 73 4f 75 74 70 75 74 20  .  if( isOutput 
1320: 29 20 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a  ) fflush(file);.
1330: 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65    _setmode(_file
1340: 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58  no(file), _O_TEX
1350: 54 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  T);.}.#else.# de
1360: 66 69 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f  fine setBinaryMo
1370: 64 65 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65  de(X,Y).# define
1380: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59   setTextMode(X,Y
1390: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72  ).#endif.../* Tr
13a0: 75 65 20 69 66 20 74 68 65 20 74 69 6d 65 72 20  ue if the timer 
13b0: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
13c0: 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54  atic int enableT
13d0: 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65  imer = 0;../* Re
13e0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
13f0: 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65   wall-clock time
1400: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
1410: 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44  e3_int64 timeOfD
1420: 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ay(void){.  stat
1430: 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
1440: 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20  clockVfs = 0;.  
1450: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b  sqlite3_int64 t;
1460: 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d  .  if( clockVfs=
1470: 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20  =0 ) clockVfs = 
1480: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1490: 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b  (0);.  if( clock
14a0: 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  Vfs->iVersion>=2
14b0: 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43   && clockVfs->xC
14c0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21  urrentTimeInt64!
14d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56  =0 ){.    clockV
14e0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
14f0: 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20  Int64(clockVfs, 
1500: 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  &t);.  }else{.  
1510: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
1520: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1530: 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c  ntTime(clockVfs,
1540: 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73   &r);.    t = (s
1550: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a  qlite3_int64)(r*
1560: 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d  86400000.0);.  }
1570: 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a  .  return t;.}..
1580: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
1590: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
15a0: 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  (WIN32) && !defi
15b0: 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e  ned(__minux).#in
15c0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
15d0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
15e0: 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a  /resource.h>../*
15f0: 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f   VxWorks does no
1600: 74 20 73 75 70 70 6f 72 74 20 67 65 74 72 75 73  t support getrus
1610: 61 67 65 28 29 20 61 73 20 66 61 72 20 61 73 20  age() as far as 
1620: 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65  we can determine
1630: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1640: 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20  _WRS_KERNEL) || 
1650: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
1660: 0a 73 74 72 75 63 74 20 72 75 73 61 67 65 20 7b  .struct rusage {
1670: 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
1680: 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75  l ru_utime; /* u
1690: 73 65 72 20 43 50 55 20 74 69 6d 65 20 75 73 65  ser CPU time use
16a0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69  d */.  struct ti
16b0: 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20  meval ru_stime; 
16c0: 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20 74 69  /* system CPU ti
16d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64  me used */.};.#d
16e0: 65 66 69 6e 65 20 67 65 74 72 75 73 61 67 65 28  efine getrusage(
16f0: 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c  A,B) memset(B,0,
1700: 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64  sizeof(*B)).#end
1710: 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73  if../* Saved res
1720: 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  ource informatio
1730: 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e  n for the beginn
1740: 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  ing of an operat
1750: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
1760: 72 75 63 74 20 72 75 73 61 67 65 20 73 42 65 67  ruct rusage sBeg
1770: 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65  in;  /* CPU time
1780: 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61   at start */.sta
1790: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
17a0: 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61  4 iBegin;  /* Wa
17b0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74  ll-clock time at
17c0: 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   start */../*.**
17d0: 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e   Begin timing an
17e0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74   operation.*/.st
17f0: 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54  atic void beginT
1800: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1810: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b  ( enableTimer ){
1820: 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52  .    getrusage(R
1830: 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65  USAGE_SELF, &sBe
1840: 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e  gin);.    iBegin
1850: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
1860: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
1870: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1880: 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75  of two time_stru
1890: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
18a0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
18b0: 74 69 6d 65 44 69 66 66 28 73 74 72 75 63 74 20  timeDiff(struct 
18c0: 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c  timeval *pStart,
18d0: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
18e0: 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e  *pEnd){.  return
18f0: 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20   (pEnd->tv_usec 
1900: 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65  - pStart->tv_use
1910: 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20  c)*0.000001 +.  
1920: 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28         (double)(
1930: 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70  pEnd->tv_sec - p
1940: 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a  Start->tv_sec);.
1950: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
1960: 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74  he timing result
1970: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1980: 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29  d endTimer(void)
1990: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
19a0: 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mer ){.    sqlit
19b0: 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20  e3_int64 iEnd = 
19c0: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20  timeOfDay();.   
19d0: 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73   struct rusage s
19e0: 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61  End;.    getrusa
19f0: 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20  ge(RUSAGE_SELF, 
1a00: 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e  &sEnd);.    prin
1a10: 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65  tf("Run Time: re
1a20: 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66 20  al %.3f user %f 
1a30: 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20  sys %f\n",.     
1a40: 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e    (iEnd - iBegin
1a50: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
1a60: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1a70: 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_utime, &sEnd
1a80: 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20  .ru_utime),.    
1a90: 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65     timeDiff(&sBe
1aa0: 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73  gin.ru_stime, &s
1ab0: 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a  End.ru_stime));.
1ac0: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42    }.}..#define B
1ad0: 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e  EGIN_TIMER begin
1ae0: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
1af0: 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d  END_TIMER endTim
1b00: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53  er().#define HAS
1b10: 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20  _TIMER 1..#elif 
1b20: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
1b30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
1b40: 32 29 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65  2))../* Saved re
1b50: 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69  source informati
1b60: 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e  on for the begin
1b70: 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61  ning of an opera
1b80: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48  tion */.static H
1b90: 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a  ANDLE hProcess;.
1ba0: 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20  static FILETIME 
1bb0: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73  ftKernelBegin;.s
1bc0: 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66  tatic FILETIME f
1bd0: 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74  tUserBegin;.stat
1be0: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
1bf0: 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79   ftWallBegin;.ty
1c00: 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41  pedef BOOL (WINA
1c10: 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53  PI *GETPROCTIMES
1c20: 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45  )(HANDLE, LPFILE
1c30: 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45  TIME, LPFILETIME
1c40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
1c70: 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73  , LPFILETIME);.s
1c80: 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d  tatic GETPROCTIM
1c90: 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  ES getProcessTim
1ca0: 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  esAddr = NULL;..
1cb0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
1cc0: 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74 69  ee if we have ti
1cd0: 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65  mer support.  Re
1ce0: 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73  turn 1 if necess
1cf0: 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66  ary.** support f
1d00: 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70  ound (or found p
1d10: 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73  reviously)..*/.s
1d20: 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d  tatic int hasTim
1d30: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
1d40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1d50: 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ddr ){.    retur
1d60: 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 1;.  } else {.
1d70: 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73      /* GetProces
1d80: 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73  sTimes() isn't s
1d90: 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39  upported in WIN9
1da0: 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  5 and some other
1db0: 20 57 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20   Windows.    ** 
1dc0: 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66  versions. See if
1dd0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20   the version we 
1de0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68  are running on h
1df0: 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74  as it, and if it
1e00: 0a 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61  .    ** does, sa
1e10: 76 65 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72  ve off a pointer
1e20: 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63   to it and the c
1e30: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68  urrent process h
1e40: 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  andle..    */.  
1e50: 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74    hProcess = Get
1e60: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29  CurrentProcess()
1e70: 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63 65  ;.    if( hProce
1e80: 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53  ss ){.      HINS
1e90: 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d  TANCE hinstLib =
1ea0: 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58   LoadLibrary(TEX
1eb0: 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22  T("Kernel32.dll"
1ec0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55  ));.      if( NU
1ed0: 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29  LL != hinstLib )
1ee0: 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72 6f  {.        getPro
1ef0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a  cessTimesAddr =.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 28 47 45 54              (GET
1f10: 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72  PROCTIMES) GetPr
1f20: 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c  ocAddress(hinstL
1f30: 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54  ib, "GetProcessT
1f40: 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20  imes");.        
1f50: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50  if( NULL != getP
1f60: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1f80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
1f90: 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c 69 62  .        FreeLib
1fa0: 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a  rary(hinstLib);.
1fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1fd0: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1fe0: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2000: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
2010: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
2020: 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73  mer && getProces
2030: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
2040: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65    FILETIME ftCre
2050: 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20  ation, ftExit;. 
2060: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2070: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2080: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2090: 78 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xit,.           
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 66 74               &ft
20b0: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55  KernelBegin,&ftU
20c0: 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66  serBegin);.    f
20d0: 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d  tWallBegin = tim
20e0: 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a  eOfDay();.  }.}.
20f0: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  ./* Return the d
2100: 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f  ifference of two
2110: 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
2120: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
2130: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
2140: 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20  meDiff(FILETIME 
2150: 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d  *pStart, FILETIM
2160: 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69  E *pEnd){.  sqli
2170: 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72  te_int64 i64Star
2180: 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e  t = *((sqlite_in
2190: 74 36 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a  t64 *) pStart);.
21a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
21b0: 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74  64End = *((sqlit
21c0: 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29  e_int64 *) pEnd)
21d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62  ;.  return (doub
21e0: 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69  le) ((i64End - i
21f0: 36 34 53 74 61 72 74 29 20 2f 20 31 30 30 30 30  64Start) / 10000
2200: 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  000.0);.}../*.**
2210: 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e   Print the timin
2220: 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  g results..*/.st
2230: 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d  atic void endTim
2240: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
2250: 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67  enableTimer && g
2260: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
2270: 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d  dr){.    FILETIM
2280: 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74  E ftCreation, ft
2290: 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e  Exit, ftKernelEn
22a0: 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20  d, ftUserEnd;.  
22b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22c0: 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65  ftWallEnd = time
22d0: 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74  OfDay();.    get
22e0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
22f0: 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65  (hProcess,&ftCre
2300: 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66  ation,&ftExit,&f
2310: 74 4b 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73  tKernelEnd,&ftUs
2320: 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e  erEnd);.    prin
2330: 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65  tf("Run Time: re
2340: 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66 20  al %.3f user %f 
2350: 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20  sys %f\n",.     
2360: 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66    (ftWallEnd - f
2370: 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30  tWallBegin)*0.00
2380: 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  1,.       timeDi
2390: 66 66 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c  ff(&ftUserBegin,
23a0: 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20   &ftUserEnd),.  
23b0: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 66       timeDiff(&f
23c0: 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66  tKernelBegin, &f
23d0: 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20  tKernelEnd));.  
23e0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
23f0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
2400: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
2410: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
2420: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
2430: 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a  IMER hasTimer().
2440: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42  .#else.#define B
2450: 45 47 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69  EGIN_TIMER.#defi
2460: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65  ne END_TIMER.#de
2470: 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30  fine HAS_TIMER 0
2480: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
2490: 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77  sed to prevent w
24a0: 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e  arnings about un
24b0: 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a  used parameters.
24c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45  */.#define UNUSE
24d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28  D_PARAMETER(x) (
24e0: 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20  void)(x)../*.** 
24f0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
2500: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2510: 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  en command execu
2520: 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20 61 74  tion stops.** at
2530: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20   an error if we 
2540: 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61 63 74  are not interact
2550: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
2560: 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72  nt bail_on_error
2570: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 72   = 0;../*.** Thr
2580: 65 61 74 20 73 74 64 69 6e 20 61 73 20 61 6e 20  eat stdin as an 
2590: 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75  interactive inpu
25a0: 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t if the followi
25b0: 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ng variable.** i
25c0: 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69  s true.  Otherwi
25d0: 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64 69 6e  se, assume stdin
25e0: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
25f0: 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70 65 2e   a file or pipe.
2600: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2610: 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
2620: 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20  ive = 1;../*.** 
2630: 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  On Windows syste
2640: 6d 73 20 77 65 20 68 61 76 65 20 74 6f 20 6b 6e  ms we have to kn
2650: 6f 77 20 69 66 20 73 74 61 6e 64 61 72 64 20 6f  ow if standard o
2660: 75 74 70 75 74 20 69 73 20 61 20 63 6f 6e 73 6f  utput is a conso
2670: 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  le.** in order t
2680: 6f 20 74 72 61 6e 73 6c 61 74 65 20 55 54 46 2d  o translate UTF-
2690: 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20 20 54 68  8 into MBCS.  Th
26a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
26b0: 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72 75 65 20  able is.** true 
26c0: 69 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  if translation i
26d0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
26e0: 74 61 74 69 63 20 69 6e 74 20 73 74 64 6f 75 74  tatic int stdout
26f0: 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20 31 3b  _is_console = 1;
2700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2710: 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65  owing is the ope
2720: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
2730: 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f  e.  We make a po
2740: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  inter.** to this
2750: 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61 74   database a stat
2760: 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74  ic variable so t
2770: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61 63  hat it can be ac
2780: 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  cessed.** by the
2790: 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20   SIGINT handler 
27a0: 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61 74  to interrupt dat
27b0: 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67  abase processing
27c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
27d0: 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20 3d 20  te3 *globalDb = 
27e0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69  0;../*.** True i
27f0: 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 28  f an interrupt (
2800: 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73 20 62  Control-C) has b
2810: 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a 2a 2f  een received..*/
2820: 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65  .static volatile
2830: 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72 75   int seenInterru
2840: 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  pt = 0;../*.** T
2850: 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65 20  his is the name 
2860: 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20  of our program. 
2870: 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61 69  It is set in mai
2880: 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n(), used.** in 
2890: 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65  a number of othe
28a0: 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79  r places, mostly
28b0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
28c0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
28d0: 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a  har *Argv0;../*.
28e0: 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e 67  ** Prompt string
28f0: 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 69  s. Initialized i
2900: 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c 65  n main. Settable
2910: 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d   with.**   .prom
2920: 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65  pt main continue
2930: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
2940: 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  mainPrompt[20]; 
2950: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e      /* First lin
2960: 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  e prompt. defaul
2970: 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a  t: "sqlite> "*/.
2980: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 74  static char cont
2990: 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  inuePrompt[20]; 
29a0: 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  /* Continuation 
29b0: 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a  prompt. default:
29c0: 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a   "   ...> " */..
29d0: 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74  /*.** Render out
29e0: 70 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66  put like fprintf
29f0: 28 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ().  Except, if 
2a00: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
2a10: 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ing to the.** co
2a20: 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20 74 68 69  nsole and if thi
2a30: 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e 20  s is running on 
2a40: 61 20 57 69 6e 64 6f 77 73 20 6d 61 63 68 69 6e  a Windows machin
2a50: 65 2c 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65  e, translate the
2a60: 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  .** output from 
2a70: 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e  UTF-8 into MBCS.
2a80: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2a90: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
2aa0: 65 64 28 57 49 4e 33 32 29 0a 76 6f 69 64 20 75  ed(WIN32).void u
2ab0: 74 66 38 5f 70 72 69 6e 74 66 28 46 49 4c 45 20  tf8_printf(FILE 
2ac0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
2ad0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2ae0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2af0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2b00: 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 73 74  ormat);.  if( st
2b10: 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20  dout_is_console 
2b20: 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f 75 74 20  && (out==stdout 
2b30: 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72 72 29 20  || out==stderr) 
2b40: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 31 20  ){.    char *z1 
2b50: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
2b60: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2b70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 32 20 3d 20  .    char *z2 = 
2b80: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
2b90: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 7a 31  f8_to_mbcs_v2(z1
2ba0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2bb0: 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20 20 20 20  3_free(z1);.    
2bc0: 66 70 75 74 73 28 7a 32 2c 20 6f 75 74 29 3b 0a  fputs(z2, out);.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2be0: 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (z2);.  }else{. 
2bf0: 20 20 20 76 66 70 72 69 6e 74 66 28 6f 75 74 2c     vfprintf(out,
2c00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
2c10: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
2c20: 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  .}.#elif !define
2c30: 64 28 75 74 66 38 5f 70 72 69 6e 74 66 29 0a 23  d(utf8_printf).#
2c40: 20 64 65 66 69 6e 65 20 75 74 66 38 5f 70 72 69   define utf8_pri
2c50: 6e 74 66 20 66 70 72 69 6e 74 66 0a 23 65 6e 64  ntf fprintf.#end
2c60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72  if../*.** Render
2c70: 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72   output like fpr
2c80: 69 6e 74 66 28 29 2e 20 20 54 68 69 73 20 73 68  intf().  This sh
2c90: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
2ca0: 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61   on anything tha
2cb0: 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73 20 73 74  t.** includes st
2cc0: 72 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20  ring formatting 
2cd0: 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a 2a 2f 0a  (e.g. "%s")..*/.
2ce0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 72 61 77  #if !defined(raw
2cf0: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2d00: 65 20 72 61 77 5f 70 72 69 6e 74 66 20 66 70 72  e raw_printf fpr
2d10: 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  intf.#endif../*.
2d20: 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61  ** Write I/O tra
2d30: 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ces to the follo
2d40: 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  wing stream..*/.
2d50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d60: 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61  ABLE_IOTRACE.sta
2d70: 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63  tic FILE *iotrac
2d80: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
2d90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2da0: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69  e works like pri
2db0: 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20  ntf in that its 
2dc0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2dd0: 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74  s a.** format st
2de0: 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75  ring and subsequ
2df0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ent arguments ar
2e00: 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73  e values to be s
2e10: 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e  ubstituted.** in
2e20: 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c   place of % fiel
2e30: 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  ds.  The result 
2e40: 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68  of formatting th
2e50: 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  is string.** is 
2e60: 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61  written to iotra
2e70: 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ce..*/.#ifdef SQ
2e80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
2e90: 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ACE.static void 
2ea0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 69 6f 74  SQLITE_CDECL iot
2eb0: 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74  racePrintf(const
2ec0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2ed0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2ee0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
2ef0: 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
2f00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
2f10: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2f20: 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
2f30: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2f40: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2f50: 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (ap);.  utf8_pri
2f60: 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73  ntf(iotrace, "%s
2f70: 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", z);.  sqlite3
2f80: 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64  _free(z);.}.#end
2f90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  if../*.** Output
2fa0: 20 73 74 72 69 6e 67 20 7a 55 74 66 20 74 6f 20   string zUtf to 
2fb0: 73 74 72 65 61 6d 20 70 4f 75 74 20 61 73 20 77  stream pOut as w
2fc0: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
2fd0: 20 77 20 69 73 20 6e 65 67 61 74 69 76 65 2c 0a   w is negative,.
2fe0: 2a 2a 20 74 68 65 6e 20 72 69 67 68 74 2d 6a 75  ** then right-ju
2ff0: 73 74 69 66 79 20 74 68 65 20 74 65 78 74 2e 20  stify the text. 
3000: 20 57 20 69 73 20 74 68 65 20 77 69 64 74 68 20   W is the width 
3010: 69 6e 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  in UTF-8 charact
3020: 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e 20 62  ers, not.** in b
3030: 79 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 64  ytes.  This is d
3040: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
3050: 65 20 25 2a 2e 2a 73 20 73 70 65 63 69 66 69 63  e %*.*s specific
3060: 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74 66 0a  ation in printf.
3070: 2a 2a 20 73 69 6e 63 65 20 77 69 74 68 20 25 2a  ** since with %*
3080: 2e 2a 73 20 74 68 65 20 77 69 64 74 68 20 69 73  .*s the width is
3090: 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74   measured in byt
30a0: 65 73 2c 20 6e 6f 74 20 63 68 61 72 61 63 74 65  es, not characte
30b0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
30c0: 69 64 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72  id utf8_width_pr
30d0: 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  int(FILE *pOut, 
30e0: 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63 68 61  int w, const cha
30f0: 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e 74 20  r *zUtf){.  int 
3100: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  i;.  int n;.  in
3110: 74 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d 77 20  t aw = w<0 ? -w 
3120: 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  : w;.  char zBuf
3130: 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 61 77  [1000];.  if( aw
3140: 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75  >(int)sizeof(zBu
3150: 66 29 2f 33 20 29 20 61 77 20 3d 20 28 69 6e 74  f)/3 ) aw = (int
3160: 29 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33 3b  )sizeof(zBuf)/3;
3170: 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 55  .  for(i=n=0; zU
3180: 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  tf[i]; i++){.   
3190: 20 69 66 28 20 28 7a 55 74 66 5b 69 5d 26 30 78   if( (zUtf[i]&0x
31a0: 63 30 29 21 3d 30 78 38 30 20 29 7b 0a 20 20 20  c0)!=0x80 ){.   
31b0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66     n++;.      if
31c0: 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20 20 20 20  ( n==aw ){.     
31d0: 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d 77 68 69     do{ i++; }whi
31e0: 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63  le( (zUtf[i]&0xc
31f0: 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20 20 20  0)==0x80 );.    
3200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3210: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
3220: 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20 20 20 20  f( n>=aw ){.    
3230: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3240: 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 55 74  , "%.*s", i, zUt
3250: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
3260: 77 3c 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  w<0 ){.    utf8_
3270: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 2a  printf(pOut, "%*
3280: 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22 22 2c 20  s%s", aw-n, "", 
3290: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zUtf);.  }else{.
32a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32b0: 70 4f 75 74 2c 20 22 25 73 25 2a 73 22 2c 20 7a  pOut, "%s%*s", z
32c0: 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22 29 3b 0a  Utf, aw-n, "");.
32d0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65    }.}.../*.** De
32e0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
32f0: 72 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72  ring is a number
3300: 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   of not..*/.stat
3310: 69 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28  ic int isNumber(
3320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
3330: 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20  nt *realnum){.  
3340: 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a  if( *z=='-' || *
3350: 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20  z=='+' ) z++;.  
3360: 69 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29  if( !IsDigit(*z)
3370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3380: 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69  ;.  }.  z++;.  i
3390: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
33a0: 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69  alnum = 0;.  whi
33b0: 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20  le( IsDigit(*z) 
33c0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20  ){ z++; }.  if( 
33d0: 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a  *z=='.' ){.    z
33e0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
33f0: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3400: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3410: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3420: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3430: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3440: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
3450: 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='e' || *z=='
3460: 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  E' ){.    z++;. 
3470: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c     if( *z=='+' |
3480: 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  | *z=='-' ) z++;
3490: 0a 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69  .    if( !IsDigi
34a0: 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  t(*z) ) return 0
34b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44  ;.    while( IsD
34c0: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
34d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e   }.    if( realn
34e0: 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20  um ) *realnum = 
34f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3500: 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *z==0;.}../*.** 
3510: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
3520: 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20   length that is 
3530: 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20  limited to what 
3540: 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
3550: 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74  .** lower 30 bit
3560: 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69  s of a 32-bit si
3570: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  gned integer..*/
3580: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3590: 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20  en30(const char 
35a0: 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z){.  const cha
35b0: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69  r *z2 = z;.  whi
35c0: 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b  le( *z2 ){ z2++;
35d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66   }.  return 0x3f
35e0: 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a  ffffff & (int)(z
35f0: 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2 - z);.}../*.**
3600: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
3610: 74 68 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  th of a string i
3620: 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 4d  n characters.  M
3630: 75 6c 74 69 62 79 74 65 20 55 54 46 38 20 63 68  ultibyte UTF8 ch
3640: 61 72 61 63 74 65 72 73 0a 2a 2a 20 63 6f 75 6e  aracters.** coun
3650: 74 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68  t as a single ch
3660: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
3670: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 43 68 61  ic int strlenCha
3680: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  r(const char *z)
3690: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
36a0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
36b0: 20 20 69 66 28 20 28 30 78 63 30 26 2a 28 7a 2b    if( (0xc0&*(z+
36c0: 2b 29 29 21 3d 30 78 38 30 20 29 20 6e 2b 2b 3b  +))!=0x80 ) n++;
36d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
36e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
36f0: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
3700: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
3710: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
3720: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
3730: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
3740: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
3750: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
3760: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
3770: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
3780: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
3790: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
37a0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
37b0: 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73  *.** If zLine is
37c0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
37d0: 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20  t is a malloced 
37e0: 62 75 66 66 65 72 20 72 65 74 75 72 6e 65 64 20  buffer returned 
37f0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f  from.** a previo
3800: 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  us call to this 
3810: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 79  routine that may
3820: 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73   be reused..*/.s
3830: 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61  tatic char *loca
3840: 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a  l_getline(char *
3850: 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29  zLine, FILE *in)
3860: 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20  {.  int nLine = 
3870: 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31  zLine==0 ? 0 : 1
3880: 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  00;.  int n = 0;
3890: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
38a0: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
38b0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
38c0: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
38d0: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
38e0: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
38f0: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
3900: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
3910: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
3920: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
3930: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
3940: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
3950: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
3960: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
3970: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3980: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
3990: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
39a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
39b0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
39c0: 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20  Line[n] ) n++;. 
39d0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
39e0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
39f0: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
3a00: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
3a10: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29  ine[n-1]=='\r' )
3a20: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
3a30: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3a50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
3a60: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
3a70: 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f 72 20  WIN32).  /* For 
3a80: 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75  interactive inpu
3a90: 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73  t on Windows sys
3aa0: 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74 65 20  tems, translate 
3ab0: 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69 2d 62  the.  ** multi-b
3ac0: 79 74 65 20 63 68 61 72 61 63 74 65 72 73 65 74  yte characterset
3ad0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
3ae0: 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69 66 28   UTF-8. */.  if(
3af0: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
3b00: 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73 74 64  ctive && in==std
3b10: 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  in ){.    char *
3b20: 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74 65 33  zTrans = sqlite3
3b30: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
3b40: 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20 30 29  tf8_v2(zLine, 0)
3b50: 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61 6e 73  ;.    if( zTrans
3b60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ){.      int nT
3b70: 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33 30 28  rans = strlen30(
3b80: 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20 20 20  zTrans)+1;.     
3b90: 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c 69 6e   if( nTrans>nLin
3ba0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  e ){.        zLi
3bb0: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3bc0: 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20  ne, nTrans);.   
3bd0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
3bf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61  qlite3_free(zTra
3c00: 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ns);.          r
3c10: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3c20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3c30: 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a   memcpy(zLine, z
3c40: 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a  Trans, nTrans);.
3c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3c60: 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20  ee(zTrans);.    
3c70: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
3c80: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
3c90: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
3ca0: 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c  ) */.  return zL
3cb0: 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ine;.}../*.** Re
3cc0: 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20  trieve a single 
3cd0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65  line of input te
3ce0: 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d  xt..**.** If in=
3cf0: 3d 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f  =0 then read fro
3d00: 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  m standard input
3d10: 20 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f   and prompt befo
3d20: 72 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a  re each line..**
3d30: 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69   If isContinuati
3d40: 6f 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  on is true, then
3d50: 20 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   a continuation 
3d60: 70 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70  prompt is approp
3d70: 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43  riate..** If isC
3d80: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a  ontinuation is z
3d90: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ero, then the ma
3da0: 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64  in prompt should
3db0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
3dc0: 49 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74  If zPrior is not
3dd0: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
3de0: 20 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61   a buffer from a
3df0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
3e00: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  his.** routine t
3e10: 68 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65  hat can be reuse
3e20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  d..**.** The res
3e30: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
3e40: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
3e50: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
3e60: 64 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a  d must either.**
3e70: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
3e80: 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20   caller or else 
3e90: 70 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f  passed back into
3ea0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
3eb0: 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20  a the.** zPrior 
3ec0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75  argument for reu
3ed0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
3ee0: 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69  ar *one_input_li
3ef0: 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61  ne(FILE *in, cha
3f00: 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69  r *zPrior, int i
3f10: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a  sContinuation){.
3f20: 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b    char *zPrompt;
3f30: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
3f40: 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b  ;.  if( in!=0 ){
3f50: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c  .    zResult = l
3f60: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72  ocal_getline(zPr
3f70: 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73  ior, in);.  }els
3f80: 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  e{.    zPrompt =
3f90: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   isContinuation 
3fa0: 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  ? continuePrompt
3fb0: 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23   : mainPrompt;.#
3fc0: 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43  if SHELL_USE_LOC
3fd0: 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70  AL_GETLINE.    p
3fe0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f  rintf("%s", zPro
3ff0: 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  mpt);.    fflush
4000: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52  (stdout);.    zR
4010: 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65  esult = local_ge
4020: 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74  tline(zPrior, st
4030: 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  din);.#else.    
4040: 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20  free(zPrior);.  
4050: 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c    zResult = shel
4060: 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d  l_readline(zProm
4070: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  pt);.    if( zRe
4080: 73 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74  sult && *zResult
4090: 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73   ) shell_add_his
40a0: 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23  tory(zResult);.#
40b0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
40c0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 2f 2a  rn zResult;.}./*
40d0: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
40e0: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
40f0: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4100: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
4110: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
4120: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
4130: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
4140: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
4150: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
4160: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4170: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4180: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4190: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
41a0: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
41b0: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
41c0: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
41d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
41e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
41f0: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4200: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
4210: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
4220: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
4230: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
4240: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
4250: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
4260: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4270: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4280: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4290: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
42a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
42b0: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
42c0: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
42d0: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
42e0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
42f0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4300: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4310: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4320: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4330: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4340: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4350: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4360: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4370: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4380: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
43a0: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
43b0: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
43c0: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
43d0: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
43e0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
43f0: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4400: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4410: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4420: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4430: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4440: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4450: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4470: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4480: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4490: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
44a0: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
44b0: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
44c0: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
44d0: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
44e0: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
44f0: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4500: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a   if( p->z==0 ){.
4510: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
4520: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4530: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4540: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71    }.  }..  if( q
4550: 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72  uote ){.    char
4560: 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70 2d   *zCsr = p->z+p-
4570: 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20  >n;.    *zCsr++ 
4580: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72  = quote;.    for
4590: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
45a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43   i++){.      *zC
45b0: 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69  sr++ = zAppend[i
45c0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ];.      if( zAp
45d0: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
45e0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73  ;.    }.    *zCs
4600: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
4610: 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 43   p->n = (int)(zC
4620: 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20 20  sr - p->z);.    
4630: 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20  *zCsr = '\0';.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70  }else{.    memcp
4650: 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41 70  y(p->z+p->n, zAp
4660: 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  pend, nAppend);.
4670: 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70 70      p->n += nApp
4680: 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  end;.    p->z[p-
4690: 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  >n] = '\0';.  }.
46a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
46b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
46c0: 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61 6d   identifier zNam
46d0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71 75  e needs to be qu
46e0: 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a 20  oted, either.** 
46f0: 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61  because it conta
4700: 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d  ins non-alphanum
4710: 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 2c  eric characters,
4720: 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 69   or because it i
4730: 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 6b  s an.** SQLite k
4740: 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e 73  eyword.  Be cons
4750: 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69 73  ervative in this
4760: 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65 6e   estimate:  When
4770: 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d 65   in doubt assume
4780: 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e 67  .** that quoting
4790: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
47a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20 69  .** Return '"' i
47b0: 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71  f quoting is req
47c0: 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20 30  uired.  Return 0
47d0: 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20 69   if no quoting i
47e0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
47f0: 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74 65  tatic char quote
4800: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
4810: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 41 6c  *zName){.  /* Al
4820: 6c 20 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64  l SQLite keyword
4830: 73 2c 20 69 6e 20 61 6c 70 68 61 62 65 74 69 63  s, in alphabetic
4840: 61 6c 20 6f 72 64 65 72 20 2a 2f 0a 20 20 73 74  al order */.  st
4850: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4860: 2a 61 7a 4b 65 79 77 6f 72 64 73 5b 5d 20 3d 20  *azKeywords[] = 
4870: 7b 0a 20 20 20 20 22 41 42 4f 52 54 22 2c 20 22  {.    "ABORT", "
4880: 41 43 54 49 4f 4e 22 2c 20 22 41 44 44 22 2c 20  ACTION", "ADD", 
4890: 22 41 46 54 45 52 22 2c 20 22 41 4c 4c 22 2c 20  "AFTER", "ALL", 
48a0: 22 41 4c 54 45 52 22 2c 20 22 41 4e 41 4c 59 5a  "ALTER", "ANALYZ
48b0: 45 22 2c 20 22 41 4e 44 22 2c 20 22 41 53 22 2c  E", "AND", "AS",
48c0: 0a 20 20 20 20 22 41 53 43 22 2c 20 22 41 54 54  .    "ASC", "ATT
48d0: 41 43 48 22 2c 20 22 41 55 54 4f 49 4e 43 52 45  ACH", "AUTOINCRE
48e0: 4d 45 4e 54 22 2c 20 22 42 45 46 4f 52 45 22 2c  MENT", "BEFORE",
48f0: 20 22 42 45 47 49 4e 22 2c 20 22 42 45 54 57 45   "BEGIN", "BETWE
4900: 45 4e 22 2c 20 22 42 59 22 2c 0a 20 20 20 20 22  EN", "BY",.    "
4910: 43 41 53 43 41 44 45 22 2c 20 22 43 41 53 45 22  CASCADE", "CASE"
4920: 2c 20 22 43 41 53 54 22 2c 20 22 43 48 45 43 4b  , "CAST", "CHECK
4930: 22 2c 20 22 43 4f 4c 4c 41 54 45 22 2c 20 22 43  ", "COLLATE", "C
4940: 4f 4c 55 4d 4e 22 2c 20 22 43 4f 4d 4d 49 54 22  OLUMN", "COMMIT"
4950: 2c 0a 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 22  ,.    "CONFLICT"
4960: 2c 20 22 43 4f 4e 53 54 52 41 49 4e 54 22 2c 20  , "CONSTRAINT", 
4970: 22 43 52 45 41 54 45 22 2c 20 22 43 52 4f 53 53  "CREATE", "CROSS
4980: 22 2c 20 22 43 55 52 52 45 4e 54 5f 44 41 54 45  ", "CURRENT_DATE
4990: 22 2c 0a 20 20 20 20 22 43 55 52 52 45 4e 54 5f  ",.    "CURRENT_
49a0: 54 49 4d 45 22 2c 20 22 43 55 52 52 45 4e 54 5f  TIME", "CURRENT_
49b0: 54 49 4d 45 53 54 41 4d 50 22 2c 20 22 44 41 54  TIMESTAMP", "DAT
49c0: 41 42 41 53 45 22 2c 20 22 44 45 46 41 55 4c 54  ABASE", "DEFAULT
49d0: 22 2c 20 22 44 45 46 45 52 52 41 42 4c 45 22 2c  ", "DEFERRABLE",
49e0: 0a 20 20 20 20 22 44 45 46 45 52 52 45 44 22 2c  .    "DEFERRED",
49f0: 20 22 44 45 4c 45 54 45 22 2c 20 22 44 45 53 43   "DELETE", "DESC
4a00: 22 2c 20 22 44 45 54 41 43 48 22 2c 20 22 44 49  ", "DETACH", "DI
4a10: 53 54 49 4e 43 54 22 2c 20 22 44 52 4f 50 22 2c  STINCT", "DROP",
4a20: 20 22 45 41 43 48 22 2c 0a 20 20 20 20 22 45 4c   "EACH",.    "EL
4a30: 53 45 22 2c 20 22 45 4e 44 22 2c 20 22 45 53 43  SE", "END", "ESC
4a40: 41 50 45 22 2c 20 22 45 58 43 45 50 54 22 2c 20  APE", "EXCEPT", 
4a50: 22 45 58 43 4c 55 53 49 56 45 22 2c 20 22 45 58  "EXCLUSIVE", "EX
4a60: 49 53 54 53 22 2c 20 22 45 58 50 4c 41 49 4e 22  ISTS", "EXPLAIN"
4a70: 2c 0a 20 20 20 20 22 46 41 49 4c 22 2c 20 22 46  ,.    "FAIL", "F
4a80: 4f 52 22 2c 20 22 46 4f 52 45 49 47 4e 22 2c 20  OR", "FOREIGN", 
4a90: 22 46 52 4f 4d 22 2c 20 22 46 55 4c 4c 22 2c 20  "FROM", "FULL", 
4aa0: 22 47 4c 4f 42 22 2c 20 22 47 52 4f 55 50 22 2c  "GLOB", "GROUP",
4ab0: 20 22 48 41 56 49 4e 47 22 2c 20 22 49 46 22 2c   "HAVING", "IF",
4ac0: 0a 20 20 20 20 22 49 47 4e 4f 52 45 22 2c 20 22  .    "IGNORE", "
4ad0: 49 4d 4d 45 44 49 41 54 45 22 2c 20 22 49 4e 22  IMMEDIATE", "IN"
4ae0: 2c 20 22 49 4e 44 45 58 22 2c 20 22 49 4e 44 45  , "INDEX", "INDE
4af0: 58 45 44 22 2c 20 22 49 4e 49 54 49 41 4c 4c 59  XED", "INITIALLY
4b00: 22 2c 20 22 49 4e 4e 45 52 22 2c 0a 20 20 20 20  ", "INNER",.    
4b10: 22 49 4e 53 45 52 54 22 2c 20 22 49 4e 53 54 45  "INSERT", "INSTE
4b20: 41 44 22 2c 20 22 49 4e 54 45 52 53 45 43 54 22  AD", "INTERSECT"
4b30: 2c 20 22 49 4e 54 4f 22 2c 20 22 49 53 22 2c 20  , "INTO", "IS", 
4b40: 22 49 53 4e 55 4c 4c 22 2c 20 22 4a 4f 49 4e 22  "ISNULL", "JOIN"
4b50: 2c 20 22 4b 45 59 22 2c 0a 20 20 20 20 22 4c 45  , "KEY",.    "LE
4b60: 46 54 22 2c 20 22 4c 49 4b 45 22 2c 20 22 4c 49  FT", "LIKE", "LI
4b70: 4d 49 54 22 2c 20 22 4d 41 54 43 48 22 2c 20 22  MIT", "MATCH", "
4b80: 4e 41 54 55 52 41 4c 22 2c 20 22 4e 4f 22 2c 20  NATURAL", "NO", 
4b90: 22 4e 4f 54 22 2c 20 22 4e 4f 54 4e 55 4c 4c 22  "NOT", "NOTNULL"
4ba0: 2c 0a 20 20 20 20 22 4e 55 4c 4c 22 2c 20 22 4f  ,.    "NULL", "O
4bb0: 46 22 2c 20 22 4f 46 46 53 45 54 22 2c 20 22 4f  F", "OFFSET", "O
4bc0: 4e 22 2c 20 22 4f 52 22 2c 20 22 4f 52 44 45 52  N", "OR", "ORDER
4bd0: 22 2c 20 22 4f 55 54 45 52 22 2c 20 22 50 4c 41  ", "OUTER", "PLA
4be0: 4e 22 2c 20 22 50 52 41 47 4d 41 22 2c 0a 20 20  N", "PRAGMA",.  
4bf0: 20 20 22 50 52 49 4d 41 52 59 22 2c 20 22 51 55    "PRIMARY", "QU
4c00: 45 52 59 22 2c 20 22 52 41 49 53 45 22 2c 20 22  ERY", "RAISE", "
4c10: 52 45 43 55 52 53 49 56 45 22 2c 20 22 52 45 46  RECURSIVE", "REF
4c20: 45 52 45 4e 43 45 53 22 2c 20 22 52 45 47 45 58  ERENCES", "REGEX
4c30: 50 22 2c 0a 20 20 20 20 22 52 45 49 4e 44 45 58  P",.    "REINDEX
4c40: 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
4c50: 45 4e 41 4d 45 22 2c 20 22 52 45 50 4c 41 43 45  ENAME", "REPLACE
4c60: 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c 20 22  ", "RESTRICT", "
4c70: 52 49 47 48 54 22 2c 0a 20 20 20 20 22 52 4f 4c  RIGHT",.    "ROL
4c80: 4c 42 41 43 4b 22 2c 20 22 52 4f 57 22 2c 20 22  LBACK", "ROW", "
4c90: 53 41 56 45 50 4f 49 4e 54 22 2c 20 22 53 45 4c  SAVEPOINT", "SEL
4ca0: 45 43 54 22 2c 20 22 53 45 54 22 2c 20 22 54 41  ECT", "SET", "TA
4cb0: 42 4c 45 22 2c 20 22 54 45 4d 50 22 2c 0a 20 20  BLE", "TEMP",.  
4cc0: 20 20 22 54 45 4d 50 4f 52 41 52 59 22 2c 20 22    "TEMPORARY", "
4cd0: 54 48 45 4e 22 2c 20 22 54 4f 22 2c 20 22 54 52  THEN", "TO", "TR
4ce0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 22 54 52 49  ANSACTION", "TRI
4cf0: 47 47 45 52 22 2c 20 22 55 4e 49 4f 4e 22 2c 20  GGER", "UNION", 
4d00: 22 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 22 55  "UNIQUE",.    "U
4d10: 50 44 41 54 45 22 2c 20 22 55 53 49 4e 47 22 2c  PDATE", "USING",
4d20: 20 22 56 41 43 55 55 4d 22 2c 20 22 56 41 4c 55   "VACUUM", "VALU
4d30: 45 53 22 2c 20 22 56 49 45 57 22 2c 20 22 56 49  ES", "VIEW", "VI
4d40: 52 54 55 41 4c 22 2c 20 22 57 48 45 4e 22 2c 20  RTUAL", "WHEN", 
4d50: 22 57 48 45 52 45 22 2c 0a 20 20 20 20 22 57 49  "WHERE",.    "WI
4d60: 54 48 22 2c 20 22 57 49 54 48 4f 55 54 22 2c 0a  TH", "WITHOUT",.
4d70: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6c 77    };.  int i, lw
4d80: 72 2c 20 75 70 72 2c 20 6d 69 64 2c 20 63 3b 0a  r, upr, mid, c;.
4d90: 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 28    if( !isalpha((
4da0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4e  unsigned char)zN
4db0: 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e 61 6d 65  ame[0]) && zName
4dc0: 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65 74 75 72  [0]!='_' ) retur
4dd0: 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30  n '"';.  for(i=0
4de0: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
4df0: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
4e00: 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  um((unsigned cha
4e10: 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a  r)zName[i]) && z
4e20: 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 72  Name[i]!='_' ) r
4e30: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 7d 0a 20  eturn '"';.  }. 
4e40: 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70 72 20   lwr = 0;.  upr 
4e50: 3d 20 73 69 7a 65 6f 66 28 61 7a 4b 65 79 77 6f  = sizeof(azKeywo
4e60: 72 64 73 29 2f 73 69 7a 65 6f 66 28 61 7a 4b 65  rds)/sizeof(azKe
4e70: 79 77 6f 72 64 73 5b 30 5d 29 20 2d 20 31 3b 0a  ywords[0]) - 1;.
4e80: 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70    while( lwr<=up
4e90: 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20 28  r ){.    mid = (
4ea0: 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
4eb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 69  c = sqlite3_stri
4ec0: 63 6d 70 28 61 7a 4b 65 79 77 6f 72 64 73 5b 6d  cmp(azKeywords[m
4ed0: 69 64 5d 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  id], zName);.   
4ee0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
4ef0: 72 6e 20 27 22 27 3b 0a 20 20 20 20 69 66 28 20  rn '"';.    if( 
4f00: 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 6c 77 72  c<0 ){.      lwr
4f10: 20 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 65   = mid+1;.    }e
4f20: 6c 73 65 7b 0a 20 20 20 20 20 20 75 70 72 20 3d  lse{.      upr =
4f30: 20 6d 69 64 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   mid-1;.    }.  
4f40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4f50: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
4f60: 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f  ion:  shell_add_
4f70: 73 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a  schema(S,X).**.*
4f80: 2a 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61  * Add the schema
4f90: 20 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43   name X to the C
4fa0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
4fb0: 69 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20  in S and return 
4fc0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45  the result..** E
4fd0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
4fe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4ff0: 31 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41  1(x)   ->   CREA
5000: 54 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28  TE TABLE xyz.t1(
5010: 78 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77  x);.**.** Also w
5020: 6f 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  orks on.**.**   
5030: 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a   CREATE INDEX.**
5040: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
5050: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5060: 45 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20  EATE VIEW.**    
5070: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a  CREATE TRIGGER.*
5080: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  *    CREATE VIRT
5090: 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20  UAL TABLE.**.** 
50a0: 54 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64  This UDF is used
50b0: 20 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20   by the .schema 
50c0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72  command to inser
50d0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  t the schema nam
50e0: 65 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  e of.** attached
50f0: 20 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20   databases into 
5100: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5110: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  e sqlite_master.
5120: 73 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  sql field..*/.st
5130: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41  atic void shellA
5140: 64 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20  ddSchemaName(.  
5150: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5160: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
5170: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
5180: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
5190: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
51a0: 72 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b  r *aPrefix[] = {
51b0: 0a 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20  .     "TABLE",. 
51c0: 20 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20      "INDEX",.   
51d0: 20 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22    "UNIQUE INDEX"
51e0: 2c 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20  ,.     "VIEW",. 
51f0: 20 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20      "TRIGGER",. 
5200: 20 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42      "VIRTUAL TAB
5210: 4c 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  LE".  };.  int i
5220: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
5230: 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ar *zIn = (const
5240: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5250: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5260: 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0]);.  const cha
5270: 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f  r *zSchema = (co
5280: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5290: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
52a0: 61 6c 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74  al[1]);.  assert
52b0: 28 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20 69  ( nVal==2 );.  i
52c0: 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74 72  f( zIn!=0 && str
52d0: 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41 54  ncmp(zIn, "CREAT
52e0: 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  E ", 7)==0 ){.  
52f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e    for(i=0; i<(in
5300: 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66 69  t)(sizeof(aPrefi
5310: 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66 69  x)/sizeof(aPrefi
5320: 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  x[0])); i++){.  
5330: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
5340: 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d 29  en30(aPrefix[i])
5350: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
5360: 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65 66  cmp(zIn+7, aPref
5370: 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26 20  ix[i], n)==0 && 
5380: 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b  zIn[n+7]==' ' ){
5390: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 51  .        char cQ
53a0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
53b0: 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  (zSchema);.     
53c0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
53d0: 20 20 20 20 69 66 28 20 63 51 75 6f 74 65 20 29      if( cQuote )
53e0: 7b 0a 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73  {.         z = s
53f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5400: 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c  %.*s \"%w\".%s",
5410: 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65   n+7, zIn, zSche
5420: 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20  ma, zIn+n+8);.  
5430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5440: 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74         z = sqlit
5450: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73  e3_mprintf("%.*s
5460: 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49   %s.%s", n+7, zI
5470: 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b  n, zSchema, zIn+
5480: 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+8);.        }.
5490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
54a0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
54b0: 2c 20 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  , z, -1, sqlite3
54c0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  _free);.        
54d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
54e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
54f0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
5500: 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29  (pCtx, apVal[0])
5510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
5520: 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 73  ource code for s
5530: 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d 65 20  everal run-time 
5540: 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69  loadable extensi
5550: 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65 64 0a  ons is inserted.
5560: 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68 65 20  ** below by the 
5570: 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c 6c 63  ../tool/mkshellc
5580: 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20 42 65  .tcl script.  Be
5590: 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20  fore processing 
55a0: 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a 2a 2a  that included.**
55b0: 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64 20 74   code, we need t
55c0: 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20  o override some 
55d0: 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65 20 74  macros to make t
55e0: 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72 6f 67  he included prog
55f0: 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f 72 6b  ram code.** work
5600: 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d 69 64   here in the mid
5610: 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65 67 75  dle of this regu
5620: 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  lar program..*/.
5630: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45  #define SQLITE_E
5640: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23  XTENSION_INIT1.#
5650: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
5660: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 58 29  TENSION_INIT2(X)
5670: 20 28 76 6f 69 64 29 28 58 29 0a 0a 49 4e 43 4c   (void)(X)..INCL
5680: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
5690: 73 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55  shathree.c.INCLU
56a0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66  DE ../ext/misc/f
56b0: 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20  ileio.c.INCLUDE 
56c0: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70  ../ext/misc/comp
56d0: 6c 65 74 69 6f 6e 2e 63 0a 23 69 66 64 65 66 20  letion.c.#ifdef 
56e0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
56f0: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
5700: 6d 69 73 63 2f 63 6f 6d 70 72 65 73 73 2e 63 0a  misc/compress.c.
5710: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
5720: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
5730: 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
5740: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
5750: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
5760: 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f 0a  open session.*/.
5770: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4f  typedef struct O
5780: 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e 53  penSession OpenS
5790: 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20 4f  ession;.struct O
57a0: 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20 63  penSession {.  c
57b0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
57c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
57d0: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  lic name for thi
57e0: 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  s session */.  i
57f0: 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20 20  nt nFilter;     
5800: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5810: 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  r of xFilter rej
5820: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
5830: 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  erns */.  char *
5840: 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20 20  *azFilter;      
5850: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 78     /* Array of x
5860: 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e  Filter rejection
5870: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a   GLOB patterns *
5880: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  /.  sqlite3_sess
5890: 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a 20  ion *p;      /* 
58a0: 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  The open session
58b0: 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f   */.};.#endif../
58c0: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
58d0: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
58e0: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
58f0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a 2a  .explain on",.**
5900: 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20 69   saved so that i
5910: 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  t can be restore
5920: 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20 6f  d by ".explain o
5930: 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ff".*/.typedef s
5940: 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49  truct SavedModeI
5950: 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e 66  nfo SavedModeInf
5960: 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64 4d  o;.struct SavedM
5970: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  odeInfo {.  int 
5980: 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  valid;          
5990: 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69  /* Is there legi
59a0: 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20  t data in here? 
59b0: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
59c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
59d0: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
59e0: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
59f0: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
5a00: 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65 72   /* The ".header
5a10: 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72 20  " setting prior 
5a20: 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  to ".explain on"
5a30: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64   */.  int colWid
5a40: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f 6c  th[100];  /* Col
5a50: 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f 72  umn widths prior
5a60: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
5a70: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  " */.};../*.** S
5a80: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
5a90: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
5aa0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
5ab0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
5ac0: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
5ad0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
5ae0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
5af0: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
5b00: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
5b10: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
5b20: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
5b30: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
5b40: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
5b50: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45 78 70  */.  int autoExp
5b60: 6c 61 69 6e 3b 20 20 20 20 20 20 20 2f 2a 20 41  lain;       /* A
5b70: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
5b80: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
5b90: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  de */.  int auto
5ba0: 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 2f  EQP;           /
5bb0: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
5bc0: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
5bd0: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
5be0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 73 4f   */.  int statsO
5bf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
5c00: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
5c10: 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66  memory stats bef
5c20: 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a  ore each finaliz
5c30: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 63 61 6e 73  e */.  int scans
5c40: 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 2f 2a  tatsOn;       /*
5c50: 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79   True to display
5c60: 20 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f   scan stats befo
5c70: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
5c80: 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43 6f 75   */.  int outCou
5c90: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
5ca0: 52 65 76 65 72 74 20 74 6f 20 73 74 64 6f 75 74  Revert to stdout
5cb0: 20 77 68 65 6e 20 72 65 61 63 68 69 6e 67 20 7a   when reaching z
5cc0: 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ero */.  int cnt
5cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ce0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
5cf0: 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20 73  ords displayed s
5d00: 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20  o far */.  FILE 
5d10: 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  *out;           
5d20: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
5d30: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 46 49 4c  ts here */.  FIL
5d40: 45 20 2a 74 72 61 63 65 4f 75 74 3b 20 20 20 20  E *traceOut;    
5d50: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6f      /* Output fo
5d60: 72 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  r sqlite3_trace(
5d70: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  ) */.  int nErr;
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
5da0: 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
5db0: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
5dc0: 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74 20     /* An output 
5dd0: 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f 0a  mode setting */.
5de0: 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20    int cMode;    
5df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70           /* temp
5e00: 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64  orary output mod
5e10: 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  e for the curren
5e20: 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  t query */.  int
5e30: 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20   normalMode;    
5e40: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f      /* Output mo
5e50: 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c  de before ".expl
5e60: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
5e70: 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b   writableSchema;
5e80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50      /* True if P
5e90: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
5ea0: 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e  chema=ON */.  in
5eb0: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
5ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
5ed0: 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  show column name
5ee0: 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c  s in List or Col
5ef0: 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e  umn mode */.  in
5f00: 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20  t nCheck;       
5f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5f20: 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61  f ".check" comma
5f30: 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73  nds run */.  uns
5f40: 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b  igned shellFlgs;
5f50: 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
5f60: 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lags */.  char *
5f70: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
5f80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
5f90: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
5fa0: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
5fb0: 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74 63 61  /.  char zTestca
5fc0: 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20 4e 61  se[30];    /* Na
5fd0: 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  me of current te
5fe0: 73 74 20 63 61 73 65 20 2a 2f 0a 20 20 63 68 61  st case */.  cha
5ff0: 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 32  r colSeparator[2
6000: 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65  0]; /* Column se
6010: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
6020: 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20 6d 6f  r for several mo
6030: 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f  des */.  char ro
6040: 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20  wSeparator[20]; 
6050: 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74 6f 72  /* Row separator
6060: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 4d   character for M
6070: 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20 20 69  ODE_Ascii */.  i
6080: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
6090: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
60a0: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
60b0: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
60c0: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
60d0: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
60e0: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
60f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
6100: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
6110: 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20  nullValue[20];  
6120: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
6130: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
6140: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
6150: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
6160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
6170: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
6180: 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49   char outfile[FI
6190: 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20  LENAME_MAX]; /* 
61a0: 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75  Filename for *ou
61b0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
61c0: 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20  r *zDbFilename; 
61d0: 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
61e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
61f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65  */.  char *zFree
6200: 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20  OnClose;        
6210: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20   /* Filename to 
6220: 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e  free when closin
6230: 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
6240: 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20  r *zVfs;        
6250: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
6260: 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71  S to use */.  sq
6270: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
6280: 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  t;   /* Current 
6290: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79  statement if any
62a0: 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f  . */.  FILE *pLo
62b0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
62c0: 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75   Write log outpu
62d0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
62e0: 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20  *aiIndent;      
62f0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69     /* Array of i
6300: 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d  ndents used in M
6310: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20  ODE_Explain */. 
6320: 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20   int nIndent;   
6330: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
6340: 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e  of array aiInden
6350: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  t[] */.  int iIn
6360: 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  dent;           
6370: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72  /* Index of curr
6380: 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65  ent op in aiInde
6390: 6e 74 5b 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69  nt[] */.#if defi
63a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
63b0: 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74  E_SESSION).  int
63c0: 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20   nSession;      
63d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
63e0: 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73 69   of active sessi
63f0: 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73  ons */.  OpenSes
6400: 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d  sion aSession[4]
6410: 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73  ;  /* Array of s
6420: 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73  essions.  [0] is
6430: 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65   in focus. */.#e
6440: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
6450: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
6460: 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73 20 76  owed shellFlgs v
6470: 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  alues.*/.#define
6480: 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
6490: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31        0x00000001
64a0: 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65 63 61   /* The --pageca
64b0: 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  che option is us
64c0: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
64d0: 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 20 20  FLG_Lookaside   
64e0: 20 20 20 30 78 30 30 30 30 30 30 30 32 20 2f 2a     0x00000002 /*
64f0: 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   Lookaside memor
6500: 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  y is used */.#de
6510: 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63 6b 73  fine SHFLG_Backs
6520: 6c 61 73 68 20 20 20 20 20 20 30 78 30 30 30 30  lash      0x0000
6530: 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d 62 61  0004 /* The --ba
6540: 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e 20 69  ckslash option i
6550: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
6560: 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  e SHFLG_Preserve
6570: 52 6f 77 69 64 20 20 30 78 30 30 30 30 30 30 30  Rowid  0x0000000
6580: 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65 73 65  8 /* .dump prese
6590: 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c 75 65  rves rowid value
65a0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  s */.#define SHF
65b0: 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20 20 20  LG_Newlines     
65c0: 20 20 30 78 30 30 30 30 30 30 31 30 20 2f 2a 20    0x00000010 /* 
65d0: 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e 65 20  .dump --newline 
65e0: 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  flag */.#define 
65f0: 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67  SHFLG_CountChang
6600: 65 73 20 20 20 30 78 30 30 30 30 30 30 32 30 20  es   0x00000020 
6610: 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65 74 74  /* .changes sett
6620: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ing */.#define S
6630: 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20 20 20  HFLG_Echo       
6640: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 2f      0x00000040 /
6650: 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65 63 68  * .echo or --ech
6660: 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a 2f 2a  o setting */../*
6670: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
6680: 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74 74 69  esting and setti
6690: 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a 2f 0a  ng shellFlgs.*/.
66a0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48 61 73  #define ShellHas
66b0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 28  Flag(P,X)    (((
66c0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  P)->shellFlgs & 
66d0: 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65  (X))!=0).#define
66e0: 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 50 2c   ShellSetFlag(P,
66f0: 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68 65 6c  X)    ((P)->shel
6700: 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64 65 66  lFlgs|=(X)).#def
6710: 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c  ine ShellClearFl
6720: 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d 3e 73  ag(P,X)  ((P)->s
6730: 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58 29 29  hellFlgs&=(~(X))
6740: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  )../*.** These a
6750: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
6760: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
6770: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
6780: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
6790: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
67a0: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
67b0: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
67c0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
67d0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
67e0: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
67f0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
6800: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
6810: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
6820: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
6830: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
6840: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
6850: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
6860: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
6870: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
6880: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
6890: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
68a0: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
68b0: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
68c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
68d0: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
68e0: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
68f0: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
6900: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
6910: 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f 2a 20  _Quote    6  /* 
6920: 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61 73 20  Quote values as 
6930: 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69  for SQL */.#defi
6940: 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20  ne MODE_Tcl     
6950: 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   7  /* Generate 
6960: 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75  ANSI-C or TCL qu
6970: 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  oted elements */
6980: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73  .#define MODE_Cs
6990: 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51 75 6f  v      8  /* Quo
69a0: 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62  te strings, numb
69b0: 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f  ers are plain */
69c0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78  .#define MODE_Ex
69d0: 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c 69 6b  plain  9  /* Lik
69e0: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62  e MODE_Column, b
69f0: 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61  ut do not trunca
6a00: 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65 66 69  te data */.#defi
6a10: 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20 20 20  ne MODE_Ascii   
6a20: 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43 49 49  10  /* Use ASCII
6a30: 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f 72 64   unit and record
6a40: 20 73 65 70 61 72 61 74 6f 72 73 20 28 30 78 31   separators (0x1
6a50: 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65 66 69  F/0x1E) */.#defi
6a60: 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 20  ne MODE_Pretty  
6a70: 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72  11  /* Pretty-pr
6a80: 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f 0a 0a  int schemas */..
6a90: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6aa0: 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d 20 3d  r *modeDescr[] =
6ab0: 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20 22   {.  "line",.  "
6ac0: 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73 74  column",.  "list
6ad0: 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20 22  ",.  "semi",.  "
6ae0: 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72 74  html",.  "insert
6af0: 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a 20 20  ",.  "quote",.  
6b00: 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a  "tcl",.  "csv",.
6b10: 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20 22    "explain",.  "
6b20: 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65 74 74  ascii",.  "prett
6b30: 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f 2a 0a  yprint",.};../*.
6b40: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
6b50: 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65   column/row/line
6b60: 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64   separators used
6b70: 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a   by the various.
6b80: 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74  ** import/export
6b90: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
6ba0: 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20  ne SEP_Column   
6bb0: 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   "|".#define SEP
6bc0: 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a  _Row       "\n".
6bd0: 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20  #define SEP_Tab 
6be0: 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69        "\t".#defi
6bf0: 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20  ne SEP_Space    
6c00: 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50   " ".#define SEP
6c10: 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23  _Comma     ",".#
6c20: 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20  define SEP_CrLf 
6c30: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66       "\r\n".#def
6c40: 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20  ine SEP_Unit    
6c50: 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65    "\x1F".#define
6c60: 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22   SEP_Record    "
6c70: 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  \x1E"../*.** Num
6c80: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6c90: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
6ca0: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
6cb0: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
6cc0: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
6cd0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  ))../*.** A call
6ce0: 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
6cf0: 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72  ite3_log() inter
6d00: 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
6d10: 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f  void shellLog(vo
6d20: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45  id *pArg, int iE
6d30: 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68  rrCode, const ch
6d40: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65  ar *zMsg){.  She
6d50: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
6d60: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
6d70: 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30    if( p->pLog==0
6d80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66   ) return;.  utf
6d90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67  8_printf(p->pLog
6da0: 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69  , "(%d) %s\n", i
6db0: 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a  ErrCode, zMsg);.
6dc0: 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67    fflush(p->pLog
6dd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
6de0: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
6df0: 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63  ing as a hex-enc
6e00: 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58  oded blob (eg. X
6e10: 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74  '1234' ).*/.stat
6e20: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
6e30: 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75  ex_blob(FILE *ou
6e40: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
6e50: 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29  Blob, int nBlob)
6e60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
6e70: 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72  r *zBlob = (char
6e80: 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f   *)pBlob;.  raw_
6e90: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
6ea0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
6eb0: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f  Blob; i++){ raw_
6ec0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78  printf(out,"%02x
6ed0: 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29  ",zBlob[i]&0xff)
6ee0: 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ; }.  raw_printf
6ef0: 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a  (out,"'");.}../*
6f00: 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e  .** Find a strin
6f10: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f  g that is not fo
6f20: 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20  und anywhere in 
6f30: 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70  z[].  Return a p
6f40: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
6f50: 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  t string..**.** 
6f60: 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e  Try to use zA an
6f70: 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20  d zB first.  If 
6f80: 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72  both of those ar
6f90: 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20  e already found 
6fa0: 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d  in z[].** then m
6fb0: 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69  ake up some stri
6fc0: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  ng and store it 
6fd0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a 42  in the buffer zB
6fe0: 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  uf..*/.static co
6ff0: 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64  nst char *unused
7000: 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  _string(.  const
7010: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7030: 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20  Result must not 
7040: 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20  appear anywhere 
7050: 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in z */.  const 
7060: 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20  char *zA, const 
7070: 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54  char *zB,   /* T
7080: 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20 2a  ry these first *
7090: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20  /.  char *zBuf  
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
70c0: 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61  o store a genera
70d0: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ted string */.){
70e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20  .  unsigned i = 
70f0: 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  0;.  if( strstr(
7100: 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75  z, zA)==0 ) retu
7110: 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72  rn zA;.  if( str
7120: 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20  str(z, zB)==0 ) 
7130: 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b  return zB;.  do{
7140: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
7150: 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28  rintf(20,zBuf,"(
7160: 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29  %s%u)", zA, i++)
7170: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73  ;.  }while( strs
7180: 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b  tr(z,zBuf)!=0 );
7190: 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a  .  return zBuf;.
71a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
71b0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
71c0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
71d0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
71e0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
71f0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
7200: 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  o: output_quoted
7210: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
7220: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
7230: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
7240: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
7250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
7260: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
7270: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
7280: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
7290: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
72a0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
72b0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
72c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
72d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
72e0: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
72f0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
7300: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69  t, "'");.    whi
7310: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
7320: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
7330: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
7340: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
7350: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
7360: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
7370: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
7380: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
7390: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
73a0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
73b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
73c0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
73d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
73e0: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
73f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
7400: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
7410: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
7430: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  +;.    }.    raw
7440: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
7450: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74  );.  }.  setText
7460: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
7470: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
7480: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
7490: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
74a0: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
74b0: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
74c0: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c  .** Additionalll
74d0: 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20 22  y , escape the "
74e0: 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61  \n" and "\r" cha
74f0: 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74 20  racters so that 
7500: 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67  they do not.** g
7510: 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  et corrupted by 
7520: 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e  end-of-line tran
7530: 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69  slation faciliti
7540: 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61  es in some opera
7550: 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
7560: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c  .**.** This is l
7570: 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  ike output_quote
7580: 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20 77  d_string() but w
7590: 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
75a0: 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20   of the \r\n.** 
75b0: 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d  escape mechanism
75c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75d0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
75e0: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49  scaped_string(FI
75f0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
7600: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
7610: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
7620: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
7630: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
7640: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
7650: 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27   c!='\'' && c!='
7660: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20  \n' && c!='\r'; 
7670: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
7680: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
7690: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
76a0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
76b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c   const char *zNL
76c0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
76d0: 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20  char *zCR = 0;. 
76e0: 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
76f0: 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b      int nCR = 0;
7700: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b  .    char zBuf1[
7710: 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a  20], zBuf2[20];.
7720: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
7730: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
7740: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
7750: 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nNL++;.      if(
7760: 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43   z[i]=='\r' ) nC
7770: 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  R++;.    }.    i
7780: 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20  f( nNL ){.      
7790: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
77a0: 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20  "replace(");.   
77b0: 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f     zNL = unused_
77c0: 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c  string(z, "\\n",
77d0: 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
77e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
77f0: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
7800: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65  _printf(out, "re
7810: 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20  place(");.      
7820: 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
7830: 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c  ing(z, "\\r", "\
7840: 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20  \015", zBuf2);. 
7850: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
7860: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
7870: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
7880: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
7890: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
78a0: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
78b0: 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  r' && c!='\''; i
78c0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
78d0: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
78e0: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
78f0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
7900: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
7910: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
7920: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
7930: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
7950: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
7960: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7970: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
7980: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
7990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
79a0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
79b0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
79c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
79d0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
79e0: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20  , zNL);.        
79f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7a00: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
7a10: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43  tf(out, "%s", zC
7a20: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  R);.    }.    ra
7a30: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
7a40: 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20  ");.    if( nCR 
7a50: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
7a60: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
7a70: 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29  char(13))", zCR)
7a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7a90: 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nNL ){.      raw
7aa0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
7ab0: 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20  %s',char(10))", 
7ac0: 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  zNL);.    }.  }.
7ad0: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75    setTextMode(ou
7ae0: 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 1);.}../*.** 
7af0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
7b00: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
7b10: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
7b20: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
7b30: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
7b40: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
7b50: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
7b60: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
7b70: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
7b80: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
7b90: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
7ba0: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
7bb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
7bc0: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
7bd0: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
7be0: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
7bf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
7c00: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66  =='"' ){.      f
7c10: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
7c20: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22 27  .      fputc('"'
7c30: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
7c40: 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b  e if( c=='\t' ){
7c50: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
7c60: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
7c70: 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a  putc('t', out);.
7c80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
7c90: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\n' ){.      f
7ca0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
7cb0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e 27  .      fputc('n'
7cc0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
7cd0: 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b  e if( c=='\r' ){
7ce0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
7cf0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
7d00: 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a  putc('r', out);.
7d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
7d20: 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20 29  sprint(c&0xff) )
7d30: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
7d40: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
7d50: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
7d60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
7d70: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
7d80: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
7d90: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
7da0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
7db0: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
7dc0: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
7dd0: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
7de0: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
7df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
7e00: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
7e10: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
7e20: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
7e30: 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   i;.  if( z==0 )
7e40: 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65   z = "";.  while
7e50: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( *z ){.    for(
7e60: 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20  i=0;   z[i].    
7e70: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
7e80: 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='<'.           
7e90: 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20   && z[i]!='&'.  
7ea0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
7eb0: 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20  ]!='>'.         
7ec0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27     && z[i]!='\"'
7ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
7ee0: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20  z[i]!='\'';.    
7ef0: 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69      i++){}.    i
7f00: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
7f10: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
7f20: 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20  "%.*s",i,z);.   
7f30: 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d   }.    if( z[i]=
7f40: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='<' ){.      ra
7f50: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c  w_printf(out,"&l
7f60: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
7f70: 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b  if( z[i]=='&' ){
7f80: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
7f90: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
7fa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
7fb0: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
7fc0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
7fd0: 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&gt;");.    }el
7fe0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22  se if( z[i]=='\"
7ff0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
8000: 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74  rintf(out,"&quot
8010: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
8020: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
8030: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8040: 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a  f(out,"&#39;");.
8050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8070: 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20    z += i + 1;.  
8080: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  }.}../*.** If a 
8090: 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61  field contains a
80a0: 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64 65  ny character ide
80b0: 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20 69  ntified by a 1 i
80c0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
80d0: 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74  ** array, then t
80e0: 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62  he string must b
80f0: 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56  e quoted for CSV
8100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8110: 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51 75  t char needCsvQu
8120: 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31  ote[] = {.  1, 1
8130: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8140: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
8150: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
8160: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8170: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
8180: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8190: 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20  ,.  1, 0, 1, 0, 
81a0: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c  0, 0, 0, 1,   0,
81b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
81c0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
81d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
81e0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
81f0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
8200: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8210: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
8220: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
8230: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8240: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
8250: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8260: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
8270: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
8280: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8290: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
82a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
82b0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
82c0: 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31   0, 0, 1,.  1, 1
82d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
82e0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
82f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
8300: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8310: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
8320: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8330: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
8340: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
8350: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8360: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
8370: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8380: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8390: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
83a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
83b0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
83c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
83d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
83e0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
83f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8400: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
8410: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
8420: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8430: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
8440: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8450: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8460: 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a   1, 1, 1,.};../*
8470: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e  .** Output a sin
8480: 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e  gle term of CSV.
8490: 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63    Actually, p->c
84a0: 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20 75  olSeparator is u
84b0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
84c0: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
84d0: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
84e0: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
84f0: 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullValue is.** t
8500: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
8510: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
8520: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
8530: 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a    The separator.
8540: 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65  ** is only issue
8550: 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72 75  d if bSep is tru
8560: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
8570: 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65  d output_csv(She
8580: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
8590: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62  t char *z, int b
85a0: 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  Sep){.  FILE *ou
85b0: 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66  t = p->out;.  if
85c0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( z==0 ){.    ut
85d0: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
85e0: 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  s",p->nullValue)
85f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
8600: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nt i;.    int nS
8610: 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
8620: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
8630: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
8640: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
8650: 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  f( needCsvQuote[
8660: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
8670: 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20  )z)[i]].        
8680: 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f   || (z[i]==p->co
8690: 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  lSeparator[0] &&
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
86b0: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
86c0: 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  (z, p->colSepara
86d0: 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20  tor, nSep)==0)) 
86e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30  ){.        i = 0
86f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8710: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
8720: 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
8730: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ed = sqlite3_mpr
8740: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
8750: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
8760: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
8770: 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20  zQuoted);.      
8780: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
8790: 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oted);.    }else
87a0: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
87b0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
87c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
87d0: 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75  f( bSep ){.    u
87e0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
87f0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
8800: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
8810: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8820: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
8830: 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20  he user presses 
8840: 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63  Ctrl-C.*/.static
8850: 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f   void interrupt_
8860: 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55  handler(int NotU
8870: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
8880: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
8890: 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75  );.  seenInterru
88a0: 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e  pt++;.  if( seen
88b0: 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65 78  Interrupt>2 ) ex
88c0: 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f  it(1);.  if( glo
88d0: 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f  balDb ) sqlite3_
88e0: 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c  interrupt(global
88f0: 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66  Db);.}..#if (def
8900: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
8910: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
8920: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  && !defined(_WIN
8930: 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68  32_WCE)./*.** Th
8940: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
8950: 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e  for console even
8960: 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29  ts (e.g. Ctrl-C)
8970: 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61   on Win32.*/.sta
8980: 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  tic BOOL WINAPI 
8990: 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c  ConsoleCtrlHandl
89a0: 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74  er(.  DWORD dwCt
89b0: 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66  rlType /* One of
89c0: 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e   the CTRL_*_EVEN
89d0: 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29  T constants */.)
89e0: 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54 79  {.  if( dwCtrlTy
89f0: 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54  pe==CTRL_C_EVENT
8a00: 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70   ){.    interrup
8a10: 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20  t_handler(0);.  
8a20: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
8a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
8a40: 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E;.}.#endif..#if
8a50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a60: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
8a70: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e  *.** When the ".
8a80: 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c  auth ON" is set,
8a90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
8aa0: 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61  uthorizer callba
8ab0: 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ck is.** invoked
8ac0: 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
8ad0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
8ae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
8af0: 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20  ellAuth(.  void 
8b00: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  *pClientData,.  
8b10: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
8b20: 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e  char *zA1,.  con
8b30: 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20  st char *zA2,.  
8b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c  const char *zA3,
8b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b60: 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  A4.){.  ShellSta
8b70: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
8b80: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
8b90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8ba0: 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b   char *azAction[
8bb0: 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43  ] = { 0,.     "C
8bc0: 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20  REATE_INDEX",   
8bd0: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 41        "CREATE_TA
8be0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22 43  BLE",         "C
8bf0: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
8c00: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
8c10: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
8c20: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  "CREATE_TEMP_TRI
8c30: 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f  GGER",  "CREATE_
8c40: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
8c50: 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45 52   "CREATE_TRIGGER
8c60: 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ",       "CREATE
8c70: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
8c80: 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20   "DELETE",.     
8c90: 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20  "DROP_INDEX",   
8ca0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41          "DROP_TA
8cb0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  BLE",           
8cc0: 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  "DROP_TEMP_INDEX
8cd0: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",.     "DROP_TE
8ce0: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  MP_TABLE",      
8cf0: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  "DROP_TEMP_TRIGG
8d00: 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45  ER",    "DROP_TE
8d10: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
8d20: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20  DROP_TRIGGER",  
8d30: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45         "DROP_VIE
8d40: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  W",            "
8d50: 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50  INSERT",.     "P
8d60: 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20  RAGMA",         
8d70: 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20 20        "READ",   
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
8d90: 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52  ELECT",.     "TR
8da0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20  ANSACTION",     
8db0: 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 20       "UPDATE",  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 54               "AT
8dd0: 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54  TACH",.     "DET
8de0: 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACH",           
8df0: 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45      "ALTER_TABLE
8e00: 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45 49  ",          "REI
8e10: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41  NDEX",.     "ANA
8e20: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
8e30: 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41 42      "CREATE_VTAB
8e40: 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f  LE",        "DRO
8e50: 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20  P_VTABLE",.     
8e60: 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20  "FUNCTION",     
8e70: 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49          "SAVEPOI
8e80: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
8e90: 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b  "RECURSIVE".  };
8ea0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
8eb0: 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20  t char *az[4];. 
8ec0: 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20   az[0] = zA1;.  
8ed0: 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61  az[1] = zA2;.  a
8ee0: 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a  z[2] = zA3;.  az
8ef0: 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66  [3] = zA4;.  utf
8f00: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
8f10: 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73   "authorizer: %s
8f20: 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29  ", azAction[op])
8f30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34  ;.  for(i=0; i<4
8f40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f  ; i++){.    raw_
8f50: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
8f60: 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b   ");.    if( az[
8f70: 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i] ){.      outp
8f80: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
8f90: 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ut, az[i]);.    
8fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
8fb0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
8fc0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
8fd0: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
8fe0: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
8ff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9000: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
9010: 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d  ** Print a schem
9020: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61  a statement.  Pa
9030: 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20  rt of MODE_Semi 
9040: 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20  and MODE_Pretty 
9050: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
9060: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65  is routine conve
9070: 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20  rts some CREATE 
9080: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
9090: 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c   for shadow tabl
90a0: 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f  es.** in FTS3/4/
90b0: 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41  5 into CREATE TA
90c0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
90d0: 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  S statements..*/
90e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
90f0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c  ntSchemaLine(FIL
9100: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
9110: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
9120: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28  r *zTail){.  if(
9130: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
9140: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b  ("CREATE TABLE [
9150: 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  '\"]*", z)==0 ){
9160: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
9170: 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54 41  (out, "CREATE TA
9180: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
9190: 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a  S %s%s", z+13, z
91a0: 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tail);.  }else{.
91b0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
91c0: 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20  out, "%s%s", z, 
91d0: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74  zTail);.  }.}.st
91e0: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
91f0: 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20  chemaLineN(FILE 
9200: 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69  *out, char *z, i
9210: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
9220: 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72   *zTail){.  char
9230: 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e   c = z[n];.  z[n
9240: 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63  ] = 0;.  printSc
9250: 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c  hemaLine(out, z,
9260: 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20   zTail);.  z[n] 
9270: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = c;.}../*.** Th
9280: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
9290: 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ck routine that 
92a0: 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76  the shell.** inv
92b0: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
92c0: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
92d0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
92e0: 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  nt shell_callbac
92f0: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  k(.  void *pArg,
9300: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
9310: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9320: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
9330: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
9340: 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  g,    /* Text of
9350: 20 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c   each result col
9360: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  umn */.  char **
9370: 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  azCol,    /* Col
9380: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
9390: 6e 74 20 2a 61 69 54 79 70 65 20 20 20 20 20 20  nt *aiType      
93a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20  /* Column types 
93b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
93c0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
93d0: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
93e0: 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67  rg;..  if( azArg
93f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9400: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f    switch( p->cMo
9410: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d  de ){.    case M
9420: 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20  ODE_Line: {.    
9430: 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20    int w = 5;.   
9440: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
9450: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
9460: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
9470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
9480: 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30  t len = strlen30
9490: 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  (azCol[i] ? azCo
94a0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
94b0: 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20      if( len>w ) 
94c0: 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  w = len;.      }
94d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
94e0: 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69  t++>0 ) utf8_pri
94f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
9500: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
9510: 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r);.      for(i=
9520: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
9530: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
9540: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73  intf(p->out,"%*s
9550: 20 3d 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43   = %s%s", w, azC
9560: 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  ol[i],.         
9570: 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20         azArg[i] 
9580: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
9590: 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f  nullValue, p->ro
95a0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
95b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
95c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
95d0: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20   MODE_Explain:. 
95e0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c     case MODE_Col
95f0: 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  umn: {.      sta
9600: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45  tic const int aE
9610: 78 70 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d  xplainWidths[] =
9620: 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34   {4, 13, 4, 4, 4
9630: 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20  , 13, 2, 13};.  
9640: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63      const int *c
9650: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69  olWidth;.      i
9660: 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20  nt showHdr;.    
9670: 20 20 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a    char *rowSep;.
9680: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f        if( p->cMo
9690: 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20  de==MODE_Column 
96a0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69  ){.        colWi
96b0: 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74  dth = p->colWidt
96c0: 68 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48  h;.        showH
96d0: 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64  dr = p->showHead
96e0: 65 72 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53  er;.        rowS
96f0: 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72  ep = p->rowSepar
9700: 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ator;.      }els
9710: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69  e{.        colWi
9720: 64 74 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69  dth = aExplainWi
9730: 64 74 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68  dths;.        sh
9740: 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20  owHdr = 1;.     
9750: 20 20 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f     rowSep = SEP_
9760: 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Row;.      }.   
9770: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
9780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  =0 ){.        fo
9790: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
97a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
97b0: 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt w, n;.       
97c0: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
97d0: 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20  ze(p->colWidth) 
97e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
97f0: 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a   = colWidth[i];.
9800: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
9820: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
9830: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3d            if( w=
9840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9850: 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    w = strlenChar
9860: 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  (azCol[i] ? azCo
9870: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
9880: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 31 30          if( w<10
9890: 20 29 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20   ) w = 10;.     
98a0: 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
98b0: 6e 43 68 61 72 28 61 7a 41 72 67 20 26 26 20 61  nChar(azArg && a
98c0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
98d0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
98e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
98f0: 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b  if( w<n ) w = n;
9900: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9910: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
9920: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
9930: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
9940: 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57        p->actualW
9950: 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20  idth[i] = w;.   
9960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9970: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
9980: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
9990: 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70  f8_width_print(p
99a0: 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b  ->out, w, azCol[
99b0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
99c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
99d0: 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41  out, "%s", i==nA
99e0: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
99f0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
9a00: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9a10: 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72       if( showHdr
9a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
9a30: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
9a40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9a50: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
9a60: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
9a70: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
9a80: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
9a90: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
9aa0: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9ac0: 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20  w<0 ) w = -w;.  
9ad0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9af0: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
9b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9b10: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
9b20: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
9b30: 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  w,w,.           
9b40: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b80: 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20  ---".           
9b90: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
9ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bd0: 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ---",.          
9be0: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
9bf0: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
9c00: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
9c10: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9c20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
9c30: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
9c40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9c50: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
9c60: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
9c70: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
9c80: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
9c90: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
9ca0: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
9cb0: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
9cc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9cd0: 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20     w = 10;.     
9ce0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
9cf0: 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f   p->cMode==MODE_
9d00: 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67  Explain && azArg
9d10: 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61  [i] && strlenCha
9d20: 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b  r(azArg[i])>w ){
9d30: 0a 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73  .          w = s
9d40: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
9d50: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
9d60: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20         if( i==1 
9d70: 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26  && p->aiIndent &
9d80: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
9d90: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
9da0: 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e  Indent<p->nInden
9db0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
9dc0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
9dd0: 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e  out, "%*.s", p->
9de0: 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64  aiIndent[p->iInd
9df0: 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20  ent], "");.     
9e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9e10: 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20   p->iIndent++;. 
9e20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9e30: 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e   utf8_width_prin
9e40: 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41  t(p->out, w, azA
9e50: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
9e60: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
9e70: 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
9e80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
9e90: 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  s", i==nArg-1 ? 
9ea0: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
9eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9ec0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9ed0: 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b  ase MODE_Semi: {
9ee0: 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e     /* .schema an
9ef0: 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75  d .fullschema ou
9f00: 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72  tput */.      pr
9f10: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
9f20: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  >out, azArg[0], 
9f30: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ";\n");.      br
9f40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9f50: 61 73 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a  ase MODE_Pretty:
9f60: 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61   {  /* .schema a
9f70: 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77  nd .fullschema w
9f80: 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a  ith --indent */.
9f90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
9fa0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9fb0: 20 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30    int nParen = 0
9fc0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 45 6e  ;.      char cEn
9fd0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  d = 0;.      cha
9fe0: 72 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r c;.      int n
9ff0: 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Line = 0;.      
a000: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
a010: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  );.      if( azA
a020: 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b  rg[0]==0 ) break
a030: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
a040: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
a050: 41 54 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72  ATE VIEW%", azAr
a060: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
a070: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74     || sqlite3_st
a080: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 54 52  rlike("CREATE TR
a090: 49 47 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  IG%", azArg[0], 
a0a0: 30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  0)==0.      ){. 
a0b0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a0c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c  tf(p->out, "%s;\
a0d0: 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
a0e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20      }.      z = 
a100: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a110: 22 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  "%s", azArg[0]);
a120: 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
a130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53      for(i=0; IsS
a140: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
a150: 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28  {}.      for(; (
a160: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
a170: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a180: 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
a190: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d          if( z[j-
a1a0: 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31  1]=='\r' ) z[j-1
a1b0: 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ] = '\n';.      
a1c0: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
a1d0: 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31  z[j-1]) || z[j-1
a1e0: 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='(' ) continu
a1f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
a200: 20 69 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20   if( (c=='(' || 
a210: 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26  c==')') && j>0 &
a220: 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  & IsSpace(z[j-1]
a230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) ){.          j
a240: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
a250: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63        z[j++] = c
a260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a270: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73  while( j>0 && Is
a280: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
a290: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b   j--; }.      z[
a2a0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  j] = 0;.      if
a2b0: 28 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37  ( strlen30(z)>=7
a2c0: 39 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  9 ){.        for
a2d0: 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  (i=j=0; (c = z[i
a2e0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
a2f0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45         if( c==cE
a300: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
a310: 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20    cEnd = 0;.    
a320: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a330: 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27  c=='"' || c=='\'
a340: 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20  ' || c=='`' ){. 
a350: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
a360: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = c;.          }
a370: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
a380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
a390: 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20  End = ']';.     
a3a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a3b0: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
a3c0: 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20       nParen++;. 
a3d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
a3e0: 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20  f( c==')' ){.   
a3f0: 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d           nParen-
a400: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  -;.            i
a410: 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50  f( nLine>0 && nP
a420: 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29  aren==0 && j>0 )
a430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a440: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
a450: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
a460: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
a470: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
a480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
a4a0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  [j++] = c;.     
a4b0: 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d       if( nParen=
a4c0: 3d 31 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c  =1 && (c=='(' ||
a4d0: 20 63 3d 3d 27 2c 27 20 7c 7c 20 63 3d 3d 27 5c   c==',' || c=='\
a4e0: 6e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n') ){.         
a4f0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
a500: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20   j--;.          
a510: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
a520: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
a530: 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20   "\n  ");.      
a540: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
a550: 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b           nLine++
a560: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
a570: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69  ile( IsSpace(z[i
a580: 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  +1]) ){ i++; }. 
a590: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
a5b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
a5c0: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
a5d0: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  Line(p->out, z, 
a5e0: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  ";\n");.      sq
a5f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
a600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a610: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
a620: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
a630: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
a640: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
a650: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
a660: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
a670: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
a680: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a690: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  s%s",azCol[i],. 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e   i==nArg-1 ? p->
a6c0: 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70  rowSeparator : p
a6d0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
a6e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
a700: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
a710: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a720: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
a730: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
a740: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
a750: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
a760: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20  ->nullValue;.   
a770: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
a780: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
a790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
a7a0: 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20  <nArg-1 ){.     
a7b0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
a7c0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
a7d0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
a7e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a7f0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
a800: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
a810: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
a820: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
a830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a850: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
a860: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
a870: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
a880: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
a890: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
a8a0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
a8b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a8c0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
a8d0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a8e0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
a8f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
a900: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
a910: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
a920: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
a930: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
a940: 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TH>\n");.      
a950: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
a960: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
a970: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
a980: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
a990: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
a9a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
a9b0: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
a9c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a9d0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
a9e0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
a9f0: 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20  ->out,"<TD>");. 
aa00: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
aa10: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
aa20: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
aa30: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
aa40: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72  alue);.        r
aa50: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
aa60: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
aa70: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
aa80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
aa90: 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  TR>\n");.      b
aaa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
aab0: 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b  case MODE_Tcl: {
aac0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
aad0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
aae0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
aaf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
ab00: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
ab10: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
ab20: 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c  ing(p->out,azCol
ab30: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ab40: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
ab50: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
ab60: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ab70: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ab80: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
ab90: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
aba0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
abb0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
abc0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
abd0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
abe0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
abf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
ac00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ac10: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
ac20: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
ac30: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
ac40: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
ac50: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
ac60: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
ac70: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
ac80: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
aca0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
acb0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
acc0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
acd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ace0: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
acf0: 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
ad00: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
ad10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
ad20: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
ad30: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
ad40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ad50: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ad60: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
ad70: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
ad80: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
ad90: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
ada0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
adb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
adc0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
add0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ade0: 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a    if( nArg>0 ){.
adf0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
ae00: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ae10: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
ae20: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
ae30: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
ae40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
ae50: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ae60: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
ae70: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
ae80: 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74 4d  }.      setTextM
ae90: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
aea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aeb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
aec0: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
aed0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
aee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66  break;.      utf
aef0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
af00: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22  "INSERT INTO %s"
af10: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
af20: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
af30: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
af40: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
af50: 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20  ->out,"(");.    
af60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
af70: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
af80: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
af90: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
afa0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
afb0: 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72 28    if( quoteChar(
afc0: 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  azCol[i]) ){.   
afd0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
afe0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
aff0: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43  tf("\"%w\"", azC
b000: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
b010: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b020: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
b030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
b040: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
b050: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b060: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
b070: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b080: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
b090: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
b0b0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b0c0: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
b0d0: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
b0e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b0f0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
b100: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
b110: 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20  >out, i>0 ? "," 
b120: 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20  : " VALUES(");. 
b130: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
b140: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
b150: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
b160: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
b170: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
b180: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
b190: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
b1a0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
b1b0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
b1c0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
b1d0: 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65 6c          if( Shel
b1e0: 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
b1f0: 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20  G_Newlines) ){. 
b200: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
b210: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
b220: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
b230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
b240: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b250: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
b260: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
b270: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
b280: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b290: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
b2a0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
b2b0: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
b2c0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
b2d0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b2e0: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
b2f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b300: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
b310: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
b320: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
b330: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
b340: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
b350: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
b360: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
b370: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b380: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
b390: 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67  ntf(50,z,"%!.20g
b3a0: 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ", r);.         
b3b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b3c0: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
b3d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b3e0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
b3f0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
b400: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
b410: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
b420: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
b430: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b440: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
b450: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
b460: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
b470: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
b480: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b490: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
b4a0: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
b4b0: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
b4c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
b4d0: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
b4e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
b4f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b500: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
b510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b520: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
b530: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
b540: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
b550: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
b560: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
b570: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
b580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b590: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
b5a0: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
b5b0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
b5c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b5d0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
b5e0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
b5f0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
b600: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b610: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a  e MODE_Quote: {.
b620: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
b630: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b640: 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20    if( p->cnt==0 
b650: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
b660: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b670: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b690: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
b6a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
b6b0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
b6c0: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
b6d0: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
b6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b6f0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
b700: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
b710: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e     }.      p->cn
b720: 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t++;.      for(i
b730: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b740: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
b750: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
b760: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
b770: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
b780: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
b790: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
b7a0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
b7b0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
b7c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
b7d0: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
b7e0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
b7f0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
b800: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
b810: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
b820: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
b830: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
b840: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b850: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
b860: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
b870: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
b880: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b890: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
b8a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
b8b0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
b8c0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
b8d0: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
b8e0: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
b8f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
b900: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
b910: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
b920: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
b930: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
b940: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
b950: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
b960: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
b970: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
b980: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
b990: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
b9a0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
b9b0: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
b9d0: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
b9e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
b9f0: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
ba00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
ba10: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
ba20: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
ba30: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ba40: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
ba50: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
ba60: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
ba70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ba80: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
ba90: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
baa0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bab0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
bac0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
bad0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
bae0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
baf0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
bb00: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
bb10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
bb20: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bb30: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
bb40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bb50: 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b  se MODE_Ascii: {
bb60: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
bb70: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
bb80: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
bb90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
bba0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
bbb0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
bbc0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bbd0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
bbe0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
bbf0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
bc00: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f  p->out,"%s",azCo
bc10: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
bc20: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  : "");.        }
bc30: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
bc40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
bc50: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
bc60: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
bc70: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
bc80: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
bc90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
bca0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
bcb0: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
bcc0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
bcd0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
bce0: 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  r);.        utf8
bcf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
bd00: 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61  %s",azArg[i] ? a
bd10: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
bd20: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  lValue);.      }
bd30: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
bd40: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
bd50: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
bd60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bd70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
bd80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
bd90: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
bda0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74  ack routine that
bdb0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
bdc0: 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ary.** invokes f
bdd0: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
bde0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
bdf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c  /.static int cal
be00: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
be10: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
be20: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
be30: 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69  *azCol){.  /* si
be40: 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76  nce we don't hav
be50: 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c  e type info, cal
be60: 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c  l the shell_call
be70: 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c  back with a NULL
be80: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75   value */.  retu
be90: 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  rn shell_callbac
bea0: 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a  k(pArg, nArg, az
beb0: 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c  Arg, azCol, NULL
bec0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
bed0: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
bee0: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73 71   routine from sq
bef0: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68 61  lite3_exec() tha
bf00: 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a  t appends all.**
bf10: 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68 65   output onto the
bf20: 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c 54   end of a ShellT
bf30: 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ext object..*/.s
bf40: 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75 72  tatic int captur
bf50: 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 28  eOutputCallback(
bf60: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
bf70: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
bf80: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a  rg, char **az){.
bf90: 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d    ShellText *p =
bfa0: 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41 72   (ShellText*)pAr
bfb0: 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e  g;.  int i;.  UN
bfc0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
bfd0: 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d  z);.  if( azArg=
bfe0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bff0: 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70 65   if( p->n ) appe
c000: 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20 30  ndText(p, "|", 0
c010: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
c020: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c030: 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54 65  if( i ) appendTe
c040: 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  xt(p, ",", 0);. 
c050: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 20     if( azArg[i] 
c060: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
c070: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20  azArg[i], 0);.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
c090: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c0a0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 53  an appropriate S
c0b0: 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69 6e  ELFTEST table in
c0c0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c0d0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
c0e0: 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65 73  id createSelftes
c0f0: 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61 74  tTable(ShellStat
c100: 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  e *p){.  char *z
c110: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71  ErrMsg = 0;.  sq
c120: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
c130: 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54  ,.    "SAVEPOINT
c140: 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c   selftest_init;\
c150: 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  n".    "CREATE T
c160: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
c170: 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a  TS selftest(\n".
c180: 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45 47      "  tno INTEG
c190: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c  ER PRIMARY KEY,\
c1a0: 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d  n"   /* Test num
c1b0: 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70  ber */.    "  op
c1c0: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c1e0: 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72  perator:  memo r
c1f0: 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64  un */.    "  cmd
c200: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
c210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c220: 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20  mmand text */.  
c230: 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e 22    "  ans TEXT\n"
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61 6e     /* Desired an
c260: 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22  swer */.    ");"
c270: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d  .    "CREATE TEM
c280: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
c290: 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73  self](op,cmd,ans
c2a0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
c2b0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
c2c0: 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d  elf](rowid,op,cm
c2d0: 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  d)\n".    "  VAL
c2e0: 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53 45  UES(coalesce((SE
c2f0: 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31  LECT (max(tno)+1
c300: 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66  00)/10 FROM self
c310: 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20  test),10),\n".  
c320: 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65 6d    "         'mem
c330: 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72 61  o','Tests genera
c340: 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b  ted by --init');
c350: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
c360: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
c370: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
c380: 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20  ECT 'run',\n".  
c390: 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
c3a0: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
c3b0: 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
c3c0: 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
c400: 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
c410: 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
c420: 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
c430: 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79 70  uery('SELECT typ
c440: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
c450: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73  "FROM sqlite_mas
c480: 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27 2c  ter ORDER BY 2',
c490: 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49  224));\n".    "I
c4a0: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
c4b0: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
c4c0: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
c4d0: 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
c4e0: 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
c4f0: 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52 4f  y(''SELECT * FRO
c500: 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22 20  M \"' ||".    " 
c510: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27 25         printf('%
c520: 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20  w',name) || '\" 
c530: 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32 32  NOT INDEXED'',22
c540: 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
c550: 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
c560: 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54 20  (printf('SELECT 
c570: 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f  * FROM \"%w\" NO
c580: 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29  T INDEXED',name)
c590: 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22 20  ,224))\n".    " 
c5a0: 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22   FROM (\n".    "
c5b0: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
c5c0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
c5d0: 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  er\n".    "     
c5e0: 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
c5f0: 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  e'\n".    "     
c600: 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c    AND name<>'sel
c610: 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22 20  ftest'\n".    " 
c620: 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73        AND coales
c630: 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30  ce(rootpage,0)>0
c640: 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a  \n".    "  )\n".
c650: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
c660: 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ame;\n".    "INS
c670: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
c680: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
c690: 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27 50   VALUES('run','P
c6a0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c6b0: 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22  check','ok');\n"
c6c0: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
c6d0: 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f  O selftest(tno,o
c6e0: 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20  p,cmd,ans)".    
c6f0: 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2a  "  SELECT rowid*
c700: 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52  10,op,cmd,ans FR
c710: 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  OM [_shell$self]
c720: 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20 54  ;\n".    "DROP T
c730: 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  ABLE [_shell$sel
c740: 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a  f];".    ,0,0,&z
c750: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
c760: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 74  ErrMsg ){.    ut
c770: 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
c780: 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69 74  , "SELFTEST init
c790: 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75  ialization failu
c7a0: 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  re: %s\n", zErrM
c7b0: 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
c7c0: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
c7d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78    }.  sqlite3_ex
c7e0: 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
c7f0: 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  SE selftest_init
c800: 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a  ",0,0,0);.}.../*
c810: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
c820: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69  ination table fi
c830: 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c 6c  eld of the Shell
c840: 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  State structure 
c850: 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
c860: 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76 65  f the table give
c870: 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20 71  n.  Escape any q
c880: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
c890: 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  in the.** table 
c8a0: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
c8b0: 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e  void set_table_n
c8c0: 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ame(ShellState *
c8d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
c8e0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Name){.  int i, 
c8f0: 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65  n;.  char cQuote
c900: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
c910: 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  if( p->zDestTabl
c920: 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d  e ){.    free(p-
c930: 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
c940: 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
c950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
c960: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
c970: 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f  ;.  cQuote = quo
c980: 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20  teChar(zName);. 
c990: 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e   n = strlen30(zN
c9a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75 6f  ame);.  if( cQuo
c9b0: 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20  te ) n += n+2;. 
c9c0: 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62   z = p->zDestTab
c9d0: 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31  le = malloc( n+1
c9e0: 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
c9f0: 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
ca00: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
ca10: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
ca20: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
ca30: 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69    }.  n = 0;.  i
ca40: 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
ca50: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66  +] = cQuote;.  f
ca60: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
ca70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b  ; i++){.    z[n+
ca80: 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20  +] = zName[i];. 
ca90: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d     if( zName[i]=
caa0: 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d  =cQuote ) z[n++]
cab0: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20   = cQuote;.  }. 
cac0: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
cad0: 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
cae0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f   z[n] = 0;.}.../
caf0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
cb00: 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  uery statement t
cb10: 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  hat will generat
cb20: 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50  e SQL output.  P
cb30: 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75  rint.** the resu
cb40: 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d  lt columns, comm
cb50: 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20  a-separated, on 
cb60: 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20  a line and then 
cb70: 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c  add a.** semicol
cb80: 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f  on terminator to
cb90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
cba0: 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   line..**.** If 
cbb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
cbc0: 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74  lumns is 1 and t
cbd0: 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  hat column conta
cbe0: 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a  ins text "--".**
cbf0: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
cc00: 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73  semicolon on a s
cc10: 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54  eparate line.  T
cc20: 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a  hat way, if a.**
cc30: 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63   "--" comment oc
cc40: 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  curs at the end 
cc50: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
cc60: 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  , the comment.**
cc70: 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74   won't consume t
cc80: 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  he semicolon ter
cc90: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
cca0: 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65  ic int run_table
ccb0: 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53  _dump_query(.  S
ccc0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20  hellState *p,   
ccd0: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
cce0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
ccf0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63  nst char *zSelec
cd00: 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  t,     /* SELECT
cd10: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
cd20: 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f  tract content */
cd30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cd40: 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50  FirstRow    /* P
cd50: 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73  rint before firs
cd60: 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55  t row, if not NU
cd70: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
cd80: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
cd90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
cda0: 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t nResult;.  int
cdb0: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
cdc0: 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   *z;.  rc = sqli
cdd0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
cde0: 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d  ->db, zSelect, -
cdf0: 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
ce00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ce10: 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74  E_OK || !pSelect
ce20: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
ce30: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
ce40: 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
ce50: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
ce60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce70: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
ce80: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
ce90: 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
cea0: 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
ceb0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
cec0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20  rn rc;.  }.  rc 
ced0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
cee0: 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75  Select);.  nResu
cef0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  lt = sqlite3_col
cf00: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63  umn_count(pSelec
cf10: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
cf20: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
cf30: 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77     if( zFirstRow
cf40: 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
cf50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
cf60: 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a  s", zFirstRow);.
cf70: 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20        zFirstRow 
cf80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  = 0;.    }.    z
cf90: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
cfa0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
cfb0: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  ext(pSelect, 0);
cfc0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
cfd0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
cfe0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
cff0: 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
d000: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
d010: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22  tf(p->out, ",%s"
d020: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
d030: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69  _text(pSelect, i
d040: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
d050: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
d060: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  .    while( z[0]
d070: 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c   && (z[0]!='-' |
d080: 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a  | z[1]!='-') ) z
d090: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
d0a0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
d0b0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
d0c0: 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ;\n");.    }else
d0d0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
d0e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22  tf(p->out, ";\n"
d0f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
d100: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
d110: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
d120: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
d130: 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lize(pSelect);. 
d140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d150: 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  OK ){.    utf8_p
d160: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
d170: 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
d180: 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
d190: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
d1a0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
d1b0: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
d1c0: 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
d1d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
d1e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
d1f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d200: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
d210: 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20  ce and save off 
d220: 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74  current error st
d230: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
d240: 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d  char *save_err_m
d250: 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sg(.  sqlite3 *d
d260: 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b            /* 
d270: 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
d280: 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  y */.){.  int nE
d290: 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e  rrMsg = 1+strlen
d2a0: 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  30(sqlite3_errms
d2b0: 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a  g(db));.  char *
d2c0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
d2d0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d  3_malloc64(nErrM
d2e0: 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
d2f0: 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  sg ){.    memcpy
d300: 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  (zErrMsg, sqlite
d310: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45  3_errmsg(db), nE
d320: 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrMsg);.  }.  re
d330: 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a  turn zErrMsg;.}.
d340: 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
d350: 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  _./*.** Attempt 
d360: 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73  to display I/O s
d370: 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73  tats on Linux us
d380: 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f  ing /proc/PID/io
d390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d3a0: 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74  displayLinuxIoSt
d3b0: 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a  ats(FILE *out){.
d3c0: 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68    FILE *in;.  ch
d3d0: 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  ar z[200];.  sql
d3e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
d3f0: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72  zeof(z), z, "/pr
d400: 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69  oc/%d/io", getpi
d410: 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70  d());.  in = fop
d420: 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69  en(z, "rb");.  i
d430: 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
d440: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  n;.  while( fget
d450: 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20  s(z, sizeof(z), 
d460: 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74  in)!=0 ){.    st
d470: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
d480: 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  t {.      const 
d490: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a  char *zPattern;.
d4a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d4b0: 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61   *zDesc;.    } a
d4c0: 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Trans[] = {.    
d4d0: 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20    { "rchar: ",  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 22 42 79 74 65 73 20 72 65 63 65 69 76 65 64 20  "Bytes received 
d500: 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20  by read():" },. 
d510: 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22       { "wchar: "
d520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d530: 20 20 20 22 42 79 74 65 73 20 73 65 6e 74 20 74     "Bytes sent t
d540: 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d  o write():"    }
d550: 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 72  ,.      { "syscr
d560: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
d570: 20 20 20 20 20 20 22 52 65 61 64 28 29 20 73 79        "Read() sy
d580: 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
d590: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79    },.      { "sy
d5a0: 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20  scw: ",         
d5b0: 20 20 20 20 20 20 20 20 20 22 57 72 69 74 65 28           "Write(
d5c0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22  ) system calls:"
d5d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
d5e0: 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20  "read_bytes: ", 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
d600: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f  es read from sto
d610: 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20  rage:"  },.     
d620: 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a   { "write_bytes:
d630: 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22   ",            "
d640: 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  Bytes written to
d650: 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20   storage:" },.  
d660: 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64      { "cancelled
d670: 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  _write_bytes: ",
d680: 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69    "Cancelled wri
d690: 74 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c  te bytes:"    },
d6a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
d6b0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d6c0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 72 61  i<ArraySize(aTra
d6d0: 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ns); i++){.     
d6e0: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
d6f0: 72 6c 65 6e 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  rlen(aTrans[i].z
d700: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
d710: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61  if( strncmp(aTra
d720: 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20  ns[i].zPattern, 
d730: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
d740: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d750: 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c  out, "%-36s %s",
d760: 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63   aTrans[i].zDesc
d770: 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20  , &z[n]);.      
d780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c  .    }.  }.  fcl
d7a0: 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69  ose(in);.}.#endi
d7b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  f../*.** Display
d7c0: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
d7d0: 66 20 73 74 61 74 75 73 20 75 73 69 6e 67 20 36  f status using 6
d7e0: 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f  4-bit values..*/
d7f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
d800: 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20  playStatLine(.  
d810: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20  ShellState *p,  
d820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d830: 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a   shell context *
d840: 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  /.  char *zLabel
d850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d860: 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20   Label for this 
d870: 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68  one line */.  ch
d880: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20  ar *zFormat,    
d890: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61          /* Forma
d8a0: 74 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  t for the result
d8b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75   */.  int iStatu
d8c0: 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20  sCtrl,          
d8d0: 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75 73 20  /* Which status 
d8e0: 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20  to display */.  
d8f0: 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
d900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
d910: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
d920: 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  tats */.){.  sql
d930: 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20  ite3_int64 iCur 
d940: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
d950: 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d  int64 iHiwtr = -
d960: 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72  1;.  int i, nPer
d970: 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69  cent;.  char zLi
d980: 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74  ne[200];.  sqlit
d990: 65 33 5f 73 74 61 74 75 73 36 34 28 69 53 74 61  e3_status64(iSta
d9a0: 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20  tusCtrl, &iCur, 
d9b0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
d9c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65  ;.  for(i=0, nPe
d9d0: 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74  rcent=0; zFormat
d9e0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
d9f0: 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27  f( zFormat[i]=='
da00: 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b  %' ) nPercent++;
da10: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63  .  }.  if( nPerc
da20: 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ent>1 ){.    sql
da30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
da40: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69  zeof(zLine), zLi
da50: 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75  ne, zFormat, iCu
da60: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65  r, iHiwtr);.  }e
da70: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
da80: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
da90: 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20  (zLine), zLine, 
daa0: 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29  zFormat, iHiwtr)
dab0: 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  ;.  }.  raw_prin
dac0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36  tf(p->out, "%-36
dad0: 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c  s %s\n", zLabel,
dae0: 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zLine);.}../*.*
daf0: 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79  * Display memory
db00: 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   stats..*/.stati
db10: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74  c int display_st
db20: 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ats(.  sqlite3 *
db30: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
db40: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
db50: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65  o query */.  She
db60: 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
db70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
db80: 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
db90: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  e */.  int bRese
dba0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
dbb0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
dbc0: 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
dbd0: 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  .){.  int iCur;.
dbe0: 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20    int iHiwtr;.. 
dbf0: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
dc00: 67 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69  g->out ){.    di
dc10: 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
dc20: 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64  rg, "Memory Used
dc30: 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
dc40: 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
dc50: 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
dc60: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62  S_MEMORY_USED, b
dc70: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
dc80: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
dc90: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74  , "Number of Out
dca0: 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74  standing Allocat
dcb0: 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  ions:",.       "
dcc0: 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
dcd0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
dce0: 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52  MALLOC_COUNT, bR
dcf0: 65 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  eset);.    if( p
dd00: 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
dd10: 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
dd20: 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61   ){.      displa
dd30: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
dd40: 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
dd50: 65 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a  e Pages Used:",.
dd60: 20 20 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28           "%lld (
dd70: 6d 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22  max %lld) pages"
dd80: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
dd90: 50 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20  PAGECACHE_USED, 
dda0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  bReset);.    }. 
ddb0: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
ddc0: 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
ddd0: 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66   of Pcache Overf
dde0: 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20  low Bytes:",.   
ddf0: 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
de00: 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
de10: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
de20: 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62  ACHE_OVERFLOW, b
de30: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
de40: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
de50: 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63  , "Largest Alloc
de60: 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20  ation:",.       
de70: 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
de80: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
de90: 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  OC_SIZE, bReset)
dea0: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  ;.    displaySta
deb0: 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72  tLine(pArg, "Lar
dec0: 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f  gest Pcache Allo
ded0: 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20  cation:",.      
dee0: 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
def0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
df00: 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65  ECACHE_SIZE, bRe
df10: 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54  set);.#ifdef YYT
df20: 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54  RACKMAXSTACKDEPT
df30: 48 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  H.    displaySta
df40: 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65  tLine(pArg, "Dee
df50: 70 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63  pest Parser Stac
df60: 6b 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  k:",.       "%ll
df70: 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
df80: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52  QLITE_STATUS_PAR
df90: 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65  SER_STACK, bRese
dfa0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  t);.#endif.  }..
dfb0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
dfc0: 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b  rg->out && db ){
dfd0: 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
dfe0: 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
dff0: 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
e000: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
e010: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
e020: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
e030: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
e040: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
e050: 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
e060: 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
e070: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
e080: 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
e090: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
e0b0: 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
e0c0: 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
e0d0: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
e0e0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e0f0: 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
e100: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e110: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
e120: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
e130: 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
e160: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
e170: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e180: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
e190: 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
e1a0: 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
e1b0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
e1c0: 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
e1e0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
e1f0: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
e200: 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
e230: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
e240: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e250: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
e260: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
e270: 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
e280: 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
e290: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
e2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
e2b0: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
e2c0: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
e2d0: 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2f0: 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
e300: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
e310: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
e320: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
e330: 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
e340: 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
e350: 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
e360: 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
e370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
e380: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
e390: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
e3a0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
e3b0: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
e3c0: 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
e3d0: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
e3e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
e3f0: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
e400: 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
e420: 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
e430: 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
e440: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
e450: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
e460: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
e470: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
e480: 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
e490: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
e4a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e4b0: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
e4c0: 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
e4f0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
e500: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
e510: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
e520: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
e530: 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
e540: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
e550: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e560: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
e570: 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
e5a0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
e5b0: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
e5c0: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
e5d0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
e5e0: 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
e5f0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
e600: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
e610: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
e620: 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
e650: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
e660: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
e670: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
e680: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
e690: 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
e6a0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
e6b0: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
e6c0: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
e6d0: 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73   "Schema Heap Us
e6e0: 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
e6f0: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
e700: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e710: 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
e720: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
e730: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
e740: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
e750: 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
e760: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
e770: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
e780: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
e790: 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
e7a0: 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
e7b0: 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
e7c0: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
e7d0: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d        iCur);.  }
e7e0: 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ..  if( pArg && 
e7f0: 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20  pArg->out && db 
e800: 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  && pArg->pStmt )
e810: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
e820: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
e830: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
e840: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
e850: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20  FULLSCAN_STEP,. 
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
e880: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
e890: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
e8a0: 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73   "Fullscan Steps
e8b0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
e8c0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
e8d0: 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
e8e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
e8f0: 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
e900: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
e910: 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29  US_SORT, bReset)
e920: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
e930: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72  (pArg->out, "Sor
e940: 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  t Operations:   
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
e970: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
e980: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
e990: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
e9a0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
e9b0: 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b  TOINDEX,bReset);
e9c0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
e9d0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f  pArg->out, "Auto
e9e0: 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20  index Inserts:  
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
ea10: 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
ea20: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
ea30: 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
ea40: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
ea50: 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20  STEP, bReset);. 
ea60: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
ea70: 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61  rg->out, "Virtua
ea80: 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a  l Machine Steps:
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
eaa0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d  d\n", iCur);.  }
eab0: 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
eac0: 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75  __.  displayLinu
ead0: 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f  xIoStats(pArg->o
eae0: 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ut);.#endif..  /
eaf0: 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20  * Do not remove 
eb00: 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61  this machine rea
eb10: 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65  dable comment: e
eb20: 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75  xtra-stats-outpu
eb30: 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74  t-here */..  ret
eb40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
eb50: 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61  Display scan sta
eb60: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
eb70: 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73  id display_scans
eb80: 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
eb90: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
eba0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ebb0: 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
ebc0: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
ebd0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
ebe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ebf0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b  ShellState */.){
ec00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec10: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
ec20: 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f  STATUS.  UNUSED_
ec30: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
ec40: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
ec50: 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20  R(pArg);.#else. 
ec60: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78   int i, k, n, mx
ec70: 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  ;.  raw_printf(p
ec80: 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
ec90: 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d  --- scanstats --
eca0: 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78  ------\n");.  mx
ecb0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b   = 0;.  for(k=0;
ecc0: 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20   k<=mx; k++){.  
ecd0: 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f    double rEstLoo
ece0: 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72  p = 1.0;.    for
ecf0: 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b  (i=n=0; 1; i++){
ed00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ed10: 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70  tmt *p = pArg->p
ed20: 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Stmt;.      sqli
ed30: 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c  te3_int64 nLoop,
ed40: 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64   nVisit;.      d
ed50: 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20  ouble rEst;.    
ed60: 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20    int iSid;.    
ed70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
ed80: 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66  xplain;.      if
ed90: 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  ( sqlite3_stmt_s
eda0: 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
edb0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
edc0: 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
edd0: 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Loop) ){.       
ede0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
edf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ee00: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
ee10: 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
ee20: 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76  TAT_SELECTID, (v
ee30: 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20  oid*)&iSid);.   
ee40: 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29     if( iSid>mx )
ee50: 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20   mx = iSid;.    
ee60: 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20    if( iSid!=k ) 
ee70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ee80: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
ee90: 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28      rEstLoop = (
eea0: 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20  double)nLoop;.  
eeb0: 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20        if( k>0 ) 
eec0: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
eed0: 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
eee0: 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d  subquery %d ----
eef0: 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20  ---\n", k);.    
ef00: 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
ef10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
ef20: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
ef30: 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
ef40: 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
ef50: 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
ef60: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
ef70: 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
ef80: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
ef90: 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
efa0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
efb0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
efc0: 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
efd0: 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
efe0: 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
eff0: 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  n);.      utf8_p
f000: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f010: 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e   "Loop %2d: %s\n
f020: 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b  ", n, zExplain);
f030: 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20  .      rEstLoop 
f040: 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72  *= rEst;.      r
f050: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
f060: 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22  out,.          "
f070: 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25           nLoop=%
f080: 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c  -8lld nRow=%-8ll
f090: 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20  d estRow=%-8lld 
f0a0: 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67  estRow/Loop=%-8g
f0b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
f0c0: 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73  Loop, nVisit, (s
f0d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45  qlite3_int64)(rE
f0e0: 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73  stLoop+0.5), rEs
f0f0: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
f100: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
f110: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
f120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23  ---------\n");.#
f140: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
f150: 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79  arameter azArray
f160: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72   points to a zer
f170: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72  o-terminated arr
f180: 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a  ay of strings. z
f190: 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  Str.** points to
f1a0: 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65   a single nul-te
f1b0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
f1c0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f1d0: 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65   if zStr.** is e
f1e0: 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20  qual, according 
f1f0: 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20  to strcmp(), to 
f200: 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  any of the strin
f210: 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  gs in the array.
f220: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
f230: 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
f240: 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e  tatic int str_in
f250: 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61  _array(const cha
f260: 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
f270: 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a  har **azArray){.
f280: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
f290: 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20  =0; azArray[i]; 
f2a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
f2b0: 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a  =strcmp(zStr, az
f2c0: 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75  Array[i]) ) retu
f2d0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
f2e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
f2f0: 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  f compiled state
f300: 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72  ment pSql appear
f310: 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41  s to be an EXPLA
f320: 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c  IN statement, al
f330: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f  locate.** and po
f340: 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c  pulate the Shell
f350: 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d  State.aiIndent[]
f360: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
f370: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
f380: 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
f390: 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
f3a0: 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
f3b0: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
f3c0: 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65  e indenting rule
f3d0: 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
f3e0: 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78   * For each "Nex
f3f0: 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65  t", "Prev", "VNe
f400: 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69  xt" or "VPrev" i
f410: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65  nstruction, inde
f420: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20  nt.**       all 
f430: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63  opcodes that occ
f440: 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  ur between the p
f450: 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  2 jump destinati
f460: 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  on and the opcod
f470: 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c  e.**       itsel
f480: 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  f by 2 spaces..*
f490: 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
f4a0: 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74  ach "Goto", if t
f4b0: 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he jump destinat
f4c0: 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69  ion is earlier i
f4d0: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  n the program.**
f4e0: 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20         and ends 
f4f0: 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20  on one of:.**   
f500: 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65         Yield  Se
f510: 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f  ekGt  SeekLt  Ro
f520: 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64  wSetRead  Rewind
f530: 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20  .**       or if 
f540: 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  the P1 parameter
f550: 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20   is one instead 
f560: 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20  of zero,.**     
f570: 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c    then indent al
f580: 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65  l opcodes betwee
f590: 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e  n the earlier in
f5a0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  struction.**    
f5b0: 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79     and "Goto" by
f5c0: 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74   2 spaces..*/.st
f5d0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
f5e0: 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53  n_data_prepare(S
f5f0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
f600: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
f610: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
f620: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
f630: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
f640: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
f650: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
f660: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
f670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
f680: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
f690: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
f6a0: 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69  N */.  int *abYi
f6b0: 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
f6c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f6d0: 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69  f op is an OP_Yi
f6e0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  eld */.  int nAl
f6f0: 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
f700: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
f710: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d  cated size of p-
f720: 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59  >aiIndent[], abY
f730: 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ield */.  int iO
f740: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
f750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
f760: 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  ex of operation 
f770: 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  in p->aiIndent[]
f780: 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
f790: 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20  r *azNext[] = { 
f7a0: 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
f7b0: 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22  "VPrev", "VNext"
f7c0: 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a  , "SorterNext",.
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 20 20 20 20 20 22 4e 65 78 74             "Next
f7f0: 49 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66  IfOpen", "PrevIf
f800: 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f  Open", 0 };.  co
f810: 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c  nst char *azYiel
f820: 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c  d[] = { "Yield",
f830: 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b   "SeekLT", "Seek
f840: 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64  GT", "RowSetRead
f850: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f870: 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20  Rewind", 0 };.  
f880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f  const char *azGo
f890: 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c  to[] = { "Goto",
f8a0: 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20   0 };..  /* Try 
f8b0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66  to figure out if
f8c0: 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20   this is really 
f8d0: 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
f8e0: 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20  ment. If this.  
f8f0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72  ** cannot be ver
f900: 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61  ified, return ea
f910: 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  rly.  */.  if( s
f920: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
f930: 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a  unt(pSql)!=8 ){.
f940: 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
f950: 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  ->mode;.    retu
f960: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  rn;.  }.  zSql =
f970: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
f980: 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  l);.  if( zSql==
f990: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
f9a0: 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20  r(z=zSql; *z==' 
f9b0: 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c  ' || *z=='\t' ||
f9c0: 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d   *z=='\n' || *z=
f9d0: 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72  ='\f' || *z=='\r
f9e0: 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73  '; z++);.  if( s
f9f0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
fa00: 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29  z, "explain", 7)
fa10: 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65   ){.    p->cMode
fa20: 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
fa30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
fa40: 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45  or(iOp=0; SQLITE
fa50: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
fa60: 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29  ep(pSql); iOp++)
fa70: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fa80: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
fa90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
faa0: 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f  pSql, 0);.    co
fab0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
fac0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
fad0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
fae0: 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20  (pSql, 1);..    
faf0: 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65  /* Set p2 to the
fb00: 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65   P2 field of the
fb10: 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e   current opcode.
fb20: 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20   Then, assuming 
fb30: 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69  that.    ** p2 i
fb40: 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  s an instruction
fb50: 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61   address, set va
fb60: 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74  riable p2op to t
fb70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
fb80: 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
fb90: 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64  ion in the aiInd
fba0: 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20  ent[] array. p2 
fbb0: 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20  and p2op may be 
fbc0: 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20  different if.   
fbd0: 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
fbe0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70  instruction is p
fbf0: 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f  art of a sub-pro
fc00: 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62  gram generated b
fc10: 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20  y an.    ** SQL 
fc20: 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69  trigger or forei
fc30: 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20  gn key.  */.    
fc40: 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33  int p2 = sqlite3
fc50: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
fc60: 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32  , 3);.    int p2
fc70: 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d  op = (p2 + (iOp-
fc80: 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  iAddr));..    /*
fc90: 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49   Grow the p->aiI
fca0: 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72  ndent array as r
fcb0: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
fcc0: 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29  f( iOp>=nAlloc )
fcd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d  {.      if( iOp=
fce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
fcf0: 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66   Do further verf
fd00: 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69  ication that thi
fd10: 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74  s is explain out
fd20: 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20  put.  Abort if. 
fd30: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
fd40: 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  not */.        s
fd50: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
fd60: 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20   *explainCols[] 
fd70: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22  = {.           "
fd80: 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c  addr", "opcode",
fd90: 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33   "p1", "p2", "p3
fda0: 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22  ", "p4", "p5", "
fdb0: 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20  comment" };.    
fdc0: 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
fdd0: 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
fde0: 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61  <ArraySize(expla
fdf0: 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a  inCols); jj++){.
fe00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
fe10: 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c  rcmp(sqlite3_col
fe20: 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a  umn_name(pSql,jj
fe30: 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a  ),explainCols[jj
fe40: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
fe50: 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20       p->cMode = 
fe60: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  p->mode;.       
fe70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
fe80: 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20  et(pSql);.      
fe90: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fea0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
feb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fec0: 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b    nAlloc += 100;
fed0: 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  .      p->aiInde
fee0: 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  nt = (int*)sqlit
fef0: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
ff00: 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63  aiIndent, nAlloc
ff10: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
ff20: 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28       abYield = (
ff30: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
ff40: 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20  lloc64(abYield, 
ff50: 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
ff60: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t));.    }.    a
ff70: 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74  bYield[iOp] = st
ff80: 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
ff90: 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d  azYield);.    p-
ffa0: 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d  >aiIndent[iOp] =
ffb0: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65   0;.    p->nInde
ffc0: 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20  nt = iOp+1;..   
ffd0: 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
ffe0: 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29  y(zOp, azNext) )
fff0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32  {.      for(i=p2
10000 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20  op; i<iOp; i++) 
10010 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b  p->aiIndent[i] +
10020 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 2;.    }.    i
10030 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  f( str_in_array(
10040 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20  zOp, azGoto) && 
10050 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a  p2op<p->nIndent.
10060 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64       && (abYield
10070 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65  [p2op] || sqlite
10080 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
10090 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20  l, 2)).    ){.  
100a0 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20      for(i=p2op; 
100b0 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61  i<iOp; i++) p->a
100c0 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b  iIndent[i] += 2;
100d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d  .    }.  }..  p-
100e0 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >iIndent = 0;.  
100f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59  sqlite3_free(abY
10100 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ield);.  sqlite3
10110 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a  _reset(pSql);.}.
10120 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
10130 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20  array allocated 
10140 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  by explain_data_
10150 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
10160 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
10170 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68  n_data_delete(Sh
10180 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
10190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
101a0 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e  aiIndent);.  p->
101b0 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  aiIndent = 0;.  
101c0 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->nIndent = 0;.
101d0 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30    p->iIndent = 0
101e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  ;.}../*.** Disab
101f0 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e  le and restore .
10200 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e  wheretrace and .
10210 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74  selecttrace sett
10220 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ings..*/.#if def
10230 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10240 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
10250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
10260 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20  CTTRACE).extern 
10270 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
10280 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  tTrace;.static i
10290 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72  nt savedSelectTr
102a0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ace;.#endif.#if 
102b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
102c0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
102d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
102e0 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72  HERETRACE).exter
102f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
10300 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  reTrace;.static 
10310 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72  int savedWhereTr
10320 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74  ace;.#endif.stat
10330 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  ic void disable_
10340 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
10350 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
10360 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10370 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
10380 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
10390 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  CTTRACE).  saved
103a0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71  SelectTrace = sq
103b0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
103c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
103d0 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  tTrace = 0;.#end
103e0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
103f0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
10400 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
10410 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
10420 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72  ).  savedWhereTr
10430 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ace = sqlite3Whe
10440 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  reTrace;.  sqlit
10450 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30  e3WhereTrace = 0
10460 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69  ;.#endif.}.stati
10470 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64  c void restore_d
10480 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
10490 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
104a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
104b0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
104c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
104d0 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  TTRACE).  sqlite
104e0 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  3SelectTrace = s
104f0 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b  avedSelectTrace;
10500 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
10510 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
10520 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
10530 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
10540 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
10550 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76  WhereTrace = sav
10560 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
10570 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  ndif.}../*.** Ru
10580 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
10590 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  tement.*/.static
105a0 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61   void exec_prepa
105b0 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c  red_stmt(.  Shel
105c0 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20  lState *pArg,   
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105f0 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
10600 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  State */.  sqlit
10610 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20  e3_stmt *pStmt, 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10640 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  tatment to run *
10650 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
10660 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
10670 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
10680 2a 29 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  *)   /* Callback
10690 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
106a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
106b0 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
106c0 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
106d0 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
106e0 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
106f0 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
10700 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
10710 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
10720 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
10730 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
10740 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
10750 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
10760 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
10770 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61  .    /* if we ha
10780 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  ve a callback...
10790 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c   */.    if( xCal
107a0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  lback ){.      /
107b0 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
107c0 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
107d0 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
107e0 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20  d type */.      
107f0 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  int nCol = sqlit
10800 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
10810 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f  pStmt);.      vo
10820 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
10830 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
10840 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
10850 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
10860 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
10870 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
10880 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
108a0 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20    char **azCols 
108b0 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61  = (char **)pData
108c0 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  ;      /* Names 
108d0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
108e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
108f0 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
10900 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
10910 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
10920 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54          int *aiT
10930 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
10940 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
10950 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
10960 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78          int i, x
10970 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10980 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
10990 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
109a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65  .        /* save
109b0 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
109c0 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
109d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
109e0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
109f0 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20        azCols[i] 
10a00 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
10a10 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
10a20 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
10a30 20 7d 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20   }.        do{. 
10a40 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72           /* extr
10a50 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
10a60 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
10a70 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
10a80 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10a90 20 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79              aiTy
10aa0 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
10ab0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
10ac0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
10ad0 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
10ae0 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
10af0 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
10b00 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
10b10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
10b20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a  azVals[i] = "";.
10b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
10b40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
10b50 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68   azVals[i] = (ch
10b60 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
10b70 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
10b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
10b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10ba0 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
10bb0 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
10bc0 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
10bd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10bf0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
10c00 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
10c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
10c20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
10c30 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  d for */..      
10c40 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61      /* if data a
10c50 6e 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74  nd types extract
10c60 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
10c70 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .. */.          
10c80 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
10c90 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  = rc ){.        
10ca0 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
10cb0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
10cc0 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
10cd0 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
10ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43            if( xC
10cf0 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43  allback(pArg, nC
10d00 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f  ol, azVals, azCo
10d10 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a  ls, aiTypes) ){.
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
10d30 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
10d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
10d50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
10d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10d70 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
10d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
10da0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
10db0 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20  W == rc );.     
10dc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10dd0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a  pData);.      }.
10de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10df0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20   do{.        rc 
10e00 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
10e10 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77  Stmt);.      } w
10e20 68 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49  hile( rc == SQLI
10e30 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a  TE_ROW );.    }.
10e40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
10e50 63 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74  cute a statement
10e60 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61 74 65   or set of state
10e70 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a  ments.  Print.**
10e80 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73   any result rows
10e90 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69  /columns dependi
10ea0 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ng on the curren
10eb0 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69  t mode.** set vi
10ec0 61 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  a the supplied c
10ed0 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  allback..**.** T
10ee0 68 69 73 20 69 73 20 76 65 72 79 20 73 69 6d 69  his is very simi
10ef0 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20  lar to SQLite's 
10f00 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33  built-in sqlite3
10f10 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74  _exec().** funct
10f20 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74 61  ion except it ta
10f30 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64  kes a slightly d
10f40 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63  ifferent callbac
10f50 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63  k.** and callbac
10f60 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e  k data argument.
10f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10f80 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c  hell_exec(.  sql
10f90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
10fc0 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  n database */.  
10fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
10fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
11000 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64   to be evaluated
11010 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
11020 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
11030 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69  ,char**,char**,i
11040 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62  nt*),   /* Callb
11050 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11090 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
110a0 73 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f  sqlite3_exec) */
110b0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
110c0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
110e0 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
110f0 53 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  State */.  char 
11100 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
11130 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
11140 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
11150 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c  tmt *pStmt = NUL
11160 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  L;     /* Statem
11170 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
11180 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11190 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
111a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
111b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
111c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
111d0 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20  zLeftover;      
111e0 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75      /* Tail of u
111f0 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a  nprocessed SQL *
11200 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73  /..  if( pzErrMs
11210 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  g ){.    *pzErrM
11220 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  sg = NULL;.  }..
11230 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d    while( zSql[0]
11240 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d   && (SQLITE_OK =
11250 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61  = rc) ){.    sta
11260 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
11270 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63  zStmtSql;.    rc
11280 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
11290 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
112a0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65  -1, &pStmt, &zLe
112b0 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28  ftover);.    if(
112c0 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63   SQLITE_OK != rc
112d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a   ){.      if( pz
112e0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
112f0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61    *pzErrMsg = sa
11300 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a  ve_err_msg(db);.
11310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
11320 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53  e{.      if( !pS
11330 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  tmt ){.        /
11340 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66  * this happens f
11350 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20  or a comment or 
11360 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20  white-space */. 
11370 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
11380 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
11390 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
113a0 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
113b0 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
113c0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
113d0 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71     zStmtSql = sq
113e0 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
113f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d  ;.      if( zStm
11400 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53  tSql==0 ) zStmtS
11410 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77  ql = "";.      w
11420 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
11430 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74  tmtSql[0]) ) zSt
11440 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20  mtSql++;..      
11450 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20  /* save off the 
11460 70 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e  prepared statmen
11470 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73  t handle and res
11480 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a  et row count */.
11490 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
114a0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
114b0 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
114c0 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74         pArg->cnt
114d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
114e0 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65       /* echo the
114f0 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69   sql statement i
11500 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20  f echo on */.   
11510 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53     if( pArg && S
11520 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67  hellHasFlag(pArg
11530 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b  , SHFLG_Echo) ){
11540 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
11550 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11560 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c  "%s\n", zStmtSql
11570 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53   ? zStmtSql : zS
11580 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ql);.      }..  
11590 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20      /* Show the 
115a0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
115b0 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e  AN if .eqp is on
115c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
115d0 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f  rg && pArg->auto
115e0 45 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73  EQP && sqlite3_s
115f0 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25  trlike("EXPLAIN%
11600 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30  ",zStmtSql,0)!=0
11610 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11620 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
11630 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
11640 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
11650 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72  disable_debug_tr
11660 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
11670 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69       zEQP = sqli
11680 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
11690 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
116a0 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
116b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
116c0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
116d0 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
116e0 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
116f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11710 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
11720 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
11730 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
11740 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
11750 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
11760 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c  t,"--EQP-- %d,",
11770 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
11780 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 29  nt(pExplain, 0))
11790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
117a0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
117b0 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65  ut,"%d,", sqlite
117c0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
117d0 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20  plain, 1));.    
117e0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
117f0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64  tf(pArg->out,"%d
11800 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,", sqlite3_colu
11810 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
11820 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   2));.          
11830 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
11840 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20  rg->out,"%s\n", 
11850 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
11860 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
11870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11890 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
118a0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
118b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
118c0 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
118d0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
118e0 51 50 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  QP>=2 ){.       
118f0 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e     /* Also do an
11900 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65   EXPLAIN for ".e
11910 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f  qp full" mode */
11920 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20  .          zEQP 
11930 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
11940 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20  f("EXPLAIN %s", 
11950 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20  zStmtSql);.     
11960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11970 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
11980 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
11990 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
119a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
119b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
119c0 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65       pArg->cMode
119d0 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
119e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70  .            exp
119f0 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
11a00 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e  e(pArg, pExplain
11a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
11a20 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
11a30 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e  t(pArg, pExplain
11a40 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  , xCallback);.  
11a50 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
11a60 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
11a70 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg);.          }
11a80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11a90 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
11aa0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
11ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
11ac0 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QP);.        }. 
11ad0 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64         restore_d
11ae0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
11af0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ();.      }..   
11b00 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
11b10 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
11b20 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b  de = pArg->mode;
11b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
11b40 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 0a 20  g->autoExplain. 
11b50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
11b60 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
11b70 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20  pStmt)==8.      
11b80 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
11b90 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
11ba0 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
11bb0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
11bc0 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
11bd0 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
11be0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
11bf0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
11c00 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c  hell is currentl
11c10 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20  y in ".explain" 
11c20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65  mode, gather the
11c30 20 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a   extra.        *
11c40 2a 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  * data required 
11c50 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74  to add indents t
11c60 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a  o the output.*/.
11c70 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
11c80 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
11c90 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
11ca0 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
11cb0 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53  prepare(pArg, pS
11cc0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tmt);.        }.
11cd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65        }..      e
11ce0 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
11cf0 74 28 70 41 72 67 2c 20 70 53 74 6d 74 2c 20 78  t(pArg, pStmt, x
11d00 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
11d10 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
11d20 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a 20 20 20  lete(pArg);..   
11d30 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67     /* print usag
11d40 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74 73  e stats if stats
11d50 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
11d60 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
11d70 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
11d80 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28    display_stats(
11d90 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20  db, pArg, 0);.  
11da0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11db0 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74  print loop-count
11dc0 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64 20  ers if required 
11dd0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
11de0 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73  g && pArg->scans
11df0 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
11e00 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74    display_scanst
11e10 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ats(db, pArg);. 
11e20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
11e30 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
11e40 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65  atement just exe
11e50 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66  cuted. If this f
11e60 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20  ails, save a.   
11e70 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
11e80 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
11e90 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
11ea0 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  zSql to point to
11eb0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
11ec0 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  xt statement to 
11ed0 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20  execute. */.    
11ee0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
11ef0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
11f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63  QLITE_NOMEM ) rc
11f20 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66   = rc2;.      if
11f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11f40 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
11f50 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
11f60 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
11f70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
11f80 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql++;.      }el
11f90 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  se if( pzErrMsg 
11fa0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
11fb0 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
11fc0 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
11fd0 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72  ..      /* clear
11fe0 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64   saved stmt hand
11ff0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
12000 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
12010 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55  pArg->pStmt = NU
12020 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
12030 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69  }.  } /* end whi
12040 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  le */..  return 
12050 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12060 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  ease memory prev
12070 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
12080 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c   by tableColumnL
12090 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist()..*/.static
120a0 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e   void freeColumn
120b0 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f  List(char **azCo
120c0 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
120d0 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
120e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
120f0 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69  te3_free(azCol[i
12100 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43  ]);.  }.  /* azC
12110 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69  ol[0] is a stati
12120 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71  c string */.  sq
12130 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
12140 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
12150 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69  rn a list of poi
12160 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73  nters to strings
12170 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e   which are the n
12180 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63  ames of all.** c
12190 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
121a0 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f  zTab.   The memo
121b0 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ry to hold the n
121c0 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61  ames is dynamica
121d0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
121e0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
121f0 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  eased by the cal
12200 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73  ler using a subs
12210 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
12220 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  o freeColumnList
12230 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a  ()..**.** The az
12240 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20  Col[0] entry is 
12250 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48  usually NULL.  H
12260 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20  owever, if zTab 
12270 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64  contains a rowid
12280 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e  .** value that n
12290 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65  eeds to be prese
122a0 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c  rved, then azCol
122b0 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  [0] is filled in
122c0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d   with the.** nam
122d0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  e of the rowid c
122e0 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  olumn..**.** The
122f0 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63   first regular c
12300 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
12310 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20  le is azCol[1]. 
12320 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72   The list is ter
12330 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e  minated.** by an
12340 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f   entry with azCo
12350 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74  l[i]==0..*/.stat
12360 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43  ic char **tableC
12370 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53  olumnList(ShellS
12380 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
12390 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68  har *zTab){.  ch
123a0 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a  ar **azCol = 0;.
123b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
123c0 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  pStmt;.  char *z
123d0 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  Sql;.  int nCol 
123e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  = 0;.  int nAllo
123f0 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b  c = 0;.  int nPK
12400 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
12410 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59  umber of PRIMARY
12420 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65   KEY columns see
12430 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b  n */.  int isIPK
12440 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
12450 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59  e if one PRIMARY
12460 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   KEY column of t
12470 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20  ype INTEGER */. 
12480 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77   int preserveRow
12490 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61  id = ShellHasFla
124a0 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
124b0 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74  rveRowid);.  int
124c0 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
124d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
124e0 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
124f0 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20  o=%Q", zTab);.  
12500 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
12510 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
12520 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
12530 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
12540 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
12550 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   rc ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
12570 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
12580 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
12590 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63  if( nCol>=nAlloc
125a0 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  -2 ){.      nAll
125b0 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  oc = nAlloc*2 + 
125c0 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20  nCol + 10;.     
125d0 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   azCol = sqlite3
125e0 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20  _realloc(azCol, 
125f0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a  nAlloc*sizeof(az
12600 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  Col[0]));.      
12610 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
12620 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12630 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
12640 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
12650 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
12660 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
12670 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b     }.    azCol[+
12680 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33  +nCol] = sqlite3
12690 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
126a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
126b0 78 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20  xt(pStmt, 1));. 
126c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
126d0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
126e0 20 35 29 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b   5) ){.      nPK
126f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50  ++;.      if( nP
12700 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26 26 20 73  K==1.       && s
12710 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 28  qlite3_stricmp((
12720 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
12730 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
12740 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20  pStmt,2),.      
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 22 49 4e 54 45 47 45 52 22 29 3d 3d      "INTEGER")==
12770 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
12780 20 20 20 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20     isIPK = 1;.  
12790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
127a0 20 20 20 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20     isIPK = 0;.  
127b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
127c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
127d0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
127e0 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75   azCol==0 ) retu
127f0 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d  rn 0;.  azCol[0]
12800 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43   = 0;.  azCol[nC
12810 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ol+1] = 0;..  /*
12820 20 54 68 65 20 64 65 63 69 73 69 6f 6e 20 6f 66   The decision of
12830 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12840 61 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e  a rowid really n
12850 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65  eeds to be prese
12860 72 76 65 64 0a 20 20 2a 2a 20 69 73 20 74 72 69  rved.  ** is tri
12870 63 6b 79 2e 20 20 57 65 20 6e 65 76 65 72 20 6e  cky.  We never n
12880 65 65 64 20 74 6f 20 70 72 65 73 65 72 76 65 20  eed to preserve 
12890 61 20 72 6f 77 69 64 20 66 6f 72 20 61 20 57 49  a rowid for a WI
128a0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
128b0 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c  e.  ** or a tabl
128c0 65 20 77 69 74 68 20 61 6e 20 49 4e 54 45 47 45  e with an INTEGE
128d0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
128e0 57 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  We are unable to
128f0 20 70 72 65 73 65 72 76 65 0a 20 20 2a 2a 20 72   preserve.  ** r
12900 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c 65 73 20  owids on tables 
12910 77 68 65 72 65 20 74 68 65 20 72 6f 77 69 64 20  where the rowid 
12920 69 73 20 69 6e 61 63 63 65 73 73 69 62 6c 65 20  is inaccessible 
12930 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
12940 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c  e other.  ** col
12950 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
12960 65 20 6e 61 6d 65 64 20 22 72 6f 77 69 64 22 2c  e named "rowid",
12970 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20   "_rowid_", and 
12980 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "oid"..  */.  if
12990 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
129a0 26 26 20 69 73 49 50 4b 20 29 7b 0a 20 20 20 20  && isIPK ){.    
129b0 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 50  /* If a single P
129c0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
129d0 6e 20 77 69 74 68 20 74 79 70 65 20 49 4e 54 45  n with type INTE
129e0 47 45 52 20 77 61 73 20 73 65 65 6e 2c 20 74 68  GER was seen, th
129f0 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67  en it.    ** mig
12a00 68 74 20 62 65 20 61 6e 20 61 6c 69 73 65 20 66  ht be an alise f
12a10 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 20 20 42  or the ROWID.  B
12a20 75 74 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  ut it might also
12a30 20 62 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f   be a WITHOUT RO
12a40 57 49 44 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  WID.    ** table
12a50 20 6f 72 20 61 20 49 4e 54 45 47 45 52 20 50 52   or a INTEGER PR
12a60 49 4d 41 52 59 20 4b 45 59 20 44 45 53 43 20 63  IMARY KEY DESC c
12a70 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f  olumn, neither o
12a80 66 20 77 68 69 63 68 20 61 72 65 0a 20 20 20 20  f which are.    
12a90 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61 73 65 73  ** ROWID aliases
12aa0 2e 20 20 54 6f 20 64 69 73 74 69 6e 67 75 69 73  .  To distinguis
12ab0 68 20 74 68 65 73 65 20 63 61 73 65 73 2c 20 63  h these cases, c
12ac0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20  heck to see if. 
12ad0 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61     ** there is a
12ae0 20 22 70 6b 22 20 65 6e 74 72 79 20 69 6e 20 22   "pk" entry in "
12af0 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
12b00 74 22 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20  t".  There will 
12b10 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b  be.    ** no "pk
12b20 22 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 50  " index if the P
12b30 52 49 4d 41 52 59 20 4b 45 59 20 72 65 61 6c 6c  RIMARY KEY reall
12b40 79 20 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f  y is an alias fo
12b50 72 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 20  r the ROWID..   
12b60 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   */.    zSql = s
12b70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12b80 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 72  SELECT 1 FROM pr
12b90 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28  agma_index_list(
12ba0 25 51 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  %Q)".           
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 22 20 57 48 45 52 45 20 6f 72 69 67 69 6e 3d 27  " WHERE origin='
12bd0 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20  pk'", zTab);.   
12be0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
12bf0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
12c00 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
12c10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12c20 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
12c30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12c40 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74    freeColumnList
12c50 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72  (azCol);.      r
12c60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
12c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12c80 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
12c90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12ca0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 72  e(pStmt);.    pr
12cb0 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20 72 63  eserveRowid = rc
12cc0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  ==SQLITE_ROW;.  
12cd0 7d 0a 20 20 69 66 28 20 70 72 65 73 65 72 76 65  }.  if( preserve
12ce0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20  Rowid ){.    /* 
12cf0 4f 6e 6c 79 20 70 72 65 73 65 72 76 65 20 74 68  Only preserve th
12d00 65 20 72 6f 77 69 64 20 69 66 20 77 65 20 63 61  e rowid if we ca
12d10 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f  n find a name to
12d20 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20 20 20   use for the.   
12d30 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20   ** rowid */.   
12d40 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a   static char *az
12d50 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77  Rowid[] = { "row
12d60 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20  id", "_rowid_", 
12d70 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74  "oid" };.    int
12d80 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a   i, j;.    for(j
12d90 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
12da0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
12db0 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nCol; i++){.   
12dc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12dd0 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f 77 69 64  _stricmp(azRowid
12de0 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30  [j],azCol[i])==0
12df0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12e00 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 6e 43  }.      if( i>nC
12e10 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
12e20 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
12e30 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52  we know that azR
12e40 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74  owid[j] is not t
12e50 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20  he name of any. 
12e60 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61         ** ordina
12e70 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ry column in the
12e80 20 74 61 62 6c 65 2e 20 20 56 65 72 69 66 79 20   table.  Verify 
12e90 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
12ea0 69 73 20 61 20 76 61 6c 69 64 0a 20 20 20 20 20  is a valid.     
12eb0 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74     ** name for t
12ec0 68 65 20 72 6f 77 69 64 20 62 65 66 6f 72 65 20  he rowid before 
12ed0 61 64 64 69 6e 67 20 69 74 20 74 6f 20 61 7a 43  adding it to azC
12ee0 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f 55 54 20  ol[0].  WITHOUT 
12ef0 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 2a 2a  ROWID.        **
12f00 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 66 61 69   tables will fai
12f10 6c 20 74 68 69 73 20 6c 61 73 74 20 63 68 65 63  l this last chec
12f20 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
12f30 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
12f40 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
12f50 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52  p->db,0,zTab,azR
12f60 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c  owid[j],0,0,0,0,
12f70 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
12f90 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77  azCol[0] = azRow
12fa0 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62  id[j];.        b
12fb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12fc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12fd0 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   azCol;.}../*.**
12fe0 20 54 6f 67 67 6c 65 20 74 68 65 20 72 65 76 65   Toggle the reve
12ff0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
13000 6c 65 63 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a  lects setting..*
13010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f  /.static void to
13020 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28  ggleSelectOrder(
13030 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13040 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13050 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  tmt = 0;.  int i
13060 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63  Setting = 0;.  c
13070 68 61 72 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a  har zStmt[100];.
13080 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
13090 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41  e_v2(db, "PRAGMA
130a0 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
130b0 65 64 5f 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c  ed_selects", -1,
130c0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
130d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
130e0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
130f0 4f 57 20 29 7b 0a 20 20 20 20 69 53 65 74 74 69  OW ){.    iSetti
13100 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ng = sqlite3_col
13110 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
13120 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13130 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
13140 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
13150 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d  intf(sizeof(zStm
13160 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20  t), zStmt,.     
13170 20 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73    "PRAGMA revers
13180 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
13190 63 74 73 28 25 64 29 22 2c 20 21 69 53 65 74 74  cts(%d)", !iSett
131a0 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ing);.  sqlite3_
131b0 65 78 65 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20  exec(db, zStmt, 
131c0 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  0, 0, 0);.}../*.
131d0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66  ** This is a dif
131e0 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20  ferent callback 
131f0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72  routine used for
13200 20 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74   dumping the dat
13210 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72  abase..** Each r
13220 6f 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74  ow received by t
13230 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e  his callback con
13240 73 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65  sists of a table
13250 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61   name,.** the ta
13260 62 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78  ble type ("index
13270 22 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e  " or "table") an
13280 64 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20  d SQL to create 
13290 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
132a0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
132b0 64 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66  d print text suf
132c0 66 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65  ficient to recre
132d0 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
132e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d  /.static int dum
132f0 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  p_callback(void 
13300 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
13310 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
13320 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29  har **azNotUsed)
13330 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  {.  int rc;.  co
13340 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
13350 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
13360 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zType;.  const c
13370 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65  har *zSql;.  She
13380 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
13390 65 6c 6c 53 74 61 74 65 20 2a 29 70 41 72 67 3b  ellState *)pArg;
133a0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
133b0 45 54 45 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b  ETER(azNotUsed);
133c0 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 7c  .  if( nArg!=3 |
133d0 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  | azArg==0 ) ret
133e0 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62 6c 65 20  urn 0;.  zTable 
133f0 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54  = azArg[0];.  zT
13400 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ype = azArg[1];.
13410 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32    zSql = azArg[2
13420 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ];..  if( strcmp
13430 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
13440 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
13450 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
13460 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45  (p->out, "DELETE
13470 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71   FROM sqlite_seq
13480 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65  uence;\n");.  }e
13490 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
134a0 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f  strglob("sqlite_
134b0 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d  stat?", zTable)=
134c0 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
134d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
134e0 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
134f0 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  ter;\n");.  }els
13500 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54  e if( strncmp(zT
13510 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  able, "sqlite_",
13520 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   7)==0 ){.    re
13530 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20  turn 0;.  }else 
13540 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c  if( strncmp(zSql
13550 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  , "CREATE VIRTUA
13560 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30  L TABLE", 20)==0
13570 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49   ){.    char *zI
13580 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ns;.    if( !p->
13590 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
135a0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
135b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
135c0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
135d0 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  ma=ON;\n");.    
135e0 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
135f0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ema = 1;.    }. 
13600 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65     zIns = sqlite
13610 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
13620 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
13630 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74 79 70  qlite_master(typ
13640 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
13650 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22 0a 20  rootpage,sql)". 
13660 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 27 74        "VALUES('t
13670 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71 27 2c  able','%q','%q',
13680 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20 20 20  0,'%q');",.     
13690 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65    zTable, zTable
136a0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66  , zSql);.    utf
136b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
136c0 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a   "%s\n", zIns);.
136d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
136e0 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74 75  (zIns);.    retu
136f0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
13700 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
13710 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c  ne(p->out, zSql,
13720 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20   ";\n");.  }..  
13730 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65  if( strcmp(zType
13740 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b  , "table")==0 ){
13750 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
13760 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c  Select;.    Shel
13770 6c 54 65 78 74 20 73 54 61 62 6c 65 3b 0a 20 20  lText sTable;.  
13780 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a    char **azCol;.
13790 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
137a0 68 61 72 20 2a 73 61 76 65 64 44 65 73 74 54 61  har *savedDestTa
137b0 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 73 61 76  ble;.    int sav
137c0 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20 61 7a 43  edMode;..    azC
137d0 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  ol = tableColumn
137e0 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c 65 29 3b  List(p, zTable);
137f0 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
13800 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45  0 ){.      p->nE
13810 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
13820 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
13830 20 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f 74 65   /* Always quote
13840 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c   the table name,
13850 20 65 76 65 6e 20 69 66 20 69 74 20 61 70 70 65   even if it appe
13860 61 72 73 20 74 6f 20 62 65 20 70 75 72 65 20 61  ars to be pure a
13870 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  scii,.    ** in 
13880 63 61 73 65 20 69 74 20 69 73 20 61 20 6b 65 79  case it is a key
13890 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53 45 52  word. Ex:  INSER
138a0 54 20 49 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e  T INTO "table" .
138b0 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  .. */.    initTe
138c0 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20  xt(&sTable);.   
138d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
138e0 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f  ble, zTable, quo
138f0 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b  teChar(zTable));
13900 0a 20 20 20 20 2f 2a 20 49 66 20 70 72 65 73 65  .    /* If prese
13910 72 76 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2c  rving the rowid,
13920 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20 6c 69   add a column li
13930 73 74 20 61 66 74 65 72 20 74 68 65 20 74 61 62  st after the tab
13940 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le name..    ** 
13950 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 20  In other words: 
13960 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61   "INSERT INTO ta
13970 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e  b(rowid,a,b,c,..
13980 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 0a  .) VALUES(...)".
13990 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f      ** instead o
139a0 66 20 74 68 65 20 75 73 75 61 6c 20 22 49 4e 53  f the usual "INS
139b0 45 52 54 20 49 4e 54 4f 20 74 61 62 20 56 41 4c  ERT INTO tab VAL
139c0 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  UES(...)"..    *
139d0 2f 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b  /.    if( azCol[
139e0 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65  0] ){.      appe
139f0 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
13a00 22 28 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  "(", 0);.      a
13a10 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
13a20 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b  e, azCol[0], 0);
13a30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
13a40 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
13a50 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
13a60 78 74 28 26 73 54 61 62 6c 65 2c 20 22 2c 22 2c  xt(&sTable, ",",
13a70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
13a80 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c  endText(&sTable,
13a90 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65   azCol[i], quote
13aa0 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b  Char(azCol[i]));
13ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13ac0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
13ad0 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20 20 20  e, ")", 0);.    
13ae0 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c 64 20  }..    /* Build 
13af0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 53  an appropriate S
13b00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13b10 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  */.    initText(
13b20 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 61  &sSelect);.    a
13b30 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
13b40 63 74 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30  ct, "SELECT ", 0
13b50 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
13b60 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70 70  [0] ){.      app
13b70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
13b80 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a  , azCol[0], 0);.
13b90 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
13ba0 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20  (&sSelect, ",", 
13bb0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
13bc0 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
13bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 70   i++){.      app
13be0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
13bf0 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74  , azCol[i], quot
13c00 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29  eChar(azCol[i]))
13c10 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f  ;.      if( azCo
13c20 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  l[i+1] ){.      
13c30 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
13c40 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a  elect, ",", 0);.
13c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c60 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74    freeColumnList
13c70 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  (azCol);.    app
13c80 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
13c90 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a  , " FROM ", 0);.
13ca0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
13cb0 73 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c  sSelect, zTable,
13cc0 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c   quoteChar(zTabl
13cd0 65 29 29 3b 0a 0a 20 20 20 20 73 61 76 65 64 44  e));..    savedD
13ce0 65 73 74 54 61 62 6c 65 20 3d 20 70 2d 3e 7a 44  estTable = p->zD
13cf0 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 73 61  estTable;.    sa
13d00 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  vedMode = p->mod
13d10 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54  e;.    p->zDestT
13d20 61 62 6c 65 20 3d 20 73 54 61 62 6c 65 2e 7a 3b  able = sTable.z;
13d30 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  .    p->mode = p
13d40 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  ->cMode = MODE_I
13d50 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20  nsert;.    rc = 
13d60 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
13d70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73 68 65  , sSelect.z, she
13d80 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  ll_callback, p, 
13d90 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  0);.    if( (rc&
13da0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
13db0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72  RRUPT ){.      r
13dc0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
13dd0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
13de0 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
13df0 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ***/\n");.      
13e00 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
13e10 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  r(p->db);.      
13e20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
13e30 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73 68 65  , sSelect.z, she
13e40 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  ll_callback, p, 
13e50 30 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65  0);.      toggle
13e60 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64  SelectOrder(p->d
13e70 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  b);.    }.    p-
13e80 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 61  >zDestTable = sa
13e90 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
13ea0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65    p->mode = save
13eb0 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65 65 54  dMode;.    freeT
13ec0 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20  ext(&sTable);.  
13ed0 20 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c    freeText(&sSel
13ee0 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
13ef0 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
13f00 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13f10 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72  ./*.** Run zQuer
13f20 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c  y.  Use dump_cal
13f30 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63  lback() as the c
13f40 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
13f50 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  so that.** the c
13f60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71  ontents of the q
13f70 75 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20  uery are output 
13f80 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  as SQL statement
13f90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67  s..**.** If we g
13fa0 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52  et a SQLITE_CORR
13fb0 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e  UPT error, rerun
13fc0 20 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72   the query after
13fd0 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f   appending.** "O
13fe0 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
13ff0 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a  SC" to the end..
14000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
14010 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
14020 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
14030 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  e *p,.  const ch
14040 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20  ar *zQuery.){.  
14050 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
14060 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d  zErr = 0;.  rc =
14070 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
14080 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d  >db, zQuery, dum
14090 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  p_callback, p, &
140a0 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  zErr);.  if( rc=
140b0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
140c0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51 32  ){.    char *zQ2
140d0 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  ;.    int len = 
140e0 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79 29  strlen30(zQuery)
140f0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
14100 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
14110 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52  * CORRUPTION ERR
14120 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b  OR *******/\n");
14130 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
14140 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
14150 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
14160 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  *** %s ******/\n
14170 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
14180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
14190 72 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  r);.      zErr =
141a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51   0;.    }.    zQ
141b0 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b  2 = malloc( len+
141c0 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  100 );.    if( z
141d0 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  Q2==0 ) return r
141e0 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
141f0 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c  nprintf(len+100,
14200 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20   zQ2, "%s ORDER 
14210 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
14220 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20  zQuery);.    rc 
14230 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
14240 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f  ->db, zQ2, dump_
14250 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45  callback, p, &zE
14260 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rr);.    if( rc 
14270 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
14280 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
14290 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20  ***** ERROR: %s 
142a0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
142b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
142c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
142d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
142e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
142f0 7a 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28  zErr);.    free(
14300 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zQ2);.  }.  retu
14310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14320 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d  Text of a help m
14330 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  essage.*/.static
14340 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a   char zHelp[] =.
14350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14360 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
14370 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46  N.  ".auth ON|OF
14380 46 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  F           Show
14390 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
143a0 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  backs\n".#endif.
143b0 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
143c0 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75 70  FILE      Backup
143d0 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
143e0 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e  ain\") to FILE\n
143f0 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66  ".  ".bail on|of
14400 66 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70  f           Stop
14410 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
14420 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
14430 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62 69 6e  t OFF\n".  ".bin
14440 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ary on|off      
14450 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f     Turn binary o
14460 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e  utput on or off.
14470 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22    Default OFF\n"
14480 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52  .  ".cd DIRECTOR
14490 59 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67  Y          Chang
144a0 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69  e the working di
144b0 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43  rectory to DIREC
144c0 54 4f 52 59 5c 6e 22 0a 20 20 22 2e 63 68 61 6e  TORY\n".  ".chan
144d0 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ges on|off      
144e0 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66    Show number of
144f0 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79   rows changed by
14500 20 53 51 4c 5c 6e 22 0a 20 20 22 2e 63 68 65 63   SQL\n".  ".chec
14510 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20  k GLOB          
14520 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74    Fail if output
14530 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65   since .testcase
14540 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 5c   does not match\
14550 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57  n".  ".clone NEW
14560 44 42 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f  DB           Clo
14570 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57  ne data into NEW
14580 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73  DB from the exis
14590 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c 6e 22  ting database\n"
145a0 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20  .  ".databases  
145b0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
145c0 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
145d0 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
145e0 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 62 69  bases\n".  ".dbi
145f0 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20  nfo ?DB?        
14600 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20 69     Show status i
14610 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
14620 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e 22   the database\n"
14630 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45  .  ".dump ?TABLE
14640 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20  ? ...      Dump 
14650 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
14660 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d  an SQL text form
14670 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  at\n".  "       
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
146a0 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20  fied, only dump 
146b0 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c  tables matching\
146c0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
146e0 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
146f0 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 6f  E.\n".  ".echo o
14700 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
14710 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68  Turn command ech
14720 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  o on or off\n". 
14730 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75   ".eqp on|off|fu
14740 6c 6c 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20  ll       Enable 
14750 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d  or disable autom
14760 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
14770 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65  RY PLAN\n".  ".e
14780 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  xit             
14790 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
147a0 72 6f 67 72 61 6d 5c 6e 22 0a 2f 2a 20 42 65 63  rogram\n"./* Bec
147b0 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64  ause explain mod
147c0 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d  e comes on autom
147d0 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68  atically now, th
147e0 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64  e ".explain" mod
147f0 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20  e.** is removed 
14800 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63  from the help sc
14810 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69  reen.  It is sti
14820 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ll supported for
14830 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72   legacy, however
14840 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20   */./*".explain 
14850 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54 75  ?on|off|auto? Tu
14860 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  rn EXPLAIN outpu
14870 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66  t mode on or off
14880 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63   or to automatic
14890 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63  \n"*/.  ".fullsc
148a0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
148b0 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20  Show schema and 
148c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73  the content of s
148d0 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65  qlite_stat table
148e0 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 73  s\n".  ".headers
148f0 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54   on|off        T
14900 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68  urn display of h
14910 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66  eaders on or off
14920 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20  \n".  ".help    
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
14940 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c  ow this message\
14950 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49  n".  ".import FI
14960 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70  LE TABLE     Imp
14970 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49  ort data from FI
14980 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22  LE into TABLE\n"
14990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
149a0 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f  OMIT_TEST_CONTRO
149b0 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49  L.  ".imposter I
149c0 4e 44 45 58 20 54 41 42 4c 45 20 20 43 72 65 61  NDEX TABLE  Crea
149d0 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
149e0 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78  e TABLE on index
149f0 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69 66   INDEX\n".#endif
14a00 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41  .  ".indexes ?TA
14a10 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f 77 20  BLE?       Show 
14a20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64  names of all ind
14a30 65 78 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  exes\n".  "     
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
14a60 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f  cified, only sho
14a70 77 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74 61  w indexes for ta
14a80 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  bles\n".  "     
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b      matching LIK
14ab0 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e  E pattern TABLE.
14ac0 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54  \n".#ifdef SQLIT
14ad0 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
14ae0 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c  .  ".iotrace FIL
14af0 45 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c  E          Enabl
14b00 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63  e I/O diagnostic
14b10 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45   logging to FILE
14b20 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  \n".#endif.  ".l
14b30 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41  imit ?LIMIT? ?VA
14b40 4c 3f 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20  L?   Display or 
14b50 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
14b60 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49   of an SQLITE_LI
14b70 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74 20  MIT\n".  ".lint 
14b80 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20  OPTIONS         
14b90 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61   Report potentia
14ba0 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e  l schema issues.
14bb0 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22   Options:\n".  "
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e           fkey-in
14be0 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d  dexes     Find m
14bf0 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  issing foreign k
14c00 65 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23 69  ey indexes\n".#i
14c10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14c20 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
14c30 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  .  ".load FILE ?
14c40 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20  ENTRY?     Load 
14c50 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62  an extension lib
14c60 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  rary\n".#endif. 
14c70 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20   ".log FILE|off 
14c80 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f           Turn lo
14c90 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e  gging on or off.
14ca0 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74    FILE can be st
14cb0 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20  derr/stdout\n". 
14cc0 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41   ".mode MODE ?TA
14cd0 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74  BLE?     Set out
14ce0 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d  put mode where M
14cf0 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e  ODE is one of:\n
14d00 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
14d20 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72  cii    Columns/r
14d30 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ows delimited by
14d40 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c 6e   0x1F and 0x1E\n
14d50 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73                cs
14d70 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70  v      Comma-sep
14d80 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22  arated values\n"
14d90 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
14db0 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e  umn   Left-align
14dc0 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65  ed columns.  (Se
14dd0 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22  e .width)\n".  "
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20           html   
14e00 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63    HTML <table> c
14e10 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ode\n".  "      
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20     insert   SQL 
14e40 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  insert statement
14e50 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20  s for TABLE\n". 
14e60 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
14e70 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20             line 
14e80 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65      One value pe
14e90 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20  r line\n".  "   
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56        list     V
14ec0 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20  alues delimited 
14ed0 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22 20  by \"|\"\n".  " 
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 20 71 75 6f 74 65 20 20 20          quote   
14f00 20 45 73 63 61 70 65 20 61 6e 73 77 65 72 73 20   Escape answers 
14f10 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20 20  as for SQL\n".  
14f20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
14f30 20 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20            tabs  
14f40 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
14f50 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20   values\n".  "  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20         tcl      
14f80 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  TCL list element
14f90 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c  s\n".  ".nullval
14fa0 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 55  ue STRING      U
14fb0 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61  se STRING in pla
14fc0 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65  ce of NULL value
14fd0 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 46 49  s\n".  ".once FI
14fe0 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 4f  LENAME         O
14ff0 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65  utput for the ne
15000 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f  xt SQL command o
15010 6e 6c 79 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c  nly to FILENAME\
15020 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54  n".  ".open ?OPT
15030 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43 6c 6f  IONS? ?FILE? Clo
15040 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  se existing data
15050 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20  base and reopen 
15060 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  FILE\n".  "     
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20 6f 70      The --new op
15090 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69 74 68  tion starts with
150a0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e   an empty file\n
150b0 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49  ".  ".output ?FI
150c0 4c 45 4e 41 4d 45 3f 20 20 20 20 20 53 65 6e 64  LENAME?     Send
150d0 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 4e   output to FILEN
150e0 41 4d 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e 22  AME or stdout\n"
150f0 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e  .  ".print STRIN
15100 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69 6e 74  G...       Print
15110 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47 5c   literal STRING\
15120 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41  n".  ".prompt MA
15130 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70  IN CONTINUE  Rep
15140 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64 61 72  lace the standar
15150 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22  d prompts\n".  "
15160 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20  .quit           
15170 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
15180 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e   program\n".  ".
15190 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20  read FILENAME   
151a0 20 20 20 20 20 20 45 78 65 63 75 74 65 20 53 51        Execute SQ
151b0 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  L in FILENAME\n"
151c0 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42  .  ".restore ?DB
151d0 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f  ? FILE     Resto
151e0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42  re content of DB
151f0 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
15200 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22  \") from FILE\n"
15210 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20  .  ".save FILE  
15220 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
15230 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15240 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22  ase into FILE\n"
15250 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f  .  ".scanstats o
15260 6e 7c 6f 66 66 20 20 20 20 20 20 54 75 72 6e 20  n|off      Turn 
15270 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
15280 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63  nstatus() metric
15290 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
152a0 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45   ".schema ?PATTE
152b0 52 4e 3f 20 20 20 20 20 20 53 68 6f 77 20 74 68  RN?      Show th
152c0 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
152d0 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54  nts matching PAT
152e0 54 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20 20 20  TERN\n".  "     
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 20 20 41 64 64 20 2d 2d 69 6e 64 65 6e       Add --inden
15310 74 20 66 6f 72 20 70 72 65 74 74 79 2d 70 72 69  t for pretty-pri
15320 6e 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73 65 6c  nting\n".  ".sel
15330 66 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f 20 20  ftest ?--init?  
15340 20 20 20 52 75 6e 20 74 65 73 74 73 20 64 65 66     Run tests def
15350 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46  ined in the SELF
15360 54 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a 20 20  TEST table\n".  
15370 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20  ".separator COL 
15380 3f 52 4f 57 3f 20 20 20 43 68 61 6e 67 65 20 74  ?ROW?   Change t
15390 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  he column separa
153a0 74 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c  tor and optional
153b0 6c 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20 20  ly the row\n".  
153c0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
153d0 20 20 20 20 20 20 20 20 20 20 73 65 70 61 72 61            separa
153e0 74 6f 72 20 66 6f 72 20 62 6f 74 68 20 74 68 65  tor for both the
153f0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64   output mode and
15400 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69 66 20   .import\n".#if 
15410 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
15420 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
15430 20 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44 20 2e   ".session CMD .
15440 2e 2e 20 20 20 20 20 20 20 43 72 65 61 74 65 20  ..       Create 
15450 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69  or control sessi
15460 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ons\n".#endif.  
15470 22 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f  ".sha3sum ?OPTIO
15480 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74 65 20  NS...?  Compute 
15490 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20 64  a SHA3 hash of d
154a0 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 5c  atabase content\
154b0 6e 22 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44  n".  ".shell CMD
154c0 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52 75 6e   ARGS...     Run
154d0 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
154e0 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e  a system shell\n
154f0 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20  ".  ".show      
15500 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
15510 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15520 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ues for various 
15530 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e  settings\n".  ".
15540 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
15550 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 73        Show stats
15560 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f   or turn stats o
15570 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
15580 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e  system CMD ARGS.
15590 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52  ..    Run CMD AR
155a0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
155b0 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 74  m shell\n".  ".t
155c0 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  ables ?TABLE?   
155d0 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
155e0 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22  of tables\n".  "
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
15610 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
15620 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20 6d 61  y list tables ma
15630 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
15660 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
15670 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20 20  .testcase NAME  
15680 20 20 20 20 20 20 20 42 65 67 69 6e 20 72 65 64         Begin red
15690 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20  irecting output 
156a0 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74  to 'testcase-out
156b0 2e 74 78 74 27 5c 6e 22 0a 20 20 22 2e 74 69 6d  .txt'\n".  ".tim
156c0 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20 20 20  eout MS         
156d0 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c     Try opening l
156e0 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72  ocked tables for
156f0 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   MS milliseconds
15700 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e  \n".  ".timer on
15710 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75  |off          Tu
15720 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20  rn SQL timer on 
15730 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72  or off\n".  ".tr
15740 61 63 65 20 46 49 4c 45 7c 6f 66 66 20 20 20 20  ace FILE|off    
15750 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68 20      Output each 
15760 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73  SQL statement as
15770 20 69 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20   it is run\n".  
15780 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20  ".vfsinfo ?AUX? 
15790 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61 74          Informat
157a0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74 6f  ion about the to
157b0 70 2d 6c 65 76 65 6c 20 56 46 53 5c 6e 22 0a 20  p-level VFS\n". 
157c0 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20   ".vfslist      
157d0 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c           List al
157e0 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65  l available VFSe
157f0 73 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d 65  s\n".  ".vfsname
15800 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 50   ?AUX?         P
15810 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66  rint the name of
15820 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 5c 6e   the VFS stack\n
15830 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31  ".  ".width NUM1
15840 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20   NUM2 ...   Set 
15850 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f  column widths fo
15860 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64  r \"column\" mod
15870 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   Negative values
158a0 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 5c 6e   right-justify\n
158b0 22 0a 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ".;..#if defined
158c0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
158d0 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50 72  ESSION)./*.** Pr
158e0 69 6e 74 20 68 65 6c 70 20 69 6e 66 6f 72 6d 61  int help informa
158f0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22 2e 73  tion for the ".s
15900 65 73 73 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e 64  essions" command
15910 0a 2a 2f 0a 76 6f 69 64 20 73 65 73 73 69 6f 6e  .*/.void session
15920 5f 68 65 6c 70 28 53 68 65 6c 6c 53 74 61 74 65  _help(ShellState
15930 20 2a 70 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e   *p){.  raw_prin
15940 74 66 28 70 2d 3e 6f 75 74 2c 0a 20 20 20 20 22  tf(p->out,.    "
15950 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20  .session ?NAME? 
15960 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53  SUBCOMMAND ?ARGS
15970 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20 22 49 66 20  ...?\n".    "If 
15980 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65  ?NAME? is omitte
15990 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65 66  d, the first def
159a0 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20  ined session is 
159b0 75 73 65 64 2e 5c 6e 22 0a 20 20 20 20 22 53 75  used.\n".    "Su
159c0 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20 20  bcommands:\n".  
159d0 20 20 22 20 20 20 61 74 74 61 63 68 20 54 41 42    "   attach TAB
159e0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41  LE             A
159f0 74 74 61 63 68 20 54 41 42 4c 45 5c 6e 22 0a 20  ttach TABLE\n". 
15a00 20 20 20 22 20 20 20 63 68 61 6e 67 65 73 65 74     "   changeset
15a10 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
15a20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
15a30 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  t into FILE\n". 
15a40 20 20 20 22 20 20 20 63 6c 6f 73 65 20 20 20 20     "   close    
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f  Close one sessio
15a70 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 65 6e 61  n\n".    "   ena
15a80 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20  ble ?BOOLEAN?   
15a90 20 20 20 20 20 20 53 65 74 20 6f 72 20 71 75 65        Set or que
15aa0 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69  ry the enable bi
15ab0 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 66 69 6c  t\n".    "   fil
15ac0 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20  ter GLOB...     
15ad0 20 20 20 20 20 20 52 65 6a 65 63 74 20 74 61 62        Reject tab
15ae0 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f  les matching GLO
15af0 42 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 6e  Bs\n".    "   in
15b00 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f  direct ?BOOLEAN?
15b10 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20 71         Mark or q
15b20 75 65 72 79 20 74 68 65 20 69 6e 64 69 72 65 63  uery the indirec
15b30 74 20 73 74 61 74 75 73 5c 6e 22 0a 20 20 20 20  t status\n".    
15b40 22 20 20 20 69 73 65 6d 70 74 79 20 20 20 20 20  "   isempty     
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75 65               Que
15b60 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20 73  ry whether the s
15b70 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 5c  ession is empty\
15b80 6e 22 0a 20 20 20 20 22 20 20 20 6c 69 73 74 20  n".    "   list 
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74      List current
15bb0 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20  ly open session 
15bc0 6e 61 6d 65 73 5c 6e 22 0a 20 20 20 20 22 20 20  names\n".    "  
15bd0 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20   open DB NAME   
15be0 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61            Open a
15bf0 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20   new session on 
15c00 44 42 5c 6e 22 0a 20 20 20 20 22 20 20 20 70 61  DB\n".    "   pa
15c10 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20 20  tchset FILE     
15c20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20 70         Write a p
15c30 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c  atchset into FIL
15c40 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64  E\n".  );.}.#end
15c50 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  if.../* Forward 
15c60 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
15c70 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
15c80 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65  input(ShellState
15c90 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a   *p, FILE *in);.
15ca0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
15cb0 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20  content of file 
15cc0 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  zName into memor
15cd0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
15ce0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
15cf0 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ().** and return
15d00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
15d10 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63 61  e buffer. The ca
15d20 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
15d30 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a  ble for freeing.
15d40 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a  ** the memory..*
15d50 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15d60 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20  r pnByte is not 
15d70 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20  NULL, (*pnByte) 
15d80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
15d90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
15da0 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
15db0 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20   convenience, a 
15dc0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
15dd0 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61 70  yte is always ap
15de0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61  pended to the da
15df0 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20  ta read.** from 
15e00 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  the file before 
15e10 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65  the buffer is re
15e20 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74  turned. This byt
15e30 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  e is not include
15e40 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61  d in.** the fina
15e50 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42  l value of (*pnB
15e60 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61  yte), if applica
15e70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20  ble..**.** NULL 
15e80 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
15e90 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
15ea0 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e  untered. The fin
15eb0 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42  al value of *pnB
15ec0 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69  yte.** is undefi
15ed0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
15ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
15ef0 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74   *readFile(const
15f00 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
15f10 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49  t *pnByte){.  FI
15f20 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  LE *in = fopen(z
15f30 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c  Name, "rb");.  l
15f40 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f  ong nIn;.  size_
15f50 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20  t nRead;.  char 
15f60 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d  *pBuf;.  if( in=
15f70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15f80 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45   fseek(in, 0, SE
15f90 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d  EK_END);.  nIn =
15fa0 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
15fb0 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66  wind(in);.  pBuf
15fc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
15fd0 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20  c64( nIn+1 );.  
15fe0 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20 72 65  if( pBuf==0 ) re
15ff0 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64 20  turn 0;.  nRead 
16000 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49  = fread(pBuf, nI
16010 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c  n, 1, in);.  fcl
16020 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e  ose(in);.  if( n
16030 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73  Read!=1 ){.    s
16040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75 66  qlite3_free(pBuf
16050 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
16060 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d  .  }.  pBuf[nIn]
16070 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79   = 0;.  if( pnBy
16080 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
16090 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75  In;.  return pBu
160a0 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  f;.}..#if define
160b0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
160c0 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43  SESSION)./*.** C
160d0 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70  lose a single Op
160e0 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  enSession object
160f0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
16100 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61 74   of its associat
16110 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e  ed.** resources.
16120 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16130 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70  session_close(Op
16140 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
16150 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ion){.  int i;. 
16160 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
16170 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d  delete(pSession-
16180 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  >p);.  sqlite3_f
16190 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e  ree(pSession->zN
161a0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ame);.  for(i=0;
161b0 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69   i<pSession->nFi
161c0 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lter; i++){.    
161d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
161e0 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
161f0 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
16200 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
16210 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d  ->azFilter);.  m
16220 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20  emset(pSession, 
16230 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65  0, sizeof(OpenSe
16240 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69  ssion));.}.#endi
16250 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  f../*.** Close a
16260 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f  ll OpenSession o
16270 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61  bjects and relea
16280 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  se all associate
16290 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  d resources..*/.
162a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
162b0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
162c0 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  N).static void s
162d0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
162e0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
162f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
16300 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69  i=0; i<p->nSessi
16310 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65  on; i++){.    se
16320 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e  ssion_close(&p->
16330 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20  aSession[i]);.  
16340 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  }.  p->nSession 
16350 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  = 0;.}.#else.# d
16360 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c  efine session_cl
16370 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69  ose_all(X).#endi
16380 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  f../*.** Impleme
16390 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
163a0 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20  Filter function 
163b0 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73  for an open sess
163c0 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e  ion.  Omit.** an
163d0 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62  y tables named b
163e0 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74  y ".session filt
163f0 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20  er" but let all 
16400 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f  other table thro
16410 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ugh..*/.#if defi
16420 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
16430 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
16440 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69  c int session_fi
16450 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c  lter(void *pCtx,
16460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
16470 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f  b){.  OpenSessio
16480 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f  n *pSession = (O
16490 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78  penSession*)pCtx
164a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
164b0 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e  (i=0; i<pSession
164c0 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b  ->nFilter; i++){
164d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
164e0 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f  _strglob(pSessio
164f0 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20  n->azFilter[i], 
16500 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72  zTab)==0 ) retur
16510 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
16520 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
16530 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
16540 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
16550 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e  pen.  If it is n
16560 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74  ot, then open it
16570 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74  .  If.** the dat
16580 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f  abase fails to o
16590 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72  pen, print an er
165a0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
165b0 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  exit..*/.static 
165c0 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65  void open_db(She
165d0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
165e0 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20 69 66  keepAlive){.  if
165f0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
16600 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61    sqlite3_initia
16610 6c 69 7a 65 28 29 3b 0a 20 20 20 20 73 71 6c 69  lize();.    sqli
16620 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  te3_open(p->zDbF
16630 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29  ilename, &p->db)
16640 3b 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d  ;.    globalDb =
16650 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
16660 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49  p->db==0 || SQLI
16670 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
16680 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
16690 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
166a0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
166b0 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
166c0 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
166d0 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
166e0 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
166f0 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
16700 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
16710 20 69 66 28 20 6b 65 65 70 41 6c 69 76 65 20 29   if( keepAlive )
16720 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 65   return;.      e
16730 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69  xit(1);.    }.#i
16740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16750 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
16760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
16770 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
16780 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65  on(p->db, 1);.#e
16790 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
167a0 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e  _fileio_init(p->
167b0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
167c0 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f  qlite3_shathree_
167d0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
167e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
167f0 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70  ompletion_init(p
16800 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66  ->db, 0, 0);.#if
16810 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
16820 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33  ZLIB.    sqlite3
16830 5f 63 6f 6d 70 72 65 73 73 5f 69 6e 69 74 28 70  _compress_init(p
16840 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  ->db, 0, 0);.#en
16850 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
16860 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
16870 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64  p->db, "shell_ad
16880 64 5f 73 63 68 65 6d 61 22 2c 20 32 2c 20 53 51  d_schema", 2, SQ
16890 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41            shellA
168c0 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c  ddSchemaName, 0,
168d0 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   0);.  }.}..#if 
168e0 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c  HAVE_READLINE ||
168f0 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f   HAVE_EDITLINE./
16900 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f  *.** Readline co
16910 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63  mpletion callbac
16920 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ks.*/.static cha
16930 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70  r *readline_comp
16940 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72  letion_generator
16950 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78  (const char *tex
16960 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20  t, int state){. 
16970 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
16980 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
16990 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20  .  char *zRet;. 
169a0 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b   if( state==0 ){
169b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
169c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
169d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
169e0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
169f0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
16a00 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
16a10 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
16a20 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16a40 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f    FROM completio
16a50 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59 20 31  n(%Q) ORDER BY 1
16a60 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71  ", text);.    sq
16a70 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16a80 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c  (globalDb, zSql,
16a90 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
16aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16ab0 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69  e(zSql);.  }.  i
16ac0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
16ad0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
16ae0 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d  OW ){.    zRet =
16af0 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63   strdup((const c
16b00 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
16b10 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
16b20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0));.  }else{.  
16b30 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
16b40 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ze(pStmt);.    p
16b50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52  Stmt = 0;.    zR
16b60 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
16b70 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61  turn zRet;.}.sta
16b80 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c  tic char **readl
16b90 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63  ine_completion(c
16ba0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
16bb0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
16bc0 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74  t iEnd){.  rl_at
16bd0 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69  tempted_completi
16be0 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72  on_over = 1;.  r
16bf0 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74  eturn rl_complet
16c00 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78  ion_matches(zTex
16c10 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70  t, readline_comp
16c20 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72  letion_generator
16c30 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45  );.}..#elif HAVE
16c40 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a  _LINENOISE./*.**
16c50 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c   Linenoise compl
16c60 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a  etion callback.*
16c70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
16c80 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69  nenoise_completi
16c90 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
16ca0 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43  Line, linenoiseC
16cb0 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b  ompletions *lc){
16cc0 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 28  .  int nLine = (
16cd0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65  int)strlen(zLine
16ce0 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61  );.  int i, iSta
16cf0 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rt;.  sqlite3_st
16d00 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
16d10 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
16d20 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a  har zBuf[1000];.
16d30 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69 7a  .  if( nLine>siz
16d40 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20 72  eof(zBuf)-30 ) r
16d50 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c 69  eturn;.  if( zLi
16d60 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72 65 74  ne[0]=='.' ) ret
16d70 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c 69  urn;.  for(i=nLi
16d80 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 69  ne-1; i>=0 && (i
16d90 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29  salnum(zLine[i])
16da0 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f   || zLine[i]=='_
16db0 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  '); i--){}.  if(
16dc0 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72 65   i==nLine-1 ) re
16dd0 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20 3d  turn;.  iStart =
16de0 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   i+1;.  memcpy(z
16df0 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74 61  Buf, zLine, iSta
16e00 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  rt);.  zSql = sq
16e10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
16e20 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63  ELECT DISTINCT c
16e30 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45  andidate COLLATE
16e40 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20   nocase".       
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65    "  FROM comple
16e70 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44 45  tion(%Q,%Q) ORDE
16e80 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20  R BY 1",.       
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74 5d    &zLine[iStart]
16eb0 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c 69  , zLine);.  sqli
16ec0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
16ed0 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d  lobalDb, zSql, -
16ee0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
16ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
16f00 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ql);.  sqlite3_e
16f10 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22 50  xec(globalDb, "P
16f20 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74  RAGMA page_count
16f30 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20  ", 0, 0, 0); /* 
16f40 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  Load the schema 
16f50 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  */.  while( sqli
16f60 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
16f70 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
16f80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16f90 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63 6f  Completion = (co
16fa0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
16fb0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
16fc0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74  tmt, 0);.    int
16fd0 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 73   nCompletion = s
16fe0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
16ff0 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  tes(pStmt, 0);. 
17000 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e 43     if( iStart+nC
17010 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a 65  ompletion < size
17020 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20 20  of(zBuf)-1 ){.  
17030 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2b      memcpy(zBuf+
17040 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65 74  iStart, zComplet
17050 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e  ion, nCompletion
17060 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  +1);.      linen
17070 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69 6f  oiseAddCompletio
17080 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20 20  n(lc, zBuf);.   
17090 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
170a0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
170b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
170c0 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20  * Do C-language 
170d0 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e  style dequoting.
170e0 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20 20  .**.**    \a    
170f0 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c  -> alarm.**    \
17100 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61 63  b    -> backspac
17110 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  e.**    \t    ->
17120 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
17130 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
17140 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74 69    \v    -> verti
17150 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c 66  cal tab.**    \f
17160 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65 64      -> form feed
17170 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20  .**    \r    -> 
17180 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a  carriage return.
17190 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20 73  **    \s    -> s
171a0 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20 20  pace.**    \"   
171b0 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20 20   -> ".**    \'  
171c0 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c 20    -> '.**    \\ 
171d0 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a     -> backslash.
171e0 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61  **    \NNN  -> a
171f0 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20 4e  scii character N
17200 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73  NN in octal.*/.s
17210 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
17220 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63  ve_backslashes(c
17230 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
17240 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  , j;.  char c;. 
17250 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
17260 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20  !='\\' ) z++;.  
17270 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20  for(i=j=0; (c = 
17280 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a  z[i])!=0; i++, j
17290 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
172a0 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21 3d  '\\' && z[i+1]!=
172b0 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a  0 ){.      c = z
172c0 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  [++i];.      if(
172d0 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20 20   c=='a' ){.     
172e0 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20 20     c = '\a';.   
172f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
17300 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'b' ){.        c
17310 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 7d   = '\b';.      }
17320 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20  else if( c=='t' 
17330 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
17340 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \t';.      }else
17350 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20   if( c=='n' ){. 
17360 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b         c = '\n';
17370 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17380 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20 20   c=='v' ){.     
17390 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20 20     c = '\v';.   
173a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
173b0 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'f' ){.        c
173c0 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20 7d   = '\f';.      }
173d0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27 20  else if( c=='r' 
173e0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
173f0 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \r';.      }else
17400 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
17410 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b 0a         c = '"';.
17420 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17430 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
17440 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20 20     c = '\'';.   
17450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
17460 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
17470 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20  c = '\\';.      
17480 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27  }else if( c>='0'
17490 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20   && c<='7' ){.  
174a0 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a        c -= '0';.
174b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
174c0 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
174d0 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
174e0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
174f0 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
17500 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
17510 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
17520 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
17530 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
17540 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
17550 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
17560 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
17570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17580 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17590 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a  }.    z[j] = c;.
175a0 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20    }.  if( j<i ) 
175b0 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  z[j] = 0;.}../*.
175c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
175d0 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64 65 63  lue of a hexadec
175e0 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74  imal digit.  Ret
175f0 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e  urn -1 if the in
17600 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  put.** is not a 
17610 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74  hex digit..*/.st
17620 61 74 69 63 20 69 6e 74 20 68 65 78 44 69 67 69  atic int hexDigi
17630 74 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a  tValue(char c){.
17640 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20    if( c>='0' && 
17650 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20  c<='9' ) return 
17660 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63  c - '0';.  if( c
17670 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20  >='a' && c<='f' 
17680 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27  ) return c - 'a'
17690 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d   + 10;.  if( c>=
176a0 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20  'A' && c<='F' ) 
176b0 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b  return c - 'A' +
176c0 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31   10;.  return -1
176d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
176e0 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20  pret zArg as an 
176f0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70  integer value, p
17700 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73 75 66  ossibly with suf
17710 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fixes..*/.static
17720 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
17730 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73  ntegerValue(cons
17740 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
17750 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
17760 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63   = 0;.  static c
17770 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 68  onst struct { ch
17780 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74  ar *zSuffix; int
17790 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b   iMult; } aMult[
177a0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42  ] = {.    { "KiB
177b0 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  ", 1024 },.    {
177c0 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "MiB", 1024*102
177d0 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22  4 },.    { "GiB"
177e0 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34  , 1024*1024*1024
177f0 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20   },.    { "KB", 
17800 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22   1000 },.    { "
17810 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c  MB",  1000000 },
17820 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30  .    { "GB",  10
17830 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
17840 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c  { "K",   1000 },
17850 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30  .    { "M",   10
17860 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
17870 47 22 2c 20 20 20 31 30 30 30 30 30 30 30 30 30  G",   1000000000
17880 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
17890 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20  ;.  int isNeg = 
178a0 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  0;.  if( zArg[0]
178b0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e  =='-' ){.    isN
178c0 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67  eg = 1;.    zArg
178d0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
178e0 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a  zArg[0]=='+' ){.
178f0 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a      zArg++;.  }.
17900 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
17910 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
17920 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b  x' ){.    int x;
17930 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a  .    zArg += 2;.
17940 20 20 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20      while( (x = 
17950 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
17960 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20  rg[0]))>=0 ){.  
17970 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b      v = (v<<4) +
17980 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b   x;.      zArg++
17990 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
179a0 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69  .    while( IsDi
179b0 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a  git(zArg[0]) ){.
179c0 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
179d0 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a   zArg[0] - '0';.
179e0 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20        zArg++;.  
179f0 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
17a00 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
17a10 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Mult); i++){.   
17a20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
17a30 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53  icmp(aMult[i].zS
17a40 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20  uffix, zArg)==0 
17a50 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d  ){.      v *= aM
17a60 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20  ult[i].iMult;.  
17a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17a80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73  .  }.  return is
17a90 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a  Neg? -v : v;.}..
17aa0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
17ab0 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20 61  zArg as either a
17ac0 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62  n integer or a b
17ad0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52  oolean value.  R
17ae0 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20  eturn 1 or 0.** 
17af0 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c  for TRUE and FAL
17b00 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  SE.  Return the 
17b10 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 66  integer value if
17b20 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
17b30 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c  .static int bool
17b40 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  eanValue(const c
17b50 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e  har *zArg){.  in
17b60 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  t i;.  if( zArg[
17b70 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  0]=='0' && zArg[
17b80 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66  1]=='x' ){.    f
17b90 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74  or(i=2; hexDigit
17ba0 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d  Value(zArg[i])>=
17bb0 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73  0; i++){}.  }els
17bc0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
17bd0 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20  zArg[i]>='0' && 
17be0 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b  zArg[i]<='9'; i+
17bf0 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69  +){}.  }.  if( i
17c00 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30  >0 && zArg[i]==0
17c10 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28   ) return (int)(
17c20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72  integerValue(zAr
17c30 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  g) & 0xffffffff)
17c40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
17c50 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
17c60 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  n")==0 || sqlite
17c70 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
17c80 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yes")==0 ){.    
17c90 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
17ca0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
17cb0 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29  cmp(zArg, "off")
17cc0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
17cd0 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22  tricmp(zArg,"no"
17ce0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
17cf0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38  rn 0;.  }.  utf8
17d00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
17d10 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f  "ERROR: Not a bo
17d20 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25  olean value: \"%
17d30 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22  s\". Assuming \"
17d40 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  no\".\n",.      
17d50 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74      zArg);.  ret
17d60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17d70 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73  Set or clear a s
17d80 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64  hell flag accord
17d90 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e  ing to a boolean
17da0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
17db0 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61  c void setOrClea
17dc0 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65  rFlag(ShellState
17dd0 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46   *p, unsigned mF
17de0 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  lag, const char 
17df0 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f  *zArg){.  if( bo
17e00 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29  oleanValue(zArg)
17e10 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74   ){.    ShellSet
17e20 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
17e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65    }else{.    She
17e40 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d  llClearFlag(p, m
17e50 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Flag);.  }.}../*
17e60 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74  .** Close an out
17e70 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69  put file, assumi
17e80 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64  ng it is not std
17e90 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f  err or stdout.*/
17ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
17eb0 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46  put_file_close(F
17ec0 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66  ILE *f){.  if( f
17ed0 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26   && f!=stdout &&
17ee0 20 66 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c   f!=stderr ) fcl
17ef0 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(f);.}../*.**
17f00 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20   Try to open an 
17f10 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54  output file.   T
17f20 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74  he names "stdout
17f30 22 20 61 6e 64 20 22 73 74 64 65 72 72 22 20 61  " and "stderr" a
17f40 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64  re.** recognized
17f50 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68   and do the righ
17f60 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69  t thing.  NULL i
17f70 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
17f80 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65  e output.** file
17f90 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a  name is "off"..*
17fa0 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f  /.static FILE *o
17fb0 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
17fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
17fd0 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20  e){.  FILE *f;. 
17fe0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
17ff0 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29  e,"stdout")==0 )
18000 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74  {.    f = stdout
18010 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
18020 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64  rcmp(zFile, "std
18030 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  err")==0 ){.    
18040 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65  f = stderr;.  }e
18050 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
18060 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20  File, "off")==0 
18070 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20  ){.    f = 0;.  
18080 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66  }else{.    f = f
18090 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22  open(zFile, "wb"
180a0 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20  );.    if( f==0 
180b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
180c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
180d0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
180e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
180f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
18100 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66  return f;.}..#if
18110 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18120 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a 23 69 66  _UNTESTABLE).#if
18130 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18140 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
18150 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18160 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
18170 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75  INT)./*.** A rou
18180 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e  tine for handlin
18190 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71  g output from sq
181a0 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a  lite3_trace()..*
181b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
181c0 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28  _trace_callback(
181d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70  .  unsigned mTyp
181e0 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  e,.  void *pArg,
181f0 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20 76  .  void *pP,.  v
18200 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49 4c  oid *pX.){.  FIL
18210 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41  E *f = (FILE*)pA
18220 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rg;.  UNUSED_PAR
18230 41 4d 45 54 45 52 28 6d 54 79 70 65 29 3b 0a 20  AMETER(mType);. 
18240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18250 52 28 70 50 29 3b 0a 20 20 69 66 28 20 66 20 29  R(pP);.  if( f )
18260 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
18270 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61   *z = (const cha
18280 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74 20 69  r*)pX;.    int i
18290 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
182a0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  );.    while( i>
182b0 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27  0 && z[i-1]==';'
182c0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 75   ){ i--; }.    u
182d0 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20 22 25  tf8_printf(f, "%
182e0 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a  .*s;\n", i, z);.
182f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18300 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
18310 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72  ./*.** A no-op r
18320 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75 6e 73  outine that runs
18330 20 77 69 74 68 20 74 68 65 20 22 2e 62 72 65 61   with the ".brea
18340 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d  kpoint" doc-comm
18350 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  and.  This is.**
18360 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74 20 74   a useful spot t
18370 6f 20 73 65 74 20 61 20 64 65 62 75 67 67 65 72  o set a debugger
18380 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
18390 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
183a0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64  _breakpoint(void
183b0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
183c0 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61  nCall = 0;.  nCa
183d0 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ll++;.}../*.** A
183e0 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  n object used to
183f0 20 72 65 61 64 20 61 20 43 53 56 20 61 6e 64 20   read a CSV and 
18400 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f 72 20  other files for 
18410 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64  import..*/.typed
18420 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f 72 74  ef struct Import
18430 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73  Ctx ImportCtx;.s
18440 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
18450 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
18460 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  zFile;  /* Name 
18470 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
18480 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  e */.  FILE *in;
18490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
184a0 61 64 20 74 68 65 20 43 53 56 20 74 65 78 74 20  ad the CSV text 
184b0 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
184c0 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72  stream */.  char
184d0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
184e0 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74  /* Accumulated t
184f0 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20  ext for a field 
18500 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
18510 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18520 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
18530 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
18540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18550 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
18560 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c   z[] */.  int nL
18570 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ine;          /*
18580 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75   Current line nu
18590 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e  mber */.  int bN
185a0 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20 2f 2a  otFirst;      /*
185b0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20   True if one or 
185c0 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72 65 61  more bytes alrea
185d0 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  dy read */.  int
185e0 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   cTerm;         
185f0 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 74 68   /* Character th
18600 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20 74 68  at terminated th
18610 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 66 69  e most recent fi
18620 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f  eld */.  int cCo
18630 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  lSep;        /* 
18640 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  The column separ
18650 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
18660 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a   (Usually ",") *
18670 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65 70 3b  /.  int cRowSep;
18680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
18690 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
186a0 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
186b0 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f  y "\n") */.};../
186c0 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
186d0 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f  e byte to z[] */
186e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70  .static void imp
186f0 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
18700 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e  ImportCtx *p, in
18710 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  t c){.  if( p->n
18720 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  +1>=p->nAlloc ){
18730 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  .    p->nAlloc +
18740 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30  = p->nAlloc + 10
18750 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71  0;.    p->z = sq
18760 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
18770 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
18780 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  ;.    if( p->z==
18790 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
187a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
187b0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
187c0 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
187d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
187e0 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61  z[p->n++] = (cha
187f0 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  r)c;.}../* Read 
18800 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
18810 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d  f CSV text.  Com
18820 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63  patible with rfc
18830 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65  4180 and extende
18840 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70  d.** with the op
18850 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61  tion of having a
18860 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72   separator other
18870 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a   than ","..**.**
18880 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
18890 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
188a0 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
188b0 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
188c0 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
188d0 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
188e0 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
188f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
18900 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
18910 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
18920 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
18930 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
18940 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20   is ","..**   + 
18950 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
18960 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
18970 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
18980 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20  is "\n"..**   + 
18990 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
189a0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
189b0 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
189c0 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
189d0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
189e0 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
189f0 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
18a00 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
18a10 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
18a20 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
18a30 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
18a40 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
18a50 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
18a60 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f  CDECL csv_read_o
18a70 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
18a80 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
18a90 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
18aa0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
18ab0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
18ac0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
18ad0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
18ae0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
18af0 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
18b00 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
18b10 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
18b20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
18b30 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
18b40 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69  t pc, ppc;.    i
18b50 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70  nt startLine = p
18b60 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74  ->nLine;.    int
18b70 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20   cQuote = c;.   
18b80 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20   pc = ppc = 0;. 
18b90 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
18ba0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
18bb0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
18bc0 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c   c==rSep ) p->nL
18bd0 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
18be0 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20   c==cQuote ){.  
18bf0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
18c00 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
18c10 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    pc = 0;.      
18c20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18c40 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53        if( (c==cS
18c50 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
18c60 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
18c70 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  rSep && pc==cQuo
18c80 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
18c90 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c  ==rSep && pc=='\
18ca0 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74  r' && ppc==cQuot
18cb0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
18cc0 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f  =EOF && pc==cQuo
18cd0 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  te).      ){.   
18ce0 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b       do{ p->n--;
18cf0 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d   }while( p->z[p-
18d00 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20  >n]!=cQuote );. 
18d10 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
18d20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
18d30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18d40 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
18d50 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20   && c!='\r' ){. 
18d60 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
18d70 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
18d80 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20  d: unescaped %c 
18d90 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20  character\n",.  
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
18db0 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65  >zFile, p->nLine
18dc0 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  , cQuote);.     
18dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
18de0 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75  EOF ){.        u
18df0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
18e00 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72  r, "%s:%d: unter
18e10 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65  minated %c-quote
18e20 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20  d field\n",.    
18e30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
18e40 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
18e50 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
18e60 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
18e70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70       }.      imp
18e90 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
18ea0 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63  p, c);.      ppc
18eb0 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20   = pc;.      pc 
18ec0 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = c;.    }.  }el
18ed0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
18ee0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
18ef0 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73  field being pars
18f00 65 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73  ed and it begins
18f10 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
18f20 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45   UTF-8 BOM  (0xE
18f30 46 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b  F BB BF) then sk
18f40 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20  ip the BOM */.  
18f50 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
18f60 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46  0xef && p->bNotF
18f70 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
18f80 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
18f90 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
18fa0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
18fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26  );.      if( (c&
18fc0 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20  0xff)==0xbb ){. 
18fd0 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70         import_ap
18fe0 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
18ff0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65  .        c = fge
19000 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
19010 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
19020 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20  =0xbf ){.       
19030 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20     p->bNotFirst 
19040 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
19050 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
19060 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65     return csv_re
19070 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b  ad_one_field(p);
19080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19090 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69   }.    }.    whi
190a0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
190b0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
190c0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
190d0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
190e0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
190f0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
19100 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65  }.    if( c==rSe
19110 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  p ){.      p->nL
19120 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
19130 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b   p->n>0 && p->z[
19140 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  p->n-1]=='\r' ) 
19150 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  p->n--;.    }.  
19160 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
19170 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29    }.  if( p->z )
19180 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
19190 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20  .  p->bNotFirst 
191a0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 1;.  return p-
191b0 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  >z;.}../* Read a
191c0 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
191d0 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64   ASCII delimited
191e0 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b   text..**.**   +
191f0 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
19200 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
19210 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
19220 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
19230 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
19240 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
19250 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
19260 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
19270 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
19280 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
19290 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
192a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
192b0 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1F"..**   +  
192c0 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
192d0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
192e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
192f0 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b  s "\x1E"..**   +
19300 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
19310 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69  the row number i
19320 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
19330 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
19340 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
19350 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
19360 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
19370 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
19380 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
19390 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
193a0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
193b0 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
193c0 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
193d0 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64  CDECL ascii_read
193e0 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
193f0 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
19400 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
19410 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
19420 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
19430 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
19440 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
19450 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
19460 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
19470 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
19480 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
19490 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68  turn 0;.  }.  wh
194a0 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
194b0 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65  !=cSep && c!=rSe
194c0 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f  p ){.    import_
194d0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
194e0 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63  );.    c = fgetc
194f0 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69  (p->in);.  }.  i
19500 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
19510 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
19520 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63  }.  p->cTerm = c
19530 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  ;.  if( p->z ) p
19540 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
19550 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
19560 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
19570 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20  ansfer data for 
19580 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49  table zTable.  I
19590 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
195a0 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69  en while.** movi
195b0 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20  ng forward, try 
195c0 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e  to go backwards.
195d0 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20    The backwards 
195e0 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a  movement won't.*
195f0 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f  * work for WITHO
19600 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
19610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19620 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a  tryToCloneData(.
19630 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
19640 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
19650 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
19660 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c  *zTable.){.  sql
19670 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
19680 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
19690 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
196a0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
196b0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
196c0 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  zInsert = 0;.  i
196d0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
196e0 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62  j, n;.  int nTab
196f0 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  le = (int)strlen
19700 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20  (zTable);.  int 
19710 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74  k = 0;.  int cnt
19720 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e   = 0;.  const in
19730 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30 30  t spinRate = 100
19740 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20  00;..  zQuery = 
19750 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19760 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
19770 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b  "%w\"", zTable);
19780 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19790 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
197a0 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
197b0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28  Query, 0);.  if(
197c0 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
197d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
197e0 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20  Error %d: %s on 
197f0 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
19800 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74       sqlite3_ext
19810 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d  ended_errcode(p-
19820 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  >db), sqlite3_er
19830 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20  rmsg(p->db),.   
19840 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
19850 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64  ;.    goto end_d
19860 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ata_xfer;.  }.  
19870 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
19880 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72 79 29  mn_count(pQuery)
19890 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20 73 71  ;.  zInsert = sq
198a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32  lite3_malloc64(2
198b0 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a  00 + nTable + n*
198c0 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65 72  3);.  if( zInser
198d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  t==0 ){.    raw_
198e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
198f0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
19900 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
19910 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
19920 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
19930 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e  f(200+nTable,zIn
19940 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sert,.          
19950 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
19960 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
19970 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28 3f 22  \"%s\" VALUES(?"
19980 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d  , zTable);.  i =
19990 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 49 6e   (int)strlen(zIn
199a0 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31  sert);.  for(j=1
199b0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<n; j++){.   
199c0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
199d0 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20  i, ",?", 2);.   
199e0 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d   i += 2;.  }.  m
199f0 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c  emcpy(zInsert+i,
19a00 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20   ");", 3);.  rc 
19a10 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
19a20 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73  e_v2(newDb, zIns
19a30 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72  ert, -1, &pInser
19a40 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
19a50 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
19a60 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
19a70 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
19a80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19a90 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
19aa0 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29  d_errcode(newDb)
19ab0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
19ac0 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
19ad0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
19ae0 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
19af0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  xfer;.  }.  for(
19b00 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a  k=0; k<2; k++){.
19b10 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
19b20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
19b30 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
19b40 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  OW ){.      for(
19b50 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
19b60 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
19b70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
19b80 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29  ype(pQuery, i) )
19b90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
19ba0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
19bc0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49  te3_bind_null(pI
19bd0 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20  nsert, i+1);.   
19be0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19c00 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
19c10 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
19c20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19c30 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73  _bind_int64(pIns
19c40 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
19c50 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
19c60 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
19c70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19c90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19ca0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
19cb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
19cc0 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74  d_double(pInsert
19cd0 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
19ce0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75  olumn_double(pQu
19cf0 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  ery,i));.       
19d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19d20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19d30 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  XT: {.          
19d40 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
19d50 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ext(pInsert, i+1
19d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19d80 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
19d90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
19da0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
19dd0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
19de0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19df0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19e00 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
19e10 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
19e20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
19e30 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20  d_blob(pInsert, 
19e40 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
19e50 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c  umn_blob(pQuery,
19e60 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
19ea0 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a  ytes(pQuery,i),.
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
19ee0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
19ef0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19f00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19f10 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
19f20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  End for */.     
19f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
19f40 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
19f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19f60 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
19f70 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51  TE_ROW && rc!=SQ
19f80 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
19f90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
19fa0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
19fb0 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  %d: %s\n", sqlit
19fc0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
19fd0 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  ode(newDb),.    
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
1a000 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20  sg(newDb));.    
1a010 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1a020 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29  3_reset(pInsert)
1a030 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ;.      cnt++;. 
1a040 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70       if( (cnt%sp
1a050 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  inRate)==0 ){.  
1a060 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63        printf("%c
1a070 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e  \b", "|/-\\"[(cn
1a080 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b  t/spinRate)%4]);
1a090 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
1a0a0 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  stdout);.      }
1a0b0 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68  .    } /* End wh
1a0c0 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ile */.    if( r
1a0d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1a0e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
1a0f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
1a100 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
1a110 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
1a120 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
1a130 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1a140 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
1a150 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  \" ORDER BY rowi
1a160 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20  d DESC;",.      
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a         zTable);.
1a190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a1a0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1a1b0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1a1c0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1a1d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1a1e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1a1f0 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61  rr, "Warning: ca
1a200 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22  nnot step \"%s\"
1a210 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61   backwards", zTa
1a220 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
1a230 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20  k;.    }.  } /* 
1a240 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20  End for(k=0...) 
1a250 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65  */..end_data_xfe
1a260 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
1a270 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
1a280 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1a290 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71  e(pInsert);.  sq
1a2a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1a2b0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
1a2c0 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a  ee(zInsert);.}..
1a2d0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
1a2e0 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20  ansfer all rows 
1a2f0 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68  of the schema th
1a300 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e  at match zWhere.
1a310 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f    For.** each ro
1a320 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61  w, invoke xForEa
1a330 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65  ch() on the obje
1a340 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ct defined by th
1a350 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e  at row..** If an
1a360 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1a370 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69  tered while movi
1a380 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75  ng forward throu
1a390 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  gh the.** sqlite
1a3a0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74  _master table, t
1a3b0 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20  ry again moving 
1a3c0 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74  backwards..*/.st
1a3d0 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
1a3e0 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68  loneSchema(.  Sh
1a3f0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
1a400 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
1a410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68   const char *zWh
1a420 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ere,.  void (*xF
1a430 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61  orEach)(ShellSta
1a440 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e  te*,sqlite3*,con
1a450 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
1a460 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
1a470 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ery = 0;.  char 
1a480 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69  *zQuery = 0;.  i
1a490 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75  nt rc;.  const u
1a4a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e  nsigned char *zN
1a4b0 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ame;.  const uns
1a4c0 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c  igned char *zSql
1a4d0 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1a4e0 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79  g = 0;..  zQuery
1a4f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1a500 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
1a510 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
1a520 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c      " WHERE %s",
1a550 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d   zWhere);.  rc =
1a560 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a570 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1a580 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1a590 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1a5a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1a5b0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1a5c0 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
1a5d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a5e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a5f0 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1a600 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1a610 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1a640 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
1a650 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69  _xfer;.  }.  whi
1a660 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
1a670 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
1a680 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1a690 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1a6a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1a6b0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a  Query, 0);.    z
1a6c0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Sql = sqlite3_co
1a6d0 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
1a6e0 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 1);.    printf
1a6f0 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
1a700 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
1a710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1a720 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
1a730 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
1a740 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
1a750 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
1a760 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1a770 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1a780 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
1a790 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
1a7a0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
1a7b0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1a7c0 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67  );.      zErrMsg
1a7d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a7e0 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
1a7f0 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
1a800 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
1a810 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
1a820 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
1a830 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  done\n");.  }.  
1a840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
1a850 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ONE ){.    sqlit
1a860 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1a870 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1a880 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1a890 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1a8a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1a8b0 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
1a8c0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1a8d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a8f0 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20   WHERE %s ORDER 
1a900 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
1a910 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20  zWhere);.    rc 
1a920 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1a930 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
1a940 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
1a950 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1a960 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1a970 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1a980 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
1a990 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a9b0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1a9c0 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
1a9d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1a9e0 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
1aa00 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ery);.      goto
1aa10 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
1aa20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
1aa30 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1aa40 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1aa50 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1aa60 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1aa70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1aa80 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1aa90 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1aaa0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
1aab0 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ery, 1);.      p
1aac0 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
1aad0 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
1aae0 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  tdout);.      sq
1aaf0 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
1ab00 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
1ab10 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
1ab20 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Msg);.      if( 
1ab30 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
1ab40 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1ab50 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
1ab60 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
1ab70 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
1ab80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ab90 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
1aba0 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20          zErrMsg 
1abb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1abc0 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
1abd0 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45  ){.        xForE
1abe0 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
1abf0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
1ac00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ac10 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
1ac20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  );.    }.  }.end
1ac30 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20  _schema_xfer:.  
1ac40 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1ac50 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
1ac60 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1ac70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1ac80 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66  a new database f
1ac90 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44  ile named "zNewD
1aca0 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f  b".  Try to reco
1acb0 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f  ver as much info
1acc0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f  rmation.** as po
1acd0 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68  ssible out of th
1ace0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1acf0 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20  (which might be 
1ad00 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69  corrupt) and wri
1ad10 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e  te it.** into zN
1ad20 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ewDb..*/.static 
1ad30 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28  void tryToClone(
1ad40 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
1ad50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44  onst char *zNewD
1ad60 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
1ad70 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d  sqlite3 *newDb =
1ad80 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73   0;.  if( access
1ad90 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b  (zNewDb,0)==0 ){
1ada0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1adb0 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c  (stderr, "File \
1adc0 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78  "%s\" already ex
1add0 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62  ists.\n", zNewDb
1ade0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1adf0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1ae00 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26  3_open(zNewDb, &
1ae10 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63  newDb);.  if( rc
1ae20 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1ae30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
1ae40 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75  not create outpu
1ae50 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  t database: %s\n
1ae60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
1ae70 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
1ae80 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wDb));.  }else{.
1ae90 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1aea0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
1aeb0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
1aec0 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ON;", 0, 0, 0);.
1aed0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1aee0 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45  (newDb, "BEGIN E
1aef0 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30  XCLUSIVE;", 0, 0
1af00 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  , 0);.    tryToC
1af10 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
1af20 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c  wDb, "type='tabl
1af30 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44  e'", tryToCloneD
1af40 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  ata);.    tryToC
1af50 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
1af60 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62  wDb, "type!='tab
1af70 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  le'", 0);.    sq
1af80 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
1af90 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20  , "COMMIT;", 0, 
1afa0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1afb0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
1afc0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
1afd0 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
1afe0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
1aff0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44  lite3_close(newD
1b000 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
1b010 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
1b020 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
1b030 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
1b040 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53  d output_reset(S
1b050 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
1b060 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b   if( p->outfile[
1b070 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64  0]=='|' ){.#ifnd
1b080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
1b090 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28  OPEN.    pclose(
1b0a0 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a  p->out);.#endif.
1b0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74    }else{.    out
1b0c0 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70  put_file_close(p
1b0d0 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70 2d  ->out);.  }.  p-
1b0e0 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b  >outfile[0] = 0;
1b0f0 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f  .  p->out = stdo
1b100 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  ut;.}../*.** Run
1b110 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20   an SQL command 
1b120 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
1b130 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65  ingle integer re
1b140 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
1b150 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c  int db_int(Shell
1b160 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
1b170 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73  char *zSql){.  s
1b180 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1b190 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  mt;.  int res = 
1b1a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  0;.  sqlite3_pre
1b1b0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
1b1c0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1b1d0 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74   0);.  if( pStmt
1b1e0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
1b1f0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
1b200 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  ROW ){.    res =
1b210 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1b220 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20  int(pStmt,0);.  
1b230 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
1b240 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72  lize(pStmt);.  r
1b250 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1b260 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d  .** Convert a 2-
1b270 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62  byte or 4-byte b
1b280 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b290 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20  r into a native 
1b2a0 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69  integer.*/.stati
1b2b0 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67  c unsigned int g
1b2c0 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67  et2byteInt(unsig
1b2d0 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
1b2e0 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29  return (a[0]<<8)
1b2f0 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69   + a[1];.}.stati
1b300 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67  c unsigned int g
1b310 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67  et4byteInt(unsig
1b320 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
1b330 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34  return (a[0]<<24
1b340 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b  ) + (a[1]<<16) +
1b350 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33   (a[2]<<8) + a[3
1b360 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ];.}../*.** Impl
1b370 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1b380 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e  e ".info" comman
1b390 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
1b3a0 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f  1 on error, 2 to
1b3b0 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68   exit, and 0 oth
1b3c0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1b3d0 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e  c int shell_dbin
1b3e0 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c  fo_command(Shell
1b3f0 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41  State *p, int nA
1b400 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
1b410 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1b420 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
1b430 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e   char *zName; in
1b440 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64  t ofst; } aField
1b450 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66  [] = {.     { "f
1b460 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
1b470 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20  er:",  24  },.  
1b480 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70     { "database p
1b490 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38  age count:",  28
1b4a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65    },.     { "fre
1b4b0 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74  elist page count
1b4c0 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20  :",  36  },.    
1b4d0 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69   { "schema cooki
1b4e0 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20  e:",        40  
1b4f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
1b500 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20  a format:",     
1b510 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b     44  },.     {
1b520 20 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20   "default cache 
1b530 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c  size:",   48  },
1b540 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63  .     { "autovac
1b550 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20  uum top root:", 
1b560 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   52  },.     { "
1b570 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1b580 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20  um:",   64  },. 
1b590 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f      { "text enco
1b5a0 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35  ding:",        5
1b5b0 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73  6  },.     { "us
1b5c0 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  er version:",   
1b5d0 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20        60  },.   
1b5e0 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e    { "application
1b5f0 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20   id:",       68 
1b600 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74   },.     { "soft
1b610 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20  ware version:", 
1b620 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a      96  },.  };.
1b630 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1b640 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68  truct { const ch
1b650 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74  ar *zName; const
1b660 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61   char *zSql; } a
1b670 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20  Query[] = {.    
1b680 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61   { "number of ta
1b690 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  bles:",.       "
1b6a0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1b6b0 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
1b6c0 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20  pe='table'" },. 
1b6d0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1b6e0 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20   indexes:",.    
1b6f0 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
1b700 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
1b710 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20  E type='index'" 
1b720 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65  },.     { "numbe
1b730 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c  r of triggers:",
1b740 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1b750 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
1b760 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69   WHERE type='tri
1b770 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b  gger'" },.     {
1b780 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77   "number of view
1b790 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
1b7a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1b7b0 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
1b7c0 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20  'view'" },.     
1b7d0 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22  { "schema size:"
1b7e0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
1b7f0 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71   total(length(sq
1b800 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a  l)) FROM %s" },.
1b810 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
1b820 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62  char *zSchemaTab
1b830 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  ;.  char *zDb = 
1b840 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b  nArg>=2 ? azArg[
1b850 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73  1] : "main";.  s
1b860 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1b870 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  mt = 0;.  unsign
1b880 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30  ed char aHdr[100
1b890 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  ];.  open_db(p, 
1b8a0 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  0);.  if( p->db=
1b8b0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1b8c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1b8d0 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45 43  _v2(p->db,"SELEC
1b8e0 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69  T data FROM sqli
1b8f0 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48  te_dbpage(?1) WH
1b900 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20  ERE pgno=1",.   
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
1b930 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
1b940 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
1b950 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
1b960 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
1b970 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b980 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
1b990 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
1b9a0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1b9b0 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
1b9c0 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
1b9d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1b9e0 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
1b9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
1ba00 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1ba10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
1ba20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
1ba30 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
1ba40 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
1ba50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1ba60 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1ba70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1ba80 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
1ba90 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
1baa0 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
1bab0 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
1bac0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1bad0 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
1bae0 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
1baf0 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
1bb00 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1bb10 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
1bb20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
1bb30 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
1bb40 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1bb50 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
1bb60 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
1bb70 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
1bb80 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1bb90 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
1bba0 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
1bbb0 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
1bbc0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
1bbd0 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
1bbe0 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
1bbf0 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
1bc00 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
1bc10 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
1bc20 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
1bc30 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
1bc40 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
1bc50 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
1bc60 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
1bc70 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
1bc80 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
1bc90 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
1bca0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1bcb0 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
1bcc0 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
1bcd0 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
1bce0 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
1bcf0 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
1bd00 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
1bd10 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1bd20 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
1bd30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bd40 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
1bd50 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
1bd60 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
1bd70 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
1bd80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1bd90 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
1bda0 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
1bdb0 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
1bdc0 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
1bdd0 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
1bde0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1bdf0 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
1be00 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
1be10 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
1be20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1be30 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
1be40 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
1be50 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1be60 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
1be70 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
1be80 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
1be90 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
1bea0 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
1beb0 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
1bec0 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
1bed0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
1bee0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1bef0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1bf00 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1bf10 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
1bf20 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
1bf30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1bf40 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 72  zSchemaTab);.  r
1bf50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1bf60 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72  * Print the curr
1bf70 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ent sqlite3_errm
1bf80 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74  sg() value to st
1bf90 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
1bfa0 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
1bfb0 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
1bfc0 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ror(sqlite3 *db)
1bfd0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1bfe0 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
1bff0 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66  rrmsg(db);.  utf
1c000 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1c010 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
1c020 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  zErr);.  return 
1c030 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  1;.}../*.** Prin
1c040 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  t an out-of-memo
1c050 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20 73 74  ry message to st
1c060 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
1c070 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
1c080 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72   shellNomemError
1c090 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72  (void){.  raw_pr
1c0a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1c0b0 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
1c0c0 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  ry\n");.  return
1c0d0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
1c0e0 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
1c0f0 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
1c100 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
1c110 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
1c120 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
1c130 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
1c140 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
1c150 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
1c160 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
1c170 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
1c180 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
1c190 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
1c1a0 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
1c1b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
1c1c0 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
1c1d0 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
1c1e0 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
1c1f0 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
1c200 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
1c210 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
1c220 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
1c240 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
1c250 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
1c260 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
1c270 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
1c280 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
1c290 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
1c2a0 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
1c2b0 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
1c2c0 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
1c2d0 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
1c2e0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
1c2f0 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
1c300 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
1c310 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
1c320 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
1c330 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
1c340 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1c360 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
1c370 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
1c380 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1c390 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
1c3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c3b0 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
1c3c0 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
1c3d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
1c3e0 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
1c3f0 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
1c400 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
1c410 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
1c420 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
1c430 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
1c440 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
1c450 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
1c460 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
1c470 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
1c480 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
1c490 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
1c4a0 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
1c4b0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
1c4c0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
1c4d0 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
1c4e0 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
1c4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c500 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
1c510 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
1c520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c530 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1c540 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c550 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1c560 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
1c570 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
1c580 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
1c590 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
1c5a0 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
1c5b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1c5c0 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
1c5d0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
1c5e0 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
1c5f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1c600 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
1c610 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
1c620 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
1c630 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
1c640 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
1c650 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
1c660 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
1c670 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
1c680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1c690 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
1c6a0 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
1c6b0 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
1c6c0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
1c6d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c6e0 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
1c6f0 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
1c700 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
1c710 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
1c720 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
1c730 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
1c740 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1c750 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
1c760 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
1c770 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
1c780 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
1c790 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
1c7a0 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
1c7b0 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
1c7c0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
1c7d0 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
1c7e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
1c7f0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
1c800 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
1c810 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
1c820 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c830 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
1c840 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
1c850 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
1c860 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
1c870 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
1c880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c890 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
1c8a0 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
1c8c0 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
1c8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c8e0 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
1c8f0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
1c900 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1c910 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
1c920 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
1c930 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
1c940 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1c950 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
1c960 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
1c970 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
1c980 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
1c990 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
1c9a0 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
1c9b0 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
1c9c0 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
1c9d0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
1c9e0 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
1c9f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1ca00 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
1ca10 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
1ca20 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
1ca30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1ca40 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
1ca50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ca60 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
1ca70 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
1ca80 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
1ca90 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
1caa0 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
1cab0 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
1cac0 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
1cad0 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
1cae0 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
1caf0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
1cb00 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
1cb10 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
1cb20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
1cb30 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
1cb40 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
1cb50 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
1cb60 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
1cb70 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
1cb80 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
1cb90 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
1cba0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1cbb0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
1cbc0 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
1cbd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1cbe0 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
1cbf0 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
1cc00 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
1cc10 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1cc20 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
1cc30 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
1cc40 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
1cc50 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
1cc60 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
1cc70 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
1cc80 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
1cc90 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
1cca0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1ccb0 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75  of SQL scalar fu
1ccc0 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c  nction fkey_coll
1ccd0 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73  ate_clause(), us
1cce0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c  ed.** by the ".l
1ccf0 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73  int fkey-indexes
1cd00 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20  " command. This 
1cd10 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
1cd20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c  is always.** cal
1cd30 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72  led with four ar
1cd40 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61  guments - the pa
1cd50 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c  rent table name,
1cd60 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
1cd70 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20  mn name,.** the 
1cd80 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65  child table name
1cd90 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63   and the child c
1cda0 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  olumn name..**.*
1cdb0 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  *   fkey_collate
1cdc0 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d  _clause('parent-
1cdd0 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f  tab', 'parent-co
1cde0 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c  l', 'child-tab',
1cdf0 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a   'child-col').**
1ce00 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
1ce10 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
1ce20 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20  s or columns do 
1ce30 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
1ce40 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  function.** retu
1ce50 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72  rns an empty str
1ce60 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74  ing. An empty st
1ce70 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74  ring is also ret
1ce80 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61  urned if both ta
1ce90 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75  bles.** and colu
1cea0 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61  mns exist but ha
1ceb0 76 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  ve the same defa
1cec0 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
1ced0 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69  quence. Or,.** i
1cee0 66 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74  f both exist but
1cef0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
1cf00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
1cf10 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
1cf20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1cf30 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
1cf40 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70  ing " COLLATE <p
1cf50 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
1cf60 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72  ", where.** <par
1cf70 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69  ent-collation> i
1cf80 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
1cf90 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cfa0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
1cfb0 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
1cfc0 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43   void shellFkeyC
1cfd0 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20  ollateClause(.  
1cfe0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1cff0 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
1d000 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
1d010 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
1d020 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
1d030 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
1d040 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20  _handle(pCtx);. 
1d050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1d060 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rent;.  const ch
1d070 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a  ar *zParentCol;.
1d080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1d090 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73  arentSeq;.  cons
1d0a0 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a  t char *zChild;.
1d0b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1d0c0 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74  hildCol;.  const
1d0d0 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71   char *zChildSeq
1d0e0 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61   = 0;  /* Initia
1d0f0 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61  lize to avoid fa
1d100 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72  lse-positive war
1d110 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ning */.  int rc
1d120 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
1d130 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e  l==4 );.  zParen
1d140 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
1d150 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1d160 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
1d170 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63   zParentCol = (c
1d180 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1d190 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1d1a0 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[1]);.  zChil
1d1b0 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
1d1c0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1d1d0 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  ext(apVal[2]);. 
1d1e0 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f   zChildCol = (co
1d1f0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1d200 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1d210 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  al[3]);..  sqlit
1d220 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
1d230 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c  Ctx, "", -1, SQL
1d240 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  ITE_STATIC);.  r
1d250 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
1d260 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1d270 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61  a(.      db, "ma
1d280 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50  in", zParent, zP
1d290 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50  arentCol, 0, &zP
1d2a0 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20  arentSeq, 0, 0, 
1d2b0 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
1d2c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
1d2e0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
1d2f0 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62  data(.        db
1d300 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64  , "main", zChild
1d310 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20  , zChildCol, 0, 
1d320 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30  &zChildSeq, 0, 0
1d330 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
1d340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d350 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73  _OK && sqlite3_s
1d360 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65  tricmp(zParentSe
1d370 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b  q, zChildSeq) ){
1d380 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73  .    char *z = s
1d390 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1d3a0 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50   COLLATE %s", zP
1d3b0 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73  arentSeq);.    s
1d3c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1d3d0 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20  xt(pCtx, z, -1, 
1d3e0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1d3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1d400 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(z);.  }.}...
1d410 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
1d420 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d  entation of dot-
1d430 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66  command ".lint f
1d440 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f  key-indexes"..*/
1d450 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
1d460 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53  FkeyIndexes(.  S
1d470 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
1d480 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1d490 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
1d4a0 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
1d4b0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
1d4e0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1d4f0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
1d500 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1d530 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
1d540 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1d550 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64   *db = pState->d
1d560 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
1d570 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71  base handle to q
1d580 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f  uery "main" db o
1d590 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  f */.  FILE *out
1d5a0 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20   = pState->out; 
1d5b0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d         /* Stream
1d5c0 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72   to write non-er
1d5d0 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f  ror output to */
1d5e0 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20  .  int bVerbose 
1d5f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d600 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73     /* If -verbos
1d610 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
1d620 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61    int bGroupByPa
1d630 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
1d640 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79    /* If -groupby
1d650 70 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e  parent is presen
1d660 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
1d690 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41  rate through azA
1d6a0 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rg[] */.  const 
1d6b0 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20  char *zIndent = 
1d6c0 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  "";       /* How
1d6d0 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20   much to indent 
1d6e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20  CREATE INDEX by 
1d6f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1d720 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
1d730 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
1d740 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1d750 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  iled version of 
1d760 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
1d770 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  low */..  /*.  *
1d780 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74  * This SELECT st
1d790 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
1d7a0 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68  one row for each
1d7b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
1d7c0 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20  straint.  ** in 
1d7d0 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  the schema of th
1d7e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
1d7f0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   The column valu
1d800 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  es are:.  **.  *
1d810 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66  * 0. The text of
1d820 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
1d830 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20  t similar to:.  
1d840 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58  **.  **      "EX
1d850 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1d860 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63   SELECT 1 FROM c
1d870 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45  hild_table WHERE
1d880 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20   child_key=?".  
1d890 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20  **.  **    This 
1d8a0 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61  SELECT is simila
1d8b0 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61  r to the one tha
1d8c0 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
1d8d0 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ys implementatio
1d8e0 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20  n.  **    needs 
1d8f0 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c  to run internall
1d900 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65  y on child table
1d910 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
1d920 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  n index that can
1d930 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64  .  **    be used
1d940 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69   to optimize thi
1d950 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
1d960 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65   can also be use
1d970 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a  d by the FK.  **
1d980 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69      implementati
1d990 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44  on to optimize D
1d9a0 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
1d9b0 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
1d9c0 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20  e parent.  **   
1d9d0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
1d9e0 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74  * 1. A GLOB patt
1d9f0 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ern suitable for
1da00 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1da10 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20  (). If the plan 
1da20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20  output by.  **  
1da30 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55    the EXPLAIN QU
1da40 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
1da50 20 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61   matches this pa
1da60 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20  ttern, then the 
1da70 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63  schema.  **    c
1da80 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78  ontains an index
1da90 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1daa0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  d to optimize th
1dab0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  e query..  **.  
1dac0 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64  ** 2. Human read
1dad0 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64  able text that d
1dae0 65 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69  escribes the chi
1daf0 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ld table and col
1db00 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  umns. e.g..  **.
1db10 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c    **       "chil
1db20 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
1db30 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22  y1, child_key2)"
1db40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75  .  **.  ** 3. Hu
1db50 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78  man readable tex
1db60 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  t that describes
1db70 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
1db80 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65  e and columns. e
1db90 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
1dba0 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c      "parent_tabl
1dbb0 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70  e(parent_key1, p
1dbc0 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a  arent_key2)".  *
1dbd0 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c  *.  ** 4. A full
1dbe0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1dbf0 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69  atement for an i
1dc00 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20  ndex that could 
1dc10 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
1dc20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45     optimize DELE
1dc30 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
1dc40 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
1dc50 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67  arent table. e.g
1dc60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
1dc70 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
1dc80 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c  child_table_chil
1dc90 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74  d_key ON child_t
1dca0 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22  able(child_key)"
1dcb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68  .  **.  ** 5. Th
1dcc0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61  e name of the pa
1dcd0 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  rent table..  **
1dce0 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20  .  ** These six 
1dcf0 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20  values are used 
1dd00 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62  by the C logic b
1dd10 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65  elow to generate
1dd20 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a   the report..  *
1dd30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1dd40 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54  zSql =.  "SELECT
1dd50 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58   ".    "     'EX
1dd60 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1dd70 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27   SELECT 1 FROM '
1dd80 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
1dd90 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a  ) || ' WHERE '".
1dda0 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
1ddb0 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e  concat(quote(s.n
1ddc0 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71  ame) || '.' || q
1ddd0 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
1dde0 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20  | '=?' ".    "  
1ddf0 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  || fkey_collate_
1de00 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
1de10 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
1de20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
1de30 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
1de40 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20  me, f.[from]),' 
1de50 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22  AND ')".    ", "
1de60 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52  .    "     'SEAR
1de70 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e  CH TABLE ' || s.
1de80 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20  name || ' USING 
1de90 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28  COVERING INDEX*(
1dea0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
1deb0 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c  up_concat('*=?',
1dec0 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27   ' AND ') || ')'
1ded0 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
1dee0 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20       s.name  || 
1def0 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
1df00 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27  cat(f.[from],  '
1df10 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  , ') || ')'".   
1df20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
1df30 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27  f.[table] || '('
1df40 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
1df50 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d  (COALESCE(f.[to]
1df60 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20  , p.[name])) || 
1df70 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
1df80 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20    "     'CREATE 
1df90 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65  INDEX ' || quote
1dfa0 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20  (s.name ||'_'|| 
1dfb0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b  group_concat(f.[
1dfc0 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20  from], '_'))".  
1dfd0 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c    "  || ' ON ' |
1dfe0 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  | quote(s.name) 
1dff0 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c  || '('".    "  |
1e000 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71  | group_concat(q
1e010 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
1e020 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
1e030 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
1e040 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
1e050 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
1e060 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
1e070 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
1e080 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27  me, f.[from]), '
1e090 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20  , ')".    "  || 
1e0a0 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20  ');'".    ", ". 
1e0b0 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c     "     f.[tabl
1e0c0 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  e] ".    "FROM s
1e0d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20  qlite_master AS 
1e0e0 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67  s, pragma_foreig
1e0f0 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d  n_key_list(s.nam
1e100 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c  e) AS f ".    "L
1e110 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f  EFT JOIN pragma_
1e120 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20  table_info AS p 
1e130 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44  ON (pk-1=seq AND
1e140 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d   p.arg=f.[table]
1e150 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42  ) ".    "GROUP B
1e160 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22  Y s.name, f.id "
1e170 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28  .    "ORDER BY (
1e180 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e  CASE WHEN ? THEN
1e190 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20   f.[table] ELSE 
1e1a0 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b  s.name END)".  ;
1e1b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e1c0 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43  GlobIPK = "SEARC
1e1d0 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20  H TABLE * USING 
1e1e0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1e1f0 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a  KEY (rowid=?)";.
1e200 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41  .  for(i=2; i<nA
1e210 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  rg; i++){.    in
1e220 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1e230 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  n(azArg[i]);.   
1e240 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
1e250 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
1e260 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
1e270 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
1e280 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
1e290 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
1e2a0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
1e2b0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
1e2c0 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
1e2d0 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
1e2e0 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
1e2f0 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
1e300 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
1e310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
1e320 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
1e330 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
1e340 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
1e350 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
1e360 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
1e370 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
1e380 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
1e390 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1e3b0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
1e3c0 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
1e3d0 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
1e3e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
1e3f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1e400 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
1e410 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
1e420 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
1e430 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
1e440 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
1e450 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
1e460 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
1e470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1e480 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1e490 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
1e4a0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
1e4b0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1e4c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
1e4d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1e4e0 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
1e4f0 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
1e500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e510 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
1e520 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
1e530 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
1e540 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
1e550 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
1e560 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1e570 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
1e580 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
1e590 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
1e5a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
1e5b0 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
1e5c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1e5d0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
1e5e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e5f0 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
1e600 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1e610 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
1e620 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
1e630 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
1e640 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1e650 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1e660 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
1e670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
1e680 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
1e690 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1e6a0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
1e6b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e6c0 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
1e6d0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1e6e0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
1e6f0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
1e700 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
1e710 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1e720 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1e730 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
1e740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1e750 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
1e760 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
1e770 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1e780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e790 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
1e7a0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1e7b0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
1e7c0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
1e7d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
1e7e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1e7f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e800 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
1e810 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
1e820 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1e830 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
1e840 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
1e850 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
1e860 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
1e870 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
1e880 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
1e890 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1e8a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e8b0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
1e8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e8d0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
1e8e0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
1e8f0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
1e900 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1e910 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
1e920 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
1e930 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
1e940 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
1e950 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
1e960 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
1e970 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
1e980 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
1e990 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
1e9a0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
1e9b0 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
1e9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
1e9d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
1e9e0 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
1e9f0 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
1ea00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ea10 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
1ea20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
1ea30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ea40 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
1ea50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ea60 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1ea70 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
1ea80 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
1ea90 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
1eaa0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
1eab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1eac0 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
1ead0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
1eae0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
1eaf0 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
1eb00 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
1eb10 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
1eb30 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
1eb40 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
1eb50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1eb70 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
1eb80 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
1eb90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eba0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
1ebb0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
1ebc0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1ebd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
1ebe0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
1ebf0 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
1ec00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ec10 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
1ec20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ec30 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
1ec40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ec50 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
1ec60 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
1ec70 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ec80 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1ec90 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
1eca0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
1ecb0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1ecc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1ecd0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
1ece0 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
1ecf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ed00 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
1ed10 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
1ed20 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
1ed30 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
1ed40 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
1ed50 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
1ed80 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
1ed90 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
1eda0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1edd0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
1ede0 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
1edf0 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
1ee00 32 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  2 ? (int)strlen(
1ee10 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
1ee20 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c    if( n<1 || sql
1ee30 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a  ite3_strnicmp(az
1ee40 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e  Arg[1], "fkey-in
1ee50 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74  dexes", n) ) got
1ee60 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72  o usage;.  retur
1ee70 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  n lintFkeyIndexe
1ee80 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c  s(pState, azArg,
1ee90 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a   nArg);.. usage:
1eea0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
1eeb0 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20  derr, "Usage %s 
1eec0 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69  sub-command ?swi
1eed0 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a  tches...?\n", az
1eee0 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70  Arg[0]);.  raw_p
1eef0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
1ef00 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  here sub-command
1ef10 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61  s are:\n");.  ra
1ef20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1ef30 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78   "    fkey-index
1ef40 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  es\n");.  return
1ef50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
1ef60 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
1ef70 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71  ellPrepare(.  sq
1ef80 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
1ef90 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74  t *pRc, .  const
1efa0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
1efb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1efc0 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
1efd0 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
1efe0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
1eff0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1f000 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1f010 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
1f020 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1f030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f040 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
1f050 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
1f060 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29  l error: %s (%d)
1f070 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1f080 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1f090 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63  b), sqlite3_errc
1f0a0 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b  ode(db).      );
1f0b0 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63  .      *pRc = rc
1f0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
1f0d0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
1f0e0 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20  PreparePrintf(. 
1f0f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1f100 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
1f110 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
1f120 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  tmt,.  const cha
1f130 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a  r *zFmt, .  ....
1f140 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  ){.  *ppStmt = 0
1f150 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
1f160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76  LITE_OK ){.    v
1f170 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63  a_list ap;.    c
1f180 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73  har *z;.    va_s
1f190 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
1f1a0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
1f1b0 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
1f1c0 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  p);.    if( z==0
1f1d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
1f1e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1f1f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f200 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c  shellPrepare(db,
1f210 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29   pRc, z, ppStmt)
1f220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1f230 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  free(z);.    }. 
1f240 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1f250 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28  d shellFinalize(
1f260 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
1f270 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1f280 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74  tmt.){.  if( pSt
1f290 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
1f2a0 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
1f2b0 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
1f2c0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
1f2d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1f2e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
1f2f0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
1f300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
1f310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f320 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1f330 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
1f340 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
1f350 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
1f360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1f370 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  pRc = rc;.    }.
1f380 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1f390 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20  id shellReset(. 
1f3a0 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
1f3b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1f3c0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
1f3d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
1f3e0 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63  tmt);.  if( *pRc
1f3f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 2a 70  ==SQLITE_OK ) *p
1f400 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  Rc = rc;.}../* .
1f410 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70  ** Structure rep
1f420 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67  resenting a sing
1f430 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  le ".ar" command
1f440 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1f450 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72  uct ArCommand Ar
1f460 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20  Command;.struct 
1f470 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e  ArCommand {.  in
1f480 74 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  t eCmd;         
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4a0 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c   An AR_CMD_* val
1f4b0 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ue */.  const ch
1f4c0 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
1f4d0 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
1f4e0 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
1f4f0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1f500 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
1f510 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
1f520 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
1f530 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
1f540 6e 74 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20  nt bVerbose;    
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f560 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
1f570 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ose */.  int nAr
1f580 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1f590 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f5a0 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  er of command ar
1f5b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1f5c0 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20  r **azArg;      
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5e0 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64  Array of command
1f5f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 7d 3b   arguments */.};
1f600 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
1f610 75 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f  usage message fo
1f620 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e  r the .ar comman
1f630 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  d to stderr and 
1f640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1f650 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
1f660 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20  nt arUsage(FILE 
1f670 2a 66 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  *f){.  raw_print
1f680 66 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67 65  f(f,."\n"."Usage
1f690 3a 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e 2e  : .ar [OPTION...
1f6a0 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22  ] [FILE...]\n"."
1f6b0 54 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  The .ar command 
1f6c0 6d 61 6e 61 67 65 73 20 73 71 6c 61 72 20 61 72  manages sqlar ar
1f6d0 63 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22 0a  chives.\n"."\n".
1f6e0 22 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22 20  "Examples:\n"." 
1f6f0 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65   .ar -cf archive
1f700 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 20 20  .sar foo bar    
1f710 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65  # Create archive
1f720 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20  .sar from files 
1f730 66 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a 22  foo and bar\n"."
1f740 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69 76    .ar -tf archiv
1f750 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20  e.sar           
1f760 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20   # List members 
1f770 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e  of archive.sar\n
1f780 22 0a 22 20 20 2e 61 72 20 2d 78 76 66 20 61 72  "."  .ar -xvf ar
1f790 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
1f7a0 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79 20      # Verbosely 
1f7b0 65 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72  extract files fr
1f7c0 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e  om archive.sar\n
1f7d0 22 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f 6d  "."\n"."Each com
1f7e0 6d 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20 66  mand line must f
1f7f0 65 61 74 75 72 65 20 65 78 61 63 74 6c 79 20 6f  eature exactly o
1f800 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  ne command optio
1f810 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d 63  n:\n"."  -c, --c
1f820 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
1f830 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
1f840 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d   archive\n"."  -
1f850 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20  u, --update     
1f860 20 20 20 20 20 20 20 20 20 20 55 70 64 61 74 65            Update
1f870 20 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f   or add files to
1f880 20 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63   an existing arc
1f890 68 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20 2d  hive\n"."  -t, -
1f8a0 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  -list           
1f8b0 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65        List conte
1f8c0 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 5c 6e  nts of archive\n
1f8d0 22 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61  "."  -x, --extra
1f8e0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1f8f0 45 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72  Extract files fr
1f900 6f 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 5c  om archive\n"."\
1f910 6e 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72 20  n"."And zero or 
1f920 6d 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f 70  more optional op
1f930 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76 2c  tions:\n"."  -v,
1f940 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20   --verbose      
1f950 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61          Print ea
1f960 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69  ch filename as i
1f970 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 5c 6e  t is processed\n
1f980 22 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d  "."  -f FILE, --
1f990 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20  file FILE       
1f9a0 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69  Operate on archi
1f9b0 76 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74  ve FILE (default
1f9c0 20 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 5c   is current db)\
1f9d0 6e 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d  n"."  -C DIR, --
1f9e0 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20  directory DIR   
1f9f0 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   Change to direc
1fa00 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64  tory DIR to read
1fa10 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e  /extract files\n
1fa20 22 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f  "."\n"."See also
1fa30 3a 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e  : http://sqlite.
1fa40 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c  org/cli.html#sql
1fa50 61 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f  ar_archive_suppo
1fa60 72 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20  rt\n"."\n".);.  
1fa70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1fa80 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ROR;.}../*.** Pr
1fa90 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
1faa0 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
1fab0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
1fac0 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a  rr and return .*
1fad0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  * SQLITE_ERROR..
1fae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
1faf0 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
1fb00 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
1fb10 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1fb20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73   char *z;.  va_s
1fb30 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
1fb40 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
1fb50 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
1fb60 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1fb70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1fb80 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20  err, "Error: %s 
1fb90 28 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c  (try \".ar --hel
1fba0 70 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73  p\")\n", z);.  s
1fbb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1fbc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fbd0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
1fbe0 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d  Values for ArCom
1fbf0 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64  mand.eCmd..*/.#d
1fc00 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45  efine AR_CMD_CRE
1fc10 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66  ATE       1.#def
1fc20 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ine AR_CMD_EXTRA
1fc30 43 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e  CT      2.#defin
1fc40 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20  e AR_CMD_LIST   
1fc50 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
1fc60 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20  AR_CMD_UPDATE   
1fc70 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52      4.#define AR
1fc80 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20  _CMD_HELP       
1fc90 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72    5../*.** Other
1fca0 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73   (non-command) s
1fcb0 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66  witches..*/.#def
1fcc0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ine AR_SWITCH_VE
1fcd0 52 42 4f 53 45 20 20 20 36 0a 23 64 65 66 69 6e  RBOSE   6.#defin
1fce0 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
1fcf0 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
1fd00 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
1fd10 4f 52 59 20 38 0a 0a 73 74 61 74 69 63 20 69 6e  ORY 8..static in
1fd20 74 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  t arProcessSwitc
1fd30 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  h(ArCommand *pAr
1fd40 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c 20 63  , int eSwitch, c
1fd50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
1fd60 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53 77 69  {.  switch( eSwi
1fd70 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73 65 20  tch ){.    case 
1fd80 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20  AR_CMD_CREATE:. 
1fd90 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45     case AR_CMD_E
1fda0 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61 73 65  XTRACT:.    case
1fdb0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
1fdc0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 55 50    case AR_CMD_UP
1fdd0 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  DATE:.    case A
1fde0 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
1fdf0 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64 20    if( pAr->eCmd 
1fe00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fe10 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6d 75  n arErrorMsg("mu
1fe20 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f  ltiple command o
1fe30 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20  ptions");.      
1fe40 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43 6d  }.      pAr->eCm
1fe50 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20 20  d = eSwitch;.   
1fe60 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1fe70 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ase AR_SWITCH_VE
1fe80 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41 72  RBOSE:.      pAr
1fe90 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  ->bVerbose = 1;.
1fea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1feb0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
1fec0 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72  _FILE:.      pAr
1fed0 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a  ->zFile = zArg;.
1fee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fef0 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
1ff00 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20  DIRECTORY:.     
1ff10 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72   pAr->zDir = zAr
1ff20 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
1ff30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1ff40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ff50 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d  * Parse the comm
1ff60 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20  and line for an 
1ff70 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  ".ar" command. T
1ff80 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  he results are w
1ff90 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73  ritten into.** s
1ffa0 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e  tructure (*pAr).
1ffb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1ffc0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f  turned if the co
1ffd0 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61  mmand line is pa
1ffe0 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66  rsed.** successf
1fff0 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20  ully, otherwise 
20000 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
20010 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73   is written to s
20020 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51  tderr and .** SQ
20030 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72  LITE_ERROR retur
20040 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20050 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e  nt arParseComman
20060 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  d(.  char **azAr
20070 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
20080 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20090 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
200a0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
200b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
200e0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
200f0 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d  Arg[] */.  ArCom
20100 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20  mand *pAr       
20110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
20120 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
20130 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
20140 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20  t ArSwitch {.   
20150 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20   char cShort;.  
20160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
20170 6f 6e 67 3b 0a 20 20 20 20 69 6e 74 20 65 53 77  ong;.    int eSw
20180 69 74 63 68 3b 0a 20 20 20 20 69 6e 74 20 62 41  itch;.    int bA
20190 72 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b  rg;.  } aSwitch[
201a0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 27 63 27 2c  ] = {.    { 'c',
201b0 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 41 52   "create",    AR
201c0 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20 30 20 7d  _CMD_CREATE, 0 }
201d0 2c 0a 20 20 20 20 7b 20 27 78 27 2c 20 22 65 78  ,.    { 'x', "ex
201e0 74 72 61 63 74 22 2c 20 20 20 41 52 5f 43 4d 44  tract",   AR_CMD
201f0 5f 45 58 54 52 41 43 54 2c 20 30 20 7d 2c 0a 20  _EXTRACT, 0 },. 
20200 20 20 20 7b 20 27 74 27 2c 20 22 6c 69 73 74 22     { 't', "list"
20210 2c 20 20 20 20 20 20 41 52 5f 43 4d 44 5f 4c 49  ,      AR_CMD_LI
20220 53 54 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27  ST, 0 },.    { '
20230 75 27 2c 20 22 75 70 64 61 74 65 22 2c 20 20 20  u', "update",   
20240 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20   AR_CMD_UPDATE, 
20250 30 20 7d 2c 0a 20 20 20 20 7b 20 27 68 27 2c 20  0 },.    { 'h', 
20260 22 68 65 6c 70 22 2c 20 20 20 20 20 20 41 52 5f  "help",      AR_
20270 43 4d 44 5f 48 45 4c 50 2c 20 30 20 7d 2c 0a 20  CMD_HELP, 0 },. 
20280 20 20 20 7b 20 27 76 27 2c 20 22 76 65 72 62 6f     { 'v', "verbo
20290 73 65 22 2c 20 20 20 41 52 5f 53 57 49 54 43 48  se",   AR_SWITCH
202a0 5f 56 45 52 42 4f 53 45 2c 20 30 20 7d 2c 0a 20  _VERBOSE, 0 },. 
202b0 20 20 20 7b 20 27 66 27 2c 20 22 66 69 6c 65 22     { 'f', "file"
202c0 2c 20 20 20 20 20 20 41 52 5f 53 57 49 54 43 48  ,      AR_SWITCH
202d0 5f 46 49 4c 45 2c 20 31 20 7d 2c 0a 20 20 20 20  _FILE, 1 },.    
202e0 7b 20 27 43 27 2c 20 22 64 69 72 65 63 74 6f 72  { 'C', "director
202f0 79 22 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49  y", AR_SWITCH_DI
20300 52 45 43 54 4f 52 59 2c 20 31 20 7d 0a 20 20 7d  RECTORY, 1 }.  }
20310 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20  ;.  int nSwitch 
20320 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68  = sizeof(aSwitch
20330 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ) / sizeof(struc
20340 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73  t ArSwitch);.  s
20350 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
20360 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b  pEnd = &aSwitch[
20370 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28  nSwitch];..  if(
20380 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20   nArg<=1 ){.    
20390 72 65 74 75 72 6e 20 61 72 55 73 61 67 65 28 73  return arUsage(s
203a0 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  tderr);.  }else{
203b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
203c0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  zArg[1];.    mem
203d0 73 65 74 28 70 41 72 2c 20 30 2c 20 73 69 7a 65  set(pAr, 0, size
203e0 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29 29 3b 0a  of(ArCommand));.
203f0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
20400 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  -' ){.      /* T
20410 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65  raditional style
20420 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f   [tar] invocatio
20430 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
20440 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  ;.      int iArg
20450 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 2;.      for(
20460 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
20470 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
20480 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20  har *zArg = 0;. 
20490 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
204a0 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
204b0 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
204c0 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
204d0 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
204e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
204f0 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74  i]==pOpt->cShort
20500 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
20510 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20520 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
20530 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
20540 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63  rErrorMsg("unrec
20550 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
20560 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20  %c", z[i]);.    
20570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20580 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a  ( pOpt->bArg ){.
20590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41            if( iA
205a0 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg>=nArg ){.    
205b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
205c0 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f  rErrorMsg("optio
205d0 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
205e0 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d  gument: %c",z[i]
205f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20600 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
20610 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20  azArg[iArg++];. 
20620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20630 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
20640 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e  itch(pAr, pOpt->
20650 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
20660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
20670 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
20680 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20      pAr->nArg = 
20690 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20  nArg-iArg;.     
206a0 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30   if( pAr->nArg>0
206b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d   ){.        pAr-
206c0 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b  >azArg = &azArg[
206d0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  iArg];.      }. 
206e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
206f0 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e  /* Non-tradition
20700 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  al invocation */
20710 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b  .      int iArg;
20720 0a 20 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d  .      for(iArg=
20730 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41  1; iArg<nArg; iA
20740 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rg++){.        i
20750 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20  nt n;.        z 
20760 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20  = azArg[iArg];. 
20770 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21         if( z[0]!
20780 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
20790 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69    /* All remaini
207a0 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ng command line 
207b0 77 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e  words are comman
207c0 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  d arguments. */.
207d0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61            pAr->a
207e0 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
207f0 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rg];.          p
20800 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
20810 69 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  iArg;.          
20820 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
20830 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72  .        n = str
20840 6c 65 6e 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20  len(z);..       
20850 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29   if( z[1]!='-' )
20860 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
20870 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;.          /* 
20880 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72  One or more shor
20890 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
208a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
208b0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
208c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
208d0 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
208e0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
208f0 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
20900 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
20910 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
20920 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
20930 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
20940 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
20950 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
20960 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
20970 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
20980 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
209a0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
209b0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
209c0 74 69 6f 6e 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69  tion: %c\n", z[i
209d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
209e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
209f0 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a  ( pOpt->bArg ){.
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20a10 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20  ( i<(n-1) ){.   
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
20a30 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20  g = &z[i+1];.   
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d               i =
20a50 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
20a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20a70 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72           if( iAr
20a80 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  g>=(nArg-1) ){. 
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
20ab0 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  sg("option requi
20ac0 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
20ad0 20 25 63 5c 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20   %c\n",z[i]);.  
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
20b10 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
20b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20b30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
20b40 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
20b50 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65  tch(pAr, pOpt->e
20b60 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
20b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
20b80 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
20b90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20ba0 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b  f( z[2]=='\0' ){
20bb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
20bc0 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63  -- option, indic
20bd0 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72  ating that all r
20be0 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64  emaining command
20bf0 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20   line words.    
20c00 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d        ** are com
20c10 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
20c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41   */.          pA
20c30 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
20c40 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  g[iArg+1];.     
20c50 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
20c60 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20   nArg-iArg-1;.  
20c70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20c80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20c90 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e          /* A lon
20ca0 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
20cb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20cc0 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20   *zArg = 0;     
20cd0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
20ce0 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20  ent for option, 
20cf0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20  if any */.      
20d00 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
20d10 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tch *pMatch = 0;
20d20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e        /* Matchin
20d30 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
20d40 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
20d50 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20  witch *pOpt;    
20d60 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
20d70 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
20d80 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
20d90 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
20da0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
20db0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
20dc0 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d  r *zLong = pOpt-
20dd0 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20  >zLong;.        
20de0 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73      if( (n-2)<=s
20df0 74 72 6c 65 6e 28 7a 4c 6f 6e 67 29 20 26 26 20  trlen(zLong) && 
20e00 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c  0==memcmp(&z[2],
20e10 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a   zLong, n-2) ){.
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20e30 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ( pMatch ){.    
20e40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
20e50 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61  rn arErrorMsg("a
20e60 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a  mbiguous option:
20e70 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20   %s",z);.       
20e80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
20ea0 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20  atch = pOpt;.   
20eb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20ed0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20ee0 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20    if( pMatch==0 
20ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
20f00 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
20f10 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f  ("unrecognized o
20f20 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a  ption: %s", z);.
20f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20f40 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
20f50 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
20f60 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
20f70 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
20f80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
20f90 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74   arErrorMsg("opt
20fa0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
20fb0 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a  argument: %s", z
20fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
20fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72  .            zAr
20fe0 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67  g = azArg[++iArg
20ff0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
21000 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50           if( arP
21010 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
21020 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63  , pMatch->eSwitc
21030 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
21040 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
21050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21060 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
21070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21090 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
210a0 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e  that all argumen
210b0 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 72  ts within the Ar
210c0 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a  Command.azArg[].
210d0 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20 74  ** array refer t
210e0 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  o archive member
210f0 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d  s, as for the --
21100 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73  extract or --lis
21110 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20  t commands. .** 
21120 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 65  It checks that e
21130 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20  ach of them are 
21140 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20  present. If any 
21150 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 69  specified file i
21160 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74  s not.** present
21170 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c   in the archive,
21180 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69   an error is pri
21190 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20 61  nted to stderr a
211a0 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63  nd an error.** c
211b0 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  ode returned. Ot
211c0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
211d0 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d 65  specified argume
211e0 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  nts are present 
211f0 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76  in.** the archiv
21200 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
21210 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
21220 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74  This function st
21230 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e  rips any trailin
21240 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73  g '/' characters
21250 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d   from each argum
21260 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ent..** This is 
21270 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
21280 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61 72  the way the [tar
21290 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20  ] command seems 
212a0 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69  to work on.** Li
212b0 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nux..*/.static i
212c0 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65  nt arCheckEntrie
212d0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  s(sqlite3 *db, A
212e0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a  rCommand *pAr){.
212f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21300 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d  E_OK;.  if( pAr-
21310 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74  >nArg ){.    int
21320 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   i;.    sqlite3_
21330 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b  stmt *pTest = 0;
21340 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  ..    shellPrepa
21350 72 65 28 64 62 2c 20 26 72 63 2c 20 22 53 45 4c  re(db, &rc, "SEL
21360 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
21370 6c 61 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f  lar WHERE name=?
21380 22 2c 20 26 70 54 65 73 74 29 3b 0a 20 20 20 20  ", &pTest);.    
21390 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
213a0 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
213b0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
213c0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
213d0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
213e0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
213f0 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  (z);.      int b
21400 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  Ok = 0;.      wh
21410 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
21420 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20  1]=='/' ) n--;. 
21430 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27       z[n] = '\0'
21440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21450 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
21460 20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   1, z, -1, SQLIT
21470 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
21480 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
21490 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
214a0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
214b0 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
214c0 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
214d0 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  t(&rc, pTest);. 
214e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
214f0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30  ITE_OK && bOk==0
21500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
21510 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21520 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63  not found in arc
21530 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  hive: %s\n", z);
21540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
21550 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
21560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
21570 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
21580 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pTest);.  }..  
21590 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
215a0 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45  .** Format a WHE
215b0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
215c0 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  an be used again
215d0 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  st the "sqlar" t
215e0 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74  able to.** ident
215f0 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20  ify all archive 
21600 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74  members that mat
21610 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  ch the command a
21620 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a  rguments held.**
21630 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76   in (*pAr). Leav
21640 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61  e this WHERE cla
21650 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65  use in (*pzWhere
21660 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
21670 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  ng..** The calle
21680 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
21690 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20   for eventually 
216a0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
216b0 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79  free() on.** any
216c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68   non-NULL (*pzWh
216d0 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ere) value..*/.s
216e0 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65  tatic void arWhe
216f0 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20  reClause(.  int 
21700 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61  *pRc, .  ArComma
21710 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72  nd *pAr, .  char
21720 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20   **pzWhere      
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21740 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c  UT: New WHERE cl
21750 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ause */.){.  cha
21760 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
21770 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
21780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21790 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a  pAr->nArg==0 ){.
217a0 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
217b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
217c0 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1");.    }else{.
217d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
217e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
217f0 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
21800 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
21810 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
21820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21830 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
21840 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72  ];.        zWher
21850 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
21860 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
21870 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
21880 71 27 20 4f 52 20 6e 61 6d 65 20 42 45 54 57 45  q' OR name BETWE
21890 45 4e 20 27 25 71 2f 27 20 41 4e 44 20 27 25 71  EN '%q/' AND '%q
218a0 30 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  0'", .          
218b0 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
218c0 7a 2c 20 7a 2c 20 7a 0a 20 20 20 20 20 20 20 20  z, z, z.        
218d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
218e0 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a  f( zWhere==0 ){.
218f0 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d            *pRc =
21900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21910 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21930 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b    zSep = " OR ";
21940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21950 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20   }.  *pzWhere = 
21960 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zWhere;.}../*.**
21970 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
21980 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63 6f  of .ar "lisT" co
21990 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
219a0 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d  c int arListComm
219b0 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  and(ShellState *
219c0 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
219d0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
219e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
219f0 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6e 61  Sql = "SELECT na
21a00 6d 65 20 46 52 4f 4d 20 73 71 6c 61 72 20 57 48  me FROM sqlar WH
21a10 45 52 45 20 25 73 22 3b 20 0a 20 20 63 68 61 72  ERE %s"; .  char
21a20 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
21a30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
21a40 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
21a50 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63  ;..  rc = arChec
21a60 6b 45 6e 74 72 69 65 73 28 64 62 2c 20 70 41 72  kEntries(db, pAr
21a70 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75  );.  arWhereClau
21a80 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57  se(&rc, pAr, &zW
21a90 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50  here);..  shellP
21aa0 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 2c  reparePrintf(db,
21ab0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
21ac0 6c 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 77 68  l, zWhere);.  wh
21ad0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21ae0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
21af0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
21b00 53 71 6c 29 20 29 7b 0a 20 20 20 20 72 61 77 5f  Sql) ){.    raw_
21b10 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
21b20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
21b30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
21b40 20 30 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   0));.  }.  retu
21b50 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
21b60 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
21b70 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22  of .ar "eXtract"
21b80 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
21b90 61 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61  atic int arExtra
21ba0 63 74 43 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53  ctCommand(ShellS
21bb0 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tate *p, sqlite3
21bc0 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20   *db, ArCommand 
21bd0 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pAr){.  const c
21be0 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20  har *zSql1 = .  
21bf0 20 20 22 53 45 4c 45 43 54 20 3a 31 20 7c 7c 20    "SELECT :1 || 
21c00 6e 61 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28  name, writefile(
21c10 3a 31 20 7c 7c 20 6e 61 6d 65 2c 20 22 0a 20 20  :1 || name, ".  
21c20 20 20 22 43 41 53 45 20 57 48 45 4e 20 28 64 61    "CASE WHEN (da
21c30 74 61 20 41 4e 44 20 73 7a 3e 3d 30 20 41 4e 44  ta AND sz>=0 AND
21c40 20 73 7a 21 3d 6c 65 6e 67 74 68 28 64 61 74 61   sz!=length(data
21c50 29 29 20 54 48 45 4e 20 22 0a 20 20 20 20 22 20  )) THEN ".    " 
21c60 20 20 20 75 6e 63 6f 6d 70 72 65 73 73 28 64 61     uncompress(da
21c70 74 61 29 20 22 0a 20 20 20 20 22 45 4c 53 45 22  ta) ".    "ELSE"
21c80 0a 20 20 20 20 22 20 20 20 20 64 61 74 61 20 22  .    "    data "
21c90 0a 20 20 20 20 22 45 4e 44 2c 20 22 0a 20 20 20  .    "END, ".   
21ca0 20 22 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20 46   "mode, mtime) F
21cb0 52 4f 4d 20 73 71 6c 61 72 20 57 48 45 52 45 20  ROM sqlar WHERE 
21cc0 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
21cd0 53 20 4e 55 4c 4c 20 4f 52 20 3a 32 20 3d 20 30  S NULL OR :2 = 0
21ce0 29 22 3b 0a 0a 20 20 73 74 72 75 63 74 20 74 69  )";..  struct ti
21cf0 6d 65 73 70 65 63 20 74 69 6d 65 73 5b 32 5d 3b  mespec times[2];
21d00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21d10 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pSql = 0;.  int
21d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21d30 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  .  char *zDir = 
21d40 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  0;.  char *zWher
21d50 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
21d60 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
21d70 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
21d80 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
21d90 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
21da0 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
21db0 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
21dc0 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
21dd0 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
21de0 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
21df0 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
21e00 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
21e10 6e 74 72 69 65 73 28 64 62 2c 20 70 41 72 29 3b  ntries(db, pAr);
21e20 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
21e30 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
21e40 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  re);..  if( rc==
21e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e60 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29   if( pAr->zDir )
21e70 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
21e80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
21e90 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29  %s/", pAr->zDir)
21ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21eb0 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
21ec0 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20  3_mprintf("");. 
21ed0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
21ee0 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  r==0 ) rc = SQLI
21ef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
21f00 20 6d 65 6d 73 65 74 28 74 69 6d 65 73 2c 20 30   memset(times, 0
21f10 2c 20 73 69 7a 65 6f 66 28 74 69 6d 65 73 29 29  , sizeof(times))
21f20 3b 0a 20 20 74 69 6d 65 73 5b 30 5d 2e 74 76 5f  ;.  times[0].tv_
21f30 73 65 63 20 3d 20 74 69 6d 65 28 30 29 3b 0a 0a  sec = time(0);..
21f40 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
21f50 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20 26 70  intf(db, &rc, &p
21f60 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 7a 57 68 65  Sql, zSql1, zWhe
21f70 72 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  re);.  if( rc==S
21f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21f90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
21fa0 74 28 70 53 71 6c 2c 20 31 2c 20 7a 44 69 72 2c  t(pSql, 1, zDir,
21fb0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
21fc0 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
21fd0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
21fe0 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
21ff0 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
22000 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
22010 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
22020 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
22030 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
22040 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
22050 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
22060 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
22070 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
22080 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
22090 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
220a0 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
220b0 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
220c0 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
220d0 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
220e0 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
220f0 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
22100 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
22110 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
22120 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
22130 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
22140 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
22150 20 32 2c 20 69 29 3b 0a 20 20 20 20 20 20 77 68   2, i);.      wh
22160 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22170 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
22180 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
22190 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
221a0 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d  if( i==0 && pAr-
221b0 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
221c0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
221d0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
221e0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
221f0 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
22200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22210 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
22220 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  set(&rc, pSql);.
22230 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
22240 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
22250 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  l);.  }..  sqlit
22260 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20  e3_free(zDir);. 
22270 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
22280 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
22290 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
222a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
222b0 2e 61 72 20 22 63 72 65 61 74 65 22 20 61 6e 64  .ar "create" and
222c0 20 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e   "update" comman
222d0 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65  ds..**.** Create
222e0 20 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62   the "sqlar" tab
222f0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22300 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
22310 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
22320 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63  .** Then add eac
22330 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a  h file in the az
22340 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20  File[] array to 
22350 74 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72  the archive. Dir
22360 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20  ectories.** are 
22370 61 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c  added recursivel
22380 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  y. If argument b
22390 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a  Verbose is non-z
223a0 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69  ero, a message i
223b0 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20  s.** printed on 
223c0 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20  stdout for each 
223d0 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a  file archived..*
223e0 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20  *.** The create 
223f0 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73  command is the s
22400 61 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65  ame as update, e
22410 78 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72  xcept that it dr
22420 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74  ops.** any exist
22430 69 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c  ing "sqlar" tabl
22440 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  e before beginni
22450 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
22460 74 20 61 72 43 72 65 61 74 65 55 70 64 61 74 65  t arCreateUpdate
22470 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
22480 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22490 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
224a0 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  te pointer */.  
224b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41  sqlite3 *db,.  A
224c0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20  rCommand *pAr,  
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
224e0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
224f0 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20  nts and options 
22500 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65  */.  int bUpdate
22510 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
22520 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
22530 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69   name, mode, mti
22540 6d 65 2c 20 64 61 74 61 20 46 52 4f 4d 20 66 73  me, data FROM fs
22550 64 69 72 28 3f 2c 20 3f 29 22 3b 0a 20 20 63 6f  dir(?, ?)";.  co
22560 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
22570 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41  e = .      "CREA
22580 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
22590 45 58 49 53 54 53 20 73 71 6c 61 72 28 22 0a 20  EXISTS sqlar(". 
225a0 20 20 20 20 20 22 6e 61 6d 65 20 54 45 58 54 20       "name TEXT 
225b0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d 2d  PRIMARY KEY,  --
225c0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
225d0 65 5c 6e 22 0a 20 20 20 20 20 20 22 6d 6f 64 65  e\n".      "mode
225e0 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
225f0 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65      -- access pe
22600 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20  rmissions\n".   
22610 20 20 20 22 6d 74 69 6d 65 20 49 4e 54 2c 20 20     "mtime INT,  
22620 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c              -- l
22630 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ast modification
22640 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22   time\n".      "
22650 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  sz INT,         
22660 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69          -- origi
22670 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22  nal file size\n"
22680 0a 20 20 20 20 20 20 22 64 61 74 61 20 42 4c 4f  .      "data BLO
22690 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
226a0 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f  -- compressed co
226b0 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 29 22 3b 0a  ntent\n".  ")";.
226c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
226d0 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c  rop = "DROP TABL
226e0 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61  E IF EXISTS sqla
226f0 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r";.  const char
22700 20 2a 7a 49 6e 73 65 72 74 20 3d 20 22 52 45 50   *zInsert = "REP
22710 4c 41 43 45 20 49 4e 54 4f 20 73 71 6c 61 72 20  LACE INTO sqlar 
22720 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20  VALUES(?, ?, ?, 
22730 3f 2c 20 3f 29 22 3b 0a 0a 20 20 73 71 6c 69 74  ?, ?)";..  sqlit
22740 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
22750 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 69   0;        /* Di
22760 72 65 63 74 6f 72 79 20 74 72 61 76 65 72 73 65  rectory traverse
22770 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  r */.  sqlite3_s
22780 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
22790 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c  ;      /* Compil
227a0 61 74 69 6f 6e 20 6f 66 20 7a 49 6e 73 65 72 74  ation of zInsert
227b0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
227e0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
227f0 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
22800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22820 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
22830 20 20 42 79 74 65 66 20 2a 61 43 6f 6d 70 72 65    Bytef *aCompre
22840 73 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ss = 0;         
22850 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e    /* Compression
22860 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
22870 20 6e 43 6f 6d 70 72 65 73 73 20 3d 20 30 3b 20   nCompress = 0; 
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22890 53 69 7a 65 20 6f 66 20 63 6f 6d 70 72 65 73 73  Size of compress
228a0 69 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20  ion buffer */.. 
228b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
228c0 65 63 28 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  ec(db, "SAVEPOIN
228d0 54 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29  T ar;", 0, 0, 0)
228e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
228f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22900 63 3b 0a 0a 20 20 69 66 28 20 62 55 70 64 61 74  c;..  if( bUpdat
22910 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==0 ){.    rc =
22920 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
22930 2c 20 7a 44 72 6f 70 2c 20 30 2c 20 30 2c 20 30  , zDrop, 0, 0, 0
22940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22950 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
22960 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
22970 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
22980 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
22990 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65  , 0);.  shellPre
229a0 70 61 72 65 28 64 62 2c 20 26 72 63 2c 20 7a 49  pare(db, &rc, zI
229b0 6e 73 65 72 74 2c 20 26 70 49 6e 73 65 72 74 29  nsert, &pInsert)
229c0 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ;.  shellPrepare
229d0 28 64 62 2c 20 26 72 63 2c 20 7a 53 71 6c 2c 20  (db, &rc, zSql, 
229e0 26 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  &pStmt);.  sqlit
229f0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
22a00 6d 74 2c 20 32 2c 20 70 41 72 2d 3e 7a 44 69 72  mt, 2, pAr->zDir
22a10 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
22a20 54 49 43 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  TIC);..  for(i=0
22a30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26  ; i<pAr->nArg &&
22a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
22a50 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
22a60 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
22a70 74 2c 20 31 2c 20 70 41 72 2d 3e 61 7a 41 72 67  t, 1, pAr->azArg
22a80 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
22a90 53 54 41 54 49 43 29 3b 0a 20 20 20 20 77 68 69  STATIC);.    whi
22aa0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
22ab0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
22ac0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
22ad0 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  tmt) ){.      in
22ae0 74 20 73 7a 3b 0a 20 20 20 20 20 20 63 6f 6e 73  t sz;.      cons
22af0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
22b00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
22b10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
22b20 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
22b30 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 73 71 6c    int mode = sql
22b40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
22b50 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
22b60 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 74   unsigned int mt
22b70 69 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ime = sqlite3_co
22b80 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
22b90 32 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  2);..      if( p
22ba0 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a  Ar->bVerbose ){.
22bb0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
22bc0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
22bd0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
22be0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
22bf0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
22c00 65 72 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d  ert, 1, zName, -
22c10 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
22c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22c30 5f 62 69 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72  _bind_int(pInser
22c40 74 2c 20 32 2c 20 6d 6f 64 65 29 3b 0a 20 20 20  t, 2, mode);.   
22c50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
22c60 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 33  int64(pInsert, 3
22c70 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
22c80 29 6d 74 69 6d 65 29 3b 0a 0a 20 20 20 20 20 20  )mtime);..      
22c90 69 66 28 20 53 5f 49 53 44 49 52 28 6d 6f 64 65  if( S_ISDIR(mode
22ca0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 7a 20  ) ){.        sz 
22cb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
22cc0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
22cd0 49 6e 73 65 72 74 2c 20 35 29 3b 0a 20 20 20 20  Insert, 5);.    
22ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 53 5f 49 53    }else if( S_IS
22cf0 4c 4e 4b 28 6d 6f 64 65 29 20 29 7b 0a 20 20 20  LNK(mode) ){.   
22d00 20 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20       sz = -1;.  
22d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
22d20 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65 72 74  nd_value(pInsert
22d30 2c 20 35 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , 5, sqlite3_col
22d40 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  umn_value(pStmt,
22d50 20 33 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   3));.      }els
22d60 65 7b 0a 20 20 20 20 20 20 20 20 75 4c 6f 6e 67  e{.        uLong
22d70 66 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20  f nReq;         
22d80 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
22d90 20 73 69 7a 65 20 6f 66 20 63 6f 6d 70 72 65 73   size of compres
22da0 73 69 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 20  sion buffer */. 
22db0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 42 79 74         const Byt
22dc0 65 66 20 2a 70 44 61 74 61 20 3d 20 28 63 6f 6e  ef *pData = (con
22dd0 73 74 20 42 79 74 65 66 2a 29 73 71 6c 69 74 65  st Bytef*)sqlite
22de0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
22df0 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  tmt, 3);.       
22e00 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   sz = sqlite3_co
22e10 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
22e20 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 6e 52  , 3);.        nR
22e30 65 71 20 3d 20 63 6f 6d 70 72 65 73 73 42 6f 75  eq = compressBou
22e40 6e 64 28 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  nd(sz);.        
22e50 69 66 28 20 61 43 6f 6d 70 72 65 73 73 3d 3d 30  if( aCompress==0
22e60 20 7c 7c 20 6e 52 65 71 3e 6e 43 6f 6d 70 72 65   || nReq>nCompre
22e70 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ss ){.          
22e80 42 79 74 65 66 20 2a 61 4e 65 77 20 3d 20 73 71  Bytef *aNew = sq
22e90 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 43  lite3_realloc(aC
22ea0 6f 6d 70 72 65 73 73 2c 20 6e 52 65 71 29 3b 0a  ompress, nReq);.
22eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 4e            if( aN
22ec0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
22ed0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22ee0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
22ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22f00 20 20 20 20 20 61 43 6f 6d 70 72 65 73 73 20 3d       aCompress =
22f10 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   aNew;.         
22f20 20 20 20 6e 43 6f 6d 70 72 65 73 73 20 3d 20 6e     nCompress = n
22f30 52 65 71 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Req;.          }
22f40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
22f50 20 20 20 20 69 66 28 20 5a 5f 4f 4b 21 3d 63 6f      if( Z_OK!=co
22f60 6d 70 72 65 73 73 28 61 43 6f 6d 70 72 65 73 73  mpress(aCompress
22f70 2c 20 26 6e 52 65 71 2c 20 70 44 61 74 61 2c 20  , &nReq, pData, 
22f80 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sz) ){.         
22f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
22fa0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
22fb0 20 20 20 20 20 20 69 66 28 20 6e 52 65 71 3c 73        if( nReq<s
22fc0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  z ){.          s
22fd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
22fe0 28 70 49 6e 73 65 72 74 2c 20 35 2c 20 61 43 6f  (pInsert, 5, aCo
22ff0 6d 70 72 65 73 73 2c 20 6e 52 65 71 2c 20 53 51  mpress, nReq, SQ
23000 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
23010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
23030 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
23040 2c 20 35 2c 20 70 44 61 74 61 2c 20 73 7a 2c 20  , 5, pData, sz, 
23050 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
23060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23070 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
23080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
230a0 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72 74 2c 20  nd_int(pInsert, 
230b0 34 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  4, sz);.        
230c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
230d0 73 65 72 74 29 3b 0a 20 20 20 20 20 20 20 20 72  sert);.        r
230e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
230f0 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  t(pInsert);.    
23100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
23110 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53  ellReset(&rc, pS
23120 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  tmt);.  }..  if(
23130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23140 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
23150 65 63 28 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  ec(db, "ROLLBACK
23160 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20   TO ar; RELEASE 
23170 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ar;", 0, 0, 0);.
23180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
23190 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
231a0 62 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22  b, "RELEASE ar;"
231b0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
231c0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
231d0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 73  &rc, pStmt);.  s
231e0 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
231f0 2c 20 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71  , pInsert);.  sq
23200 6c 69 74 65 33 5f 66 72 65 65 28 61 43 6f 6d 70  lite3_free(aComp
23210 72 65 73 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  ress);.  return 
23220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
23230 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
23240 61 72 20 22 43 72 65 61 74 65 22 20 63 6f 6d 6d  ar "Create" comm
23250 61 6e 64 2e 20 0a 2a 2a 0a 2a 2a 20 43 72 65 61  and. .**.** Crea
23260 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  te the "sqlar" t
23270 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
23280 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  base if it does 
23290 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
232a0 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65  t..** Then add e
232b0 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ach file in the 
232c0 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74  azFile[] array t
232d0 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20 44  o the archive. D
232e0 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72  irectories.** ar
232f0 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69 76  e added recursiv
23300 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ely. If argument
23310 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e   bVerbose is non
23320 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65  -zero, a message
23330 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f   is.** printed o
23340 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63  n stdout for eac
23350 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e  h file archived.
23360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
23370 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 0a  rCreateCommand(.
23380 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
233b0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71   pointer */.  sq
233c0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41 72 43  lite3 *db,.  ArC
233d0 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20  ommand *pAr     
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233f0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
23400 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f  s and options */
23410 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 72 43  .){.  return arC
23420 72 65 61 74 65 55 70 64 61 74 65 28 70 2c 20 64  reateUpdate(p, d
23430 62 2c 20 70 41 72 2c 20 30 29 3b 0a 7d 0a 0a 2f  b, pAr, 0);.}../
23440 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
23450 69 6f 6e 20 6f 66 20 2e 61 72 20 22 55 70 64 61  ion of .ar "Upda
23460 74 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  te" command. .*/
23470 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 70  .static int arUp
23480 64 61 74 65 43 6d 64 28 53 68 65 6c 6c 53 74 61  dateCmd(ShellSta
23490 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a  te *p, sqlite3 *
234a0 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  db, ArCommand *p
234b0 41 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 72  Ar){.  return ar
234c0 43 72 65 61 74 65 55 70 64 61 74 65 28 70 2c 20  CreateUpdate(p, 
234d0 64 62 2c 20 70 41 72 2c 20 31 29 3b 0a 7d 0a 0a  db, pAr, 1);.}..
234e0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
234f0 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
23500 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
23510 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
23520 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
23530 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
23540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23550 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
23560 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
23570 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
23580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
23590 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
235a0 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
235b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
235c0 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
235d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
235e0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
235f0 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
23600 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d  {.  ArCommand cm
23610 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  d;.  int rc;.  r
23620 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
23630 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
23640 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
23650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23660 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23670 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23680 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
23690 6c 65 20 74 6f 20 75 73 65 20 61 73 20 61 72 63  le to use as arc
236a0 68 69 76 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  hive */..    if(
236b0 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20   cmd.zFile ){.  
236c0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20      int flags;. 
236d0 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d       if( cmd.eCm
236e0 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  d==AR_CMD_CREATE
236f0 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52   || cmd.eCmd==AR
23700 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20  _CMD_UPDATE ){. 
23710 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53         flags = S
23720 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23730 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
23740 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
23750 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
23760 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
23770 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
23780 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
23790 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63  qlite3_open_v2(c
237a0 6d 64 2e 7a 46 69 6c 65 2c 20 26 64 62 2c 20 66  md.zFile, &db, f
237b0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
237c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
237d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  K ){.        raw
237e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
237f0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
23800 65 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a  e: %s (%s)\n", .
23810 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
23820 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65  zFile, sqlite3_e
23830 72 72 6d 73 67 28 64 62 29 0a 20 20 20 20 20 20  rrmsg(db).      
23840 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
23850 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
23860 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
23870 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
23880 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
23890 69 6e 69 74 28 64 62 2c 20 30 2c 20 30 29 3b 0a  init(db, 0, 0);.
238a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
238b0 6d 70 72 65 73 73 5f 69 6e 69 74 28 64 62 2c 20  mpress_init(db, 
238c0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
238d0 7b 0a 20 20 20 20 20 20 64 62 20 3d 20 70 53 74  {.      db = pSt
238e0 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 7d 0a 0a  ate->db;.    }..
238f0 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e      switch( cmd.
23900 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61  eCmd ){.      ca
23910 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
23920 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
23930 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 70  rCreateCommand(p
23940 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29  State, db, &cmd)
23950 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
23960 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
23970 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20  CMD_EXTRACT:.   
23980 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72       rc = arExtr
23990 61 63 74 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74  actCommand(pStat
239a0 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20  e, db, &cmd);.  
239b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
239c0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
239d0 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63  LIST:.        rc
239e0 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64   = arListCommand
239f0 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d  (pState, db, &cm
23a00 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
23a10 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
23a20 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
23a30 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74 61      arUsage(pSta
23a40 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20  te->out);.      
23a50 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
23a60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
23a70 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43 6d   assert( cmd.eCm
23a80 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
23a90 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
23aa0 20 61 72 55 70 64 61 74 65 43 6d 64 28 70 53 74   arUpdateCmd(pSt
23ab0 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a  ate, db, &cmd);.
23ac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23ad0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 63 6d     }..    if( cm
23ae0 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
23af0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
23b00 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
23b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
23b20 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75  /*.** If an inpu
23b30 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69  t line begins wi
23b40 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f  th "." then invo
23b50 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ke this routine 
23b60 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  to.** process th
23b70 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  at line..**.** R
23b80 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72  eturn 1 on error
23b90 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64  , 2 to exit, and
23ba0 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
23bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d  .static int do_m
23bc0 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72  eta_command(char
23bd0 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74   *zLine, ShellSt
23be0 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68  ate *p){.  int h
23bf0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67   = 1;.  int nArg
23c00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63   = 0;.  int n, c
23c10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
23c20 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30    char *azArg[50
23c30 5d 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  ];..  /* Parse t
23c40 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e  he input line in
23c50 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  to tokens..  */.
23c60 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
23c70 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53  ] && nArg<ArrayS
23c80 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20  ize(azArg) ){.  
23c90 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
23ca0 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
23cb0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69  +; }.    if( zLi
23cc0 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b  ne[h]==0 ) break
23cd0 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  ;.    if( zLine[
23ce0 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e  h]=='\'' || zLin
23cf0 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  e[h]=='"' ){.   
23d00 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a     int delim = z
23d10 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20  Line[h++];.     
23d20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
23d30 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
23d40 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
23d50 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64  ] && zLine[h]!=d
23d60 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
23d70 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
23d80 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27  \' && delim=='"'
23d90 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d   && zLine[h+1]!=
23da0 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) h++;.       
23db0 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   h++;.      }.  
23dc0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
23dd0 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  ==delim ){.     
23de0 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20     zLine[h++] = 
23df0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23e00 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20   if( delim=='"' 
23e10 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
23e20 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
23e30 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
23e40 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
23e50 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
23e60 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
23e70 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70  Line[h] && !IsSp
23e80 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
23e90 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   h++; }.      if
23ea0 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69  ( zLine[h] ) zLi
23eb0 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
23ec0 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73     resolve_backs
23ed0 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
23ee0 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g-1]);.    }.  }
23ef0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
23f00 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
23f10 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
23f20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  0 ) return 0; /*
23f30 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65   no tokens, no e
23f40 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74  rror */.  n = st
23f50 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29  rlen30(azArg[0])
23f60 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d  ;.  c = azArg[0]
23f70 5b 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  [0];..#ifndef SQ
23f80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
23f90 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d  IZATION.  if( c=
23fa0 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
23fb0 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68 22  azArg[0], "auth"
23fc0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
23fd0 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
23fe0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
23ff0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
24000 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b  auth ON|OFF\n");
24010 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
24020 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
24030 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
24040 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
24050 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 6f  , 0);.    if( bo
24060 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
24070 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  [1]) ){.      sq
24080 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
24090 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c  izer(p->db, shel
240a0 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d  lAuth, p);.    }
240b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
240c0 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
240d0 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  er(p->db, 0, 0);
240e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
240f0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
24100 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24110 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ALTABLE.  if( c=
24120 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
24130 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72 22 2c 20  azArg[0], "ar", 
24140 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  n)==0 ){.    ope
24150 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
24160 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e  rc = arDotComman
24170 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
24180 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
24190 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27  f..  if( (c=='b'
241a0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
241b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
241c0 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20  ackup", n)==0). 
241d0 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20    || (c=='s' && 
241e0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
241f0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22  azArg[0], "save"
24200 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  , n)==0).  ){.  
24210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
24220 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  estFile = 0;.   
24230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24240 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
24250 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71  3 *pDest;.    sq
24260 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
24270 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a  ackup;.    int j
24280 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
24290 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nArg; j++){.   
242a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
242b0 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
242c0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
242d0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
242e0 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  e( z[0]=='-' ) z
242f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  ++;.        /* N
24300 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f  o options to pro
24310 63 65 73 73 20 61 74 20 74 68 69 73 20 74 69 6d  cess at this tim
24320 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20  e */.        {. 
24330 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
24340 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
24350 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
24360 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a  \n", azArg[j]);.
24370 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
24380 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
24390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
243a0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
243b0 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
243c0 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
243d0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d    }else if( zDb=
243e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
243f0 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20  b = zDestFile;. 
24400 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
24410 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
24420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24430 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24440 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  err, "too many a
24450 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61 63  rguments to .bac
24460 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  kup\n");.       
24470 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
24480 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
24490 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
244a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
244b0 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69  f(stderr, "missi
244c0 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75  ng FILENAME argu
244d0 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c  ment on .backup\
244e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
244f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
24500 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20  f( zDb==0 ) zDb 
24510 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63  = "main";.    rc
24520 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
24530 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
24540 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
24550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24560 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24570 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
24580 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
24590 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29  "\n", zDestFile)
245a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
245b0 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
245c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
245d0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
245e0 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
245f0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
24600 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
24610 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a  "main", p->db, z
24620 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
24630 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
24640 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
24650 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
24660 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
24670 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
24680 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
24690 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
246a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
246b0 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
246c0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
246d0 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
246e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
246f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
24700 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
24710 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
24720 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
24730 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
24740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
24750 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
24760 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
24770 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
24780 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
24790 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
247a0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
247b0 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
247c0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
247d0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
247e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c  (azArg[0], "bail
247f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
24800 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
24810 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72       bail_on_err
24820 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
24830 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
24840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
24850 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24860 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f   "Usage: .bail o
24870 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
24880 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
24890 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
248a0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
248b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
248c0 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d  , "binary", n)==
248d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
248e0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g==2 ){.      if
248f0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
24900 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
24910 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
24920 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
24930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24940 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
24950 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
24960 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
24970 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
24980 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
24990 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22  binary on|off\n"
249a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
249b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
249c0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
249d0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  strcmp(azArg[0],
249e0 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "cd")==0 ){.    
249f0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23  if( nArg==2 ){.#
24a00 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
24a10 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
24a20 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72  N32).      wchar
24a30 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
24a40 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
24a50 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b  icode(azArg[1]);
24a60 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74  .      rc = !Set
24a70 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79  CurrentDirectory
24a80 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  W(z);.      sqli
24a90 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  te3_free(z);.#el
24aa0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68  se.      rc = ch
24ab0 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  dir(azArg[1]);.#
24ac0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
24ad0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
24ae0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24af0 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65  , "Cannot change
24b00 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22   to directory \"
24b10 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
24b20 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
24b30 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
24b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
24b50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24b60 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45  "Usage: .cd DIRE
24b70 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20  CTORY\n");.     
24b80 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
24b90 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
24ba0 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e   undocumented ".
24bb0 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d  breakpoint" comm
24bc0 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c  and causes a cal
24bd0 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20  l to the no-op. 
24be0 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65   ** routine name
24bf0 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
24c00 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  t()..  */.  if( 
24c10 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
24c20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
24c30 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22  0], "breakpoint"
24c40 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  , n)==0 ){.    t
24c50 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
24c60 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
24c70 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
24c80 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
24c90 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20  [0], "changes", 
24ca0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
24cb0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
24cc0 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67    setOrClearFlag
24cd0 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43  (p, SHFLG_CountC
24ce0 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d  hanges, azArg[1]
24cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24d00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
24d10 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
24d20 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e  changes on|off\n
24d30 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
24d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
24d50 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74  .  /* Cancel out
24d60 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c  put redirection,
24d70 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   if it is curren
24d80 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73  tly set (by .tes
24d90 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e  tcase).  ** Then
24da0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
24db0 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73  t of the testcas
24dc0 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61  e-out.txt file a
24dd0 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  nd compare again
24de0 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d  st.  ** azArg[1]
24df0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
24e00 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70  differences, rep
24e10 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  ort an error and
24e20 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   exit..  */.  if
24e30 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
24e40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
24e50 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e  g[0], "check", n
24e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
24e70 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *zRes = 0;.    
24e80 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
24e90 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
24ea0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
24eb0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
24ec0 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42  age: .check GLOB
24ed0 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20  -PATTERN\n");.  
24ee0 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
24ef0 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20  }else if( (zRes 
24f00 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74  = readFile("test
24f10 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30  case-out.txt", 0
24f20 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))==0 ){.      r
24f30 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24f40 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
24f50 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d   read 'testcase-
24f60 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20  out.txt'\n");.  
24f70 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
24f80 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61  }else if( testca
24f90 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d  se_glob(azArg[1]
24fa0 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zRes)==0 ){.   
24fb0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24fc0 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
24fd0 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73          "testcas
24fe0 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78  e-%s FAILED\n Ex
24ff0 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20  pected: [%s]\n  
25000 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22      Got: [%s]\n"
25010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25020 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c     p->zTestcase,
25030 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29   azArg[1], zRes)
25040 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
25050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25060 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25070 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25  out, "testcase-%
25080 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73  s ok\n", p->zTes
25090 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d  tcase);.      p-
250a0 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d  >nCheck++;.    }
250b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
250c0 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65  e(zRes);.  }else
250d0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
250e0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
250f0 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d  0], "clone", n)=
25100 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
25110 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74  rg==2 ){.      t
25120 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41  ryToClone(p, azA
25130 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
25140 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
25150 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
25160 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e  ge: .clone FILEN
25170 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
25180 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
25190 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
251a0 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
251b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
251c0 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
251d0 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74  0 ){.    ShellSt
251e0 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
251f0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
25200 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
25210 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
25220 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
25230 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
25240 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
25250 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
25260 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
25270 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  DE_List;.    sql
25280 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
25290 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70  zeof(data.colSep
252a0 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c  arator),data.col
252b0 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b  Separator,": ");
252c0 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20  .    data.cnt = 
252d0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
252e0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
252f0 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52  CT name, file FR
25300 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61  OM pragma_databa
25310 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20  se_list",.      
25320 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
25330 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
25340 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
25350 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
25360 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25370 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
25380 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
25390 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
253a0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
253b0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
253c0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
253d0 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
253e0 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22  Arg[0], "dbinfo"
253f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
25400 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  c = shell_dbinfo
25410 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67  _command(p, nArg
25420 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73  , azArg);.  }els
25430 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
25440 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25450 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d  [0], "dump", n)=
25460 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
25470 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b  char *zLike = 0;
25480 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
25490 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65 61  int savedShowHea
254a0 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61  der = p->showHea
254b0 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c  der;.    ShellCl
254c0 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
254d0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53  _PreserveRowid|S
254e0 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a  HFLG_Newlines);.
254f0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
25500 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
25510 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d   if( azArg[i][0]
25520 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
25530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
25540 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20   azArg[i]+1;.   
25550 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
25560 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
25570 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
25580 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22  preserve-rowids"
25590 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
255a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
255b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
255c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
255d0 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73  err, "The --pres
255e0 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69  erve-rowids opti
255f0 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  on is not compat
25600 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  ible".          
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45     " with SQLITE
25630 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
25640 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
25650 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
25660 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
25670 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73  mmand_exit;.#els
25680 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  e.          Shel
25690 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
256a0 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
256b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
256c0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
256d0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77  f( strcmp(z,"new
256e0 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  lines")==0 ){.  
256f0 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74          ShellSet
25700 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
25710 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20  wlines);.       
25720 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
25730 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
25740 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
25750 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
25760 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c  %s\" on \".dump\
25770 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "\n", azArg[i]);
25780 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25790 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
257a0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
257b0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
257c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
257d0 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
257e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
257f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70  r, "Usage: .dump
25800 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77   ?--preserve-row
25810 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20  ids? ".         
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20    "?--newlines? 
25840 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
25850 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
25860 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
25870 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
25880 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
25890 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
258a0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
258b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65   }.    }.    ope
258c0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
258d0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
258e0 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74  back a "dump", t
258f0 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74  he content might
25900 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72   appear in an or
25910 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  der.    ** which
25920 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74   causes immediat
25930 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
25940 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20  nstraints to be 
25950 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a  violated..    **
25960 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65   So disable fore
25970 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign-key constrai
25980 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74  nt enforcement t
25990 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65  o prevent proble
259a0 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70  ms. */.    raw_p
259b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
259c0 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
259d0 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ys=OFF;\n");.   
259e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
259f0 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53  ut, "BEGIN TRANS
25a00 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20  ACTION;\n");.   
25a10 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
25a20 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  ma = 0;.    p->s
25a30 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
25a40 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62     /* Set writab
25a50 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e  le_schema=ON sin
25a60 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63  ce doing so forc
25a70 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69  es SQLite to ini
25a80 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61  tialize.    ** a
25a90 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63  s much of the sc
25aa0 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65  hema as it can e
25ab0 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74  ven if the sqlit
25ac0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69  e_master table i
25ad0 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74  s.    ** corrupt
25ae0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
25af0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41  _exec(p->db, "SA
25b00 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52  VEPOINT dump; PR
25b10 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
25b20 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
25b30 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20  0);.    p->nErr 
25b40 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  = 0;.    if( zLi
25b50 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ke==0 ){.      r
25b60 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
25b70 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
25b80 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
25b90 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
25ba0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
25bb0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
25bc0 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
25bd0 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e  e=='table' AND n
25be0 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71  ame!='sqlite_seq
25bf0 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b  uence'".      );
25c00 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
25c10 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
25c20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
25c30 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
25c40 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
25c50 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
25c60 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74  ERE name=='sqlit
25c70 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
25c80 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
25c90 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
25ca0 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
25cb0 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
25cc0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
25cd0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
25ce0 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
25cf0 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
25d00 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
25d10 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
25d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
25d30 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20  ar *zSql;.      
25d40 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
25d50 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
25d60 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
25d70 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
25d80 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
25d90 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f       "WHERE tbl_
25da0 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44  name LIKE %Q AND
25db0 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a   type=='table'".
25dc0 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73          "  AND s
25dd0 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c  ql NOT NULL", zL
25de0 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
25df0 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
25e00 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20  y(p,zSql);.     
25e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
25e20 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  ql);.      zSql 
25e30 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
25e40 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  f(.        "SELE
25e50 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
25e60 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
25e70 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
25e80 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20  OT NULL".       
25e90 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
25ea0 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
25eb0 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
25ec0 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e      "  AND tbl_n
25ed0 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c  ame LIKE %Q", zL
25ee0 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
25ef0 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
25f00 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20  (p, zSql, 0);.  
25f10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25f20 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
25f30 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c    if( p->writabl
25f40 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
25f50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
25f60 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
25f70 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
25f80 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
25f90 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
25fa0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
25fb0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
25fc0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
25fd0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
25fe0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
25ff0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
26000 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b  , "RELEASE dump;
26010 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
26020 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
26030 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52  ut, p->nErr ? "R
26040 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20  OLLBACK; -- due 
26050 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22  to errors\n" : "
26060 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20  COMMIT;\n");.   
26070 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
26080 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
26090 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
260a0 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
260b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63  mp(azArg[0], "ec
260c0 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ho", n)==0 ){.  
260d0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
260e0 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61  .      setOrClea
260f0 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45  rFlag(p, SHFLG_E
26100 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  cho, azArg[1]);.
26110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26120 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26130 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68  rr, "Usage: .ech
26140 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  o on|off\n");.  
26150 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
26160 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
26170 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
26180 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71  mp(azArg[0], "eq
26190 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
261a0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
261b0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
261c0 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22  (azArg[1],"full"
261d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
261e0 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 32 3b 0a  p->autoEQP = 2;.
261f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26200 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
26210 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
26220 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
26230 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
26240 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
26250 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
26260 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 5c 6e  qp on|off|full\n
26270 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
26280 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
26290 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
262a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
262b0 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30  ], "exit", n)==0
262c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
262d0 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74  >1 && (rc = (int
262e0 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
262f0 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78  Arg[1]))!=0 ) ex
26300 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d  it(rc);.    rc =
26310 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f   2;.  }else..  /
26320 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  * The ".explain"
26330 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f   command is auto
26340 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69  matic now.  It i
26350 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c  s largely pointl
26360 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65  ess.  It.  ** re
26370 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f  tained purely fo
26380 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
26390 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69  atibility */.  i
263a0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
263b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
263c0 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20  explain", n)==0 
263d0 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  ){.    int val =
263e0 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   1;.    if( nArg
263f0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=2 ){.      if(
26400 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
26410 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20  ,"auto")==0 ){. 
26420 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b         val = 99;
26430 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26440 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f        val =  boo
26450 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
26460 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
26470 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d   }.    if( val==
26480 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f  1 && p->mode!=MO
26490 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
264a0 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64      p->normalMod
264b0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
264c0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
264d0 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20  E_Explain;.     
264e0 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
264f0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
26500 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  f( val==0 ){.   
26510 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
26520 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
26530 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
26540 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
26550 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
26560 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26570 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20  val==99 ){.     
26580 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
26590 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
265a0 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
265b0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
265c0 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a  utoExplain = 1;.
265d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
265e0 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73   if( c=='f' && s
265f0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
26600 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e   "fullschema", n
26610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
26620 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
26630 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
26640 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74   0;.    int doSt
26650 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ats = 0;.    mem
26660 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
26670 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
26680 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
26690 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
266a0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
266b0 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
266c0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26    if( nArg==2 &&
266d0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41   optionMatch(azA
266e0 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29  rg[1], "indent")
266f0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63   ){.      data.c
26700 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
26710 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
26720 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a        nArg = 1;.
26730 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
26740 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
26750 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
26760 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73  , "Usage: .fulls
26770 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
26780 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
26790 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
267a0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
267b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
267c0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
267d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
267e0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22  (p->db,.       "
267f0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22  SELECT sql FROM"
26800 0a 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45  .       "  (SELE
26810 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65  CT sql sql, type
26820 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   type, tbl_name 
26830 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e  tbl_name, name n
26840 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20  ame, rowid x".  
26850 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20       "     FROM 
26860 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
26870 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
26880 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
26890 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
268a0 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
268b0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
268c0 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57  ter) ".       "W
268d0 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61  HERE type!='meta
268e0 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c  ' AND sql NOTNUL
268f0 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  L AND name NOT L
26900 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22  IKE 'sqlite_%' "
26910 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  .       "ORDER B
26920 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20  Y rowid",.      
26930 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
26940 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29  , &zErrMsg.    )
26950 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26970 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26980 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  Stmt;.      rc =
26990 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
269a0 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
269b0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
269c0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  T rowid FROM sql
269d0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
269e0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
269f0 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71  RE name GLOB 'sq
26a00 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22  lite_stat[134]'"
26a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26a20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
26a30 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d  .      doStats =
26a40 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
26a50 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
26a60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
26a70 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
26a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
26a90 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20  oStats==0 ){.   
26aa0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
26ab0 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41  >out, "/* No STA
26ac0 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  T tables availab
26ad0 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d  le */\n");.    }
26ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
26af0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26b00 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
26b10 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
26b20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
26b30 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41  ->db, "SELECT 'A
26b40 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
26b50 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  ster'",.        
26b60 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
26b70 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
26b80 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
26b90 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
26ba0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
26bb0 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  t;.      data.zD
26bc0 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
26bd0 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20  te_stat1";.     
26be0 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
26bf0 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
26c00 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  M sqlite_stat1",
26c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26c20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
26c30 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
26c40 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
26c50 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
26c60 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20  te_stat3";.     
26c70 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
26c80 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
26c90 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
26ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26cb0 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
26cc0 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
26cd0 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
26ce0 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
26cf0 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20  te_stat4";.     
26d00 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
26d10 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
26d20 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c  M sqlite_stat4",
26d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d40 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
26d50 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
26d60 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  g);.      raw_pr
26d70 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
26d80 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
26d90 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  ter;\n");.    }.
26da0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
26db0 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
26dc0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
26dd0 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ers", n)==0 ){. 
26de0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
26df0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48  {.      p->showH
26e00 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  eader = booleanV
26e10 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
26e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e30 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26e40 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61  rr, "Usage: .hea
26e50 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  ders on|off\n");
26e60 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
26e70 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
26e80 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
26e90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
26ea0 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "help", n)==0 ){
26eb0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
26ec0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
26ed0 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Help);.  }else..
26ee0 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
26ef0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
26f00 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
26f10 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
26f20 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
26f30 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
26f40 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
26f50 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
26f60 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
26f70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
26f80 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20  f file to extra 
26f90 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  content from */.
26fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
26fb0 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
26fc0 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
26fd0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
27000 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
27010 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
27020 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
27030 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27040 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
27050 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
27060 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27080 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
27090 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f  /.    int needCo
270a0 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
270b0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d    /* True to COM
270c0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
270d0 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  at end */.    in
270e0 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
270f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27100 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
27110 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
27120 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
27130 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
27140 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
27150 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
27160 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20  ImportCtx sCtx; 
27170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27180 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  eader context */
27190 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49  .    char *(SQLI
271a0 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29  TE_CDECL *xRead)
271b0 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a  (ImportCtx*); /*
271c0 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e   Func to read on
271d0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  e value */.    i
271e0 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  nt (SQLITE_CDECL
271f0 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a   *xCloser)(FILE*
27200 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20  );      /* Func 
27210 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f  to close file */
27220 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ..    if( nArg!=
27230 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
27240 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
27250 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49  sage: .import FI
27260 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  LE TABLE\n");.  
27270 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
27280 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
27290 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
272a0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62  Arg[1];.    zTab
272b0 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
272c0 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
272d0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
272e0 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
272f0 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70  f(sCtx));.    op
27300 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
27310 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
27320 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
27330 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
27340 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
27350 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
27380 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
27390 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
273a0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
273b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
273c0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
273d0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
273e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
273f0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
27400 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ter column separ
27410 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
27420 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
27430 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
27440 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
27450 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
27460 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
27470 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
27480 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
27490 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
274a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
274b0 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
274c0 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ull row separato
274d0 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
274e0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
274f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
27500 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32  .    if( nSep==2
27510 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   && p->mode==MOD
27520 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28  E_Csv && strcmp(
27530 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
27540 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b   SEP_CrLf)==0 ){
27550 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69  .      /* When i
27560 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e  mporting CSV (on
27570 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20  ly), if the row 
27580 73 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74  separator is set
27590 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
275a0 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20   default output 
275b0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63  row separator, c
275c0 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20  hange it to the 
275d0 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20  default input.  
275e0 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72      ** row separ
275f0 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69  ator.  This avoi
27600 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69  ds having to mai
27610 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ntain different 
27620 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  input.      ** a
27630 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  nd output row se
27640 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20  parators. */.   
27650 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27660 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
27670 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
27680 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
27690 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53  P_Row);.      nS
276a0 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
276b0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
276c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
276d0 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
276e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
276f0 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
27700 68 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70  haracter row sep
27710 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
27720 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
27730 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
27740 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
27750 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
27760 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c   }.    sCtx.zFil
27770 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
27780 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Ctx.nLine = 1;. 
27790 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c     if( sCtx.zFil
277a0 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
277b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
277c0 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
277d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
277e0 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
277f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
27800 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
27810 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23       return 1;.#
27820 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e  else.      sCtx.
27830 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e  in = popen(sCtx.
27840 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20  zFile+1, "r");. 
27850 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20       sCtx.zFile 
27860 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20  = "<pipe>";.    
27870 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f    xCloser = pclo
27880 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  se;.#endif.    }
27890 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78  else{.      sCtx
278a0 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78  .in = fopen(sCtx
278b0 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
278c0 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
278d0 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
278e0 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
278f0 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20  DE_Ascii ){.    
27900 20 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f    xRead = ascii_
27910 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a  read_one_field;.
27920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27930 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61   xRead = csv_rea
27940 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
27950 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e   }.    if( sCtx.
27960 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
27970 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
27980 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
27990 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
279a0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
279b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
279c0 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70      sCtx.cColSep
279d0 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   = p->colSeparat
279e0 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e  or[0];.    sCtx.
279f0 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77  cRowSep = p->row
27a00 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
27a10 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
27a20 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
27a30 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
27a40 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
27a50 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
27a60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27a70 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
27a80 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
27a90 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
27aa0 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
27ab0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
27ac0 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Byte = strlen30(
27ad0 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
27ae0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
27af0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
27b00 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
27b10 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
27b20 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29  d_char(&sCtx, 0)
27b30 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72  ;    /* To ensur
27b40 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f  e sCtx.z is allo
27b50 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
27b60 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73   rc && sqlite3_s
27b70 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20  trglob("no such 
27b80 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74  table: *", sqlit
27b90 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
27ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
27bb0 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
27bc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
27bd0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
27be0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
27bf0 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
27c00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52  .      while( xR
27c10 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20  ead(&sCtx) ){.  
27c20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
27c30 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27c40 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20  "%z%c\n  \"%w\" 
27c50 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20  TEXT", zCreate, 
27c60 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20  cSep, sCtx.z);. 
27c70 20 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c         cSep = ',
27c80 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ';.        if( s
27c90 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
27ca0 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b  cColSep ) break;
27cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27cc0 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
27cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27ce0 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
27cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27d00 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
27d10 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
27d20 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75  x.in);.        u
27d30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
27d40 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c  r,"%s: empty fil
27d50 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  e\n", sCtx.zFile
27d60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
27d70 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
27d80 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
27d90 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
27da0 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a  \n)", zCreate);.
27db0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27dc0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
27dd0 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
27de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27df0 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
27e00 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27e10 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
27e20 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41  tf(stderr, "CREA
27e30 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29  TE TABLE %s(...)
27e40 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
27e50 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20  zTable,.        
27e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27e70 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
27e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27e90 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
27ea0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
27eb0 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  tx.in);.        
27ec0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
27ed0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
27ee0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
27ef0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
27f00 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
27f10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
27f20 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
27f30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
27f40 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
27f50 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
27f60 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
27f70 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
27f80 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
27f90 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
27fa0 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
27fb0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
27fc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
27fd0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  .    nCol = sqli
27fe0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
27ff0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
28000 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
28010 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
28020 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  = 0;.    if( nCo
28030 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
28040 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20   /* no columns, 
28050 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  no error */.    
28060 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
28070 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32  alloc64( nByte*2
28080 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
28090 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
280a0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
280b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
280c0 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
280d0 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78  ory\n");.      x
280e0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
280f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
28100 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28110 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
28120 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+20, zSql, "INS
28130 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20  ERT INTO \"%w\" 
28140 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
28150 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
28160 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
28170 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
28180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
28190 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
281a0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
281b0 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
281c0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
281d0 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
281e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
281f0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
28200 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
28210 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
28220 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
28230 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28240 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28250 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
28260 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
28270 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
28280 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
28290 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
282a0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
282b0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
282c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
282d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65  1;.    }.    nee
282e0 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65  dCommit = sqlite
282f0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
28300 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  (p->db);.    if(
28310 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
28320 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
28330 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
28340 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20   0);.    do{.   
28350 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
28360 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20   = sCtx.nLine;. 
28370 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
28380 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
28390 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52      char *z = xR
283a0 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20  ead(&sCtx);.    
283b0 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
283c0 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
283d0 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72  nd-of-file befor
283e0 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f  e finding any co
283f0 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a  lumns?.        *
28400 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e  * If so, stop in
28410 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
28420 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e  lling the remain
28430 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
28440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28450 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30  if( z==0 && i==0
28460 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28470 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
28480 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
28490 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d  -of-file OR end-
284a0 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66  of-line before f
284b0 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20  inding any.     
284c0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
284d0 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66   ASCII mode?  If
284e0 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
284f0 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
28500 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
28510 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
28520 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
28530 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f         if( p->mo
28540 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26  de==MODE_Ascii &
28550 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  & (z==0 || z[0]=
28560 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72  =0) && i==0 ) br
28570 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
28580 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
28590 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31  Stmt, i+1, z, -1
285a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
285b0 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NT);.        if(
285c0 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74   i<nCol-1 && sCt
285d0 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
285e0 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
285f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
28600 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
28610 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
28620 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
28630 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
28650 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20  illing the rest 
28660 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20  with NULL\n",.  
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
28690 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
286a0 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
286b0 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
286c0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c         while( i<
286d0 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33  =nCol ){ sqlite3
286e0 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
286f0 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20  , i); i++; }.   
28700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28710 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
28720 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
28730 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  p ){.        do{
28740 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64  .          xRead
28750 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
28760 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
28770 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
28780 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
28790 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38   );.        utf8
287a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
287b0 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
287c0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
287d0 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
28800 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
28830 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
28840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28850 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
28860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
28870 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
28880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28890 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
288a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
288b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
288c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
288d0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
288e0 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
288f0 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69   %s\n", sCtx.zFi
28900 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
28910 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c            startL
28920 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ine, sqlite3_err
28930 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
28940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28950 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e     }while( sCtx.
28960 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20  cTerm!=EOF );.. 
28970 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
28980 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
28990 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
289a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
289b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
289c0 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29  if( needCommit )
289d0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
289e0 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
289f0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
28a00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28a10 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66  _UNTESTABLE.  if
28a20 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
28a30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
28a40 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20  mposter", n)==0 
28a50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
28a60 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  l;.    char *zCo
28a70 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73  llist = 0;.    s
28a80 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
28a90 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d  mt;.    int tnum
28aa0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
28ab0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
28ac0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
28ad0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
28ae0 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20  sage: .imposter 
28af0 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e  INDEX IMPOSTER\n
28b00 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
28b10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
28b20 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
28b30 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
28b40 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71  b(p, 0);.    zSq
28b50 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
28b60 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74  ntf("SELECT root
28b70 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
28b80 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
28bb0 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
28bc0 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31  index'", azArg[1
28bd0 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
28be0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
28bf0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
28c00 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
28c10 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
28c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
28c30 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
28c40 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
28c50 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f   tnum = sqlite3_
28c60 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
28c70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
28c80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
28c90 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
28ca0 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   tnum==0 ){.    
28cb0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
28cc0 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69  derr, "no such i
28cd0 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  ndex: \"%s\"\n",
28ce0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
28cf0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
28d00 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
28d10 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
28d20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
28d30 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
28d40 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71   index_xinfo='%q
28d50 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
28d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
28d70 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
28d80 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
28d90 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
28da0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
28db0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77      i = 0;.    w
28dc0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
28dd0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
28de0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
28df0 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a  har zLabel[20];.
28e00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28e10 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20   *zCol = (const 
28e20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
28e30 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
28e40 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  2);.      i++;. 
28e50 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30       if( zCol==0
28e60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
28e70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
28e80 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20  nt(pStmt,1)==-1 
28e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
28ea0 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20  l = "_ROWID_";. 
28eb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28ed0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
28ee0 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22  zLabel),zLabel,"
28ef0 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20  expr%d",i);.    
28f00 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61        zCol = zLa
28f10 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  bel;.        }. 
28f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28f30 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a   zCollist==0 ){.
28f40 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
28f50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
28f60 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f  tf("\"%w\"", zCo
28f70 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
28f80 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73  .        zCollis
28f90 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
28fa0 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c  ntf("%z,\"%w\"",
28fb0 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29   zCollist, zCol)
28fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28fe0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
28ff0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
29000 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
29010 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
29020 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41   \"%w\"(%s,PRIMA
29030 52 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f  RY KEY(%s))WITHO
29040 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
29050 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a       azArg[2], z
29060 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73  Collist, zCollis
29070 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
29080 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
29090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
290a0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
290b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
290c0 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
290d0 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
290e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
290f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29100 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
29110 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  c(p->db, zSql, 0
29120 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
29130 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
29140 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
29150 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
29160 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  >db, "main", 0, 
29170 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
29180 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
29190 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
291a0 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20  "Error in [%s]: 
291b0 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c  %s\n", zSql, sql
291c0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
291d0 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  b));.      }else
291e0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
291f0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
29200 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  s;\n", zSql);.  
29210 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29220 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20  (stdout,.       
29230 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72      "WARNING: wr
29240 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f  iting to an impo
29250 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20  ster table will 
29260 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65  corrupt the inde
29270 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b  x!\n".        );
29280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29290 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
292a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
292b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
292c0 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25  POSTER returns %
292d0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
292e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
292f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29300 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  zSql);.  }else.#
29310 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
29320 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  d(SQLITE_OMIT_TE
29330 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a  ST_CONTROL) */..
29340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
29350 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69  ABLE_IOTRACE.  i
29360 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
29370 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29380 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20  iotrace", n)==0 
29390 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50  ){.    SQLITE_AP
293a0 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53  I extern void (S
293b0 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c  QLITE_CDECL *sql
293c0 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
293d0 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a  st char*, ...);.
293e0 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20      if( iotrace 
293f0 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f  && iotrace!=stdo
29400 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72  ut ) fclose(iotr
29410 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63  ace);.    iotrac
29420 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  e = 0;.    if( n
29430 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73  Arg<2 ){.      s
29440 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
29450 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
29460 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
29470 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20  , "-")==0 ){.   
29480 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
29490 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
294a0 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  f;.      iotrace
294b0 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d   = stdout;.    }
294c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72  else{.      iotr
294d0 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  ace = fopen(azAr
294e0 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20  g[1], "w");.    
294f0 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30    if( iotrace==0
29500 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
29510 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29520 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
29530 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
29540 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
29550 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
29560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
29570 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
29580 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
29590 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
295a0 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
295b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
295c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
295d0 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26  =='l' && n>=5 &&
295e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
295f0 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d  ], "limits", n)=
29600 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
29610 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
29620 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
29630 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20  r *zLimitName;  
29640 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69   /* Name of a li
29650 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e  mit */.       in
29660 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20  t limitCode;    
29670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
29680 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
29690 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20   limit */.    } 
296a0 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20  aLimit[] = {.   
296b0 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20     { "length",  
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
296d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
296e0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
296f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
29700 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20  "sql_length",   
29710 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
29720 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75  },.      { "colu
29750 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  mn",            
29760 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
29770 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
29780 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
29790 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74      { "expr_dept
297a0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
297b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
297c0 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
297d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
297e0 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63   "compound_selec
297f0 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  t",       SQLITE
29800 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
29810 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
29820 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62   },.      { "vdb
29830 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20  e_op",          
29840 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
29850 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
29860 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
29870 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e       { "function
29880 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20  _arg",          
29890 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
298a0 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
298b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
298c0 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20  { "attached",   
298d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
298e0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69    },.      { "li
29910 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74  ke_pattern_lengt
29920 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  h",   SQLITE_LIM
29930 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
29940 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a  LENGTH       },.
29950 20 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c        { "variabl
29960 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  e_number",      
29970 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
29980 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
29990 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
299a0 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74   { "trigger_dept
299b0 68 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  h",         SQLI
299c0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
299d0 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
299e0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77     },.      { "w
299f0 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20  orker_threads", 
29a00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
29a10 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
29a20 44 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  DS            },
29a30 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
29a40 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f  i, n2;.    open_
29a50 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
29a60 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
29a70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
29a80 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
29a90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
29aa0 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
29ab0 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69  ", aLimit[i].zLi
29ac0 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
29ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29ae0 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
29af0 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65  mit[i].limitCode
29b00 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a  , -1));.      }.
29b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
29b20 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61  rg>3 ){.      ra
29b30 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29b40 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20   "Usage: .limit 
29b50 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f  NAME ?NEW-VALUE?
29b60 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
29b70 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
29b80 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
29b90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ba0 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20     int iLimit = 
29bb0 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73  -1;.      n2 = s
29bc0 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d  trlen30(azArg[1]
29bd0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
29be0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
29bf0 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
29c00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29c10 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74  _strnicmp(aLimit
29c20 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20  [i].zLimitName, 
29c30 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30  azArg[1], n2)==0
29c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
29c50 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ( iLimit<0 ){.  
29c60 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74            iLimit
29c70 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
29c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29c90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29ca0 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75  tderr, "ambiguou
29cb0 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  s limit: \"%s\"\
29cc0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
29cd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29ce0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  1;.            g
29cf0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
29d00 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
29d10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29d20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
29d30 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
29d40 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29d50 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
29d60 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22  limit: \"%s\"\n"
29d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29d80 20 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20           "enter 
29d90 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68  \".limits\" with
29da0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
29db0 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20  r a list.\n",.  
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
29de0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
29df0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
29e00 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
29e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29e20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
29e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
29e40 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
29e50 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74  it[iLimit].limit
29e60 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Code,.          
29e70 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
29e80 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
29e90 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[2]));.      
29ea0 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
29eb0 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d  %20s %d\n", aLim
29ec0 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69  it[iLimit].zLimi
29ed0 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  tName,.         
29ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
29ef0 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
29f00 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64  iLimit].limitCod
29f10 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  e, -1));.    }. 
29f20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
29f30 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73  ='l' && n>2 && s
29f40 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
29f50 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29   "lint", n)==0 )
29f60 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
29f70 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74   0);.    lintDot
29f80 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
29f90 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
29fa0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29fb0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
29fc0 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c  SION.  if( c=='l
29fd0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
29fe0 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e  rg[0], "load", n
29ff0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2a000 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a  t char *zFile, *
2a010 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20  zProc;.    char 
2a020 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2a030 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
2a040 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2a050 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2a060 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54   .load FILE ?ENT
2a070 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20  RYPOINT?\n");.  
2a080 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2a090 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2a0a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2a0b0 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
2a0c0 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20  g[1];.    zProc 
2a0d0 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  = nArg>=3 ? azAr
2a0e0 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70  g[2] : 0;.    op
2a0f0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2a100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
2a110 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
2a120 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
2a130 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2a140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
2a160 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a170 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
2a180 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
2a190 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2a1a0 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
2a1b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2a1c0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
2a1d0 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
2a1e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67  p(azArg[0], "log
2a1f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2a200 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
2a210 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a220 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2a230 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  .log FILENAME\n"
2a240 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2a250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a270 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2a280 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c        output_fil
2a290 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29  e_close(p->pLog)
2a2a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  ;.      p->pLog 
2a2b0 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
2a2c0 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  en(zFile);.    }
2a2d0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a2e0 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
2a2f0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
2a300 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2a310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
2a320 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  de = nArg>=2 ? a
2a330 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20  zArg[1] : "";.  
2a340 20 20 69 6e 74 20 6e 32 20 3d 20 28 69 6e 74 29    int n2 = (int)
2a350 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b 0a 20  strlen(zMode);. 
2a360 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64     int c2 = zMod
2a370 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32  e[0];.    if( c2
2a380 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26  =='l' && n2>2 &&
2a390 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2a3a0 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
2a3b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2a3c0 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20  e = MODE_Line;. 
2a3d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2a3e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2a3f0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2a400 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2a410 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
2a420 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20  lse if( c2=='c' 
2a430 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a440 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32  [1],"columns",n2
2a450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2a460 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  >mode = MODE_Col
2a470 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  umn;.      sqlit
2a480 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2a490 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2a4a0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2a4b0 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
2a4c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2a4d0 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26  =='l' && n2>2 &&
2a4e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2a4f0 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20  ],"list",n2)==0 
2a500 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2a510 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
2a520 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a530 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2a540 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2a550 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2a560 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  EP_Column);.    
2a570 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2a580 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2a590 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2a5a0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2a5b0 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
2a5c0 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20   if( c2=='h' && 
2a5d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2a5e0 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29  ,"html",n2)==0 )
2a5f0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2a600 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20  = MODE_Html;.   
2a610 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2a620 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
2a630 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29  Arg[1],"tcl",n2)
2a640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2a650 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b  mode = MODE_Tcl;
2a660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2a670 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2a680 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
2a690 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2a6a0 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20 20  , SEP_Space);.  
2a6b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a6c0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2a6d0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2a6e0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2a6f0 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
2a700 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26  se if( c2=='c' &
2a710 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a720 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20  1],"csv",n2)==0 
2a730 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2a740 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
2a750 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2a760 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2a770 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2a780 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2a790 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20  P_Comma);.      
2a7a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2a7b0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2a7c0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2a7d0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2a7e0 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rLf);.    }else 
2a7f0 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73  if( c2=='t' && s
2a800 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
2a810 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  "tabs",n2)==0 ){
2a820 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2a830 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
2a840 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2a850 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2a860 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2a870 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2a880 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Tab);.    }else
2a890 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26 20   if( c2=='i' && 
2a8a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2a8b0 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30  ,"insert",n2)==0
2a8c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2a8d0 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
2a8e0 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65  .      set_table
2a8f0 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33  _name(p, nArg>=3
2a900 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74   ? azArg[2] : "t
2a910 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73  able");.    }els
2a920 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26 26  e if( c2=='q' &&
2a930 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2a940 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30  ],"quote",n2)==0
2a950 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2a960 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a  e = MODE_Quote;.
2a970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2a980 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
2a990 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69 69  (azArg[1],"ascii
2a9a0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2a9b0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2a9c0 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71  _Ascii;.      sq
2a9d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2a9e0 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2a9f0 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2aa00 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69  parator, SEP_Uni
2aa10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2aa20 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2aa30 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2aa40 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2aa50 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64 29  tor, SEP_Record)
2aa60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2aa70 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nArg==1 ){.     
2aa80 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2aa90 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75 74  ut, "current out
2aaa0 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c  put mode: %s\n",
2aab0 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f   modeDescr[p->mo
2aac0 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  de]);.    }else{
2aad0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2aae0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2aaf0 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  : mode should be
2ab00 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
2ab10 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75 6d      "ascii colum
2ab20 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72  n csv html inser
2ab30 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f 74  t line list quot
2ab40 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a  e tabs tcl\n");.
2ab50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2ab60 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65    }.    p->cMode
2ab70 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65   = p->mode;.  }e
2ab80 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e  lse..  if( c=='n
2ab90 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2aba0 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75  rg[0], "nullvalu
2abb0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2abc0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2abd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2abe0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2abf0 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e  >nullValue), p->
2ac00 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20  nullValue,.     
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41    "%.*s", (int)A
2ac30 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c  rraySize(p->null
2ac40 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b  Value)-1, azArg[
2ac50 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2ac60 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ac70 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ac80 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49   .nullvalue STRI
2ac90 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  NG\n");.      rc
2aca0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2acb0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f  lse..  if( c=='o
2acc0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2acd0 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e  rg[0], "open", n
2ace0 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a  )==0 && n>=2 ){.
2acf0 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69      char *zNewFi
2ad00 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65  lename;  /* Name
2ad10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ad20 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2ad30 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d  .    int iName =
2ad40 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   1;       /* Ind
2ad50 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66  ex in azArg[] of
2ad60 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f   the filename */
2ad70 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61 67  .    int newFlag
2ad80 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
2ad90 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c 65  e to delete file
2ada0 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20   before opening 
2adb0 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  */.    /* Close 
2adc0 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
2add0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65 73  abase */.    ses
2ade0 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70  sion_close_all(p
2adf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
2ae00 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20  lose(p->db);.   
2ae10 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20   p->db = 0;.    
2ae20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
2ae30 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
2ae40 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43  free(p->zFreeOnC
2ae50 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46  lose);.    p->zF
2ae60 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a  reeOnClose = 0;.
2ae70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
2ae80 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
2ae90 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66  guments */.    f
2aea0 6f 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d  or(iName=1; iNam
2aeb0 65 3c 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b  e<nArg && azArg[
2aec0 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20  iName][0]=='-'; 
2aed0 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20  iName++){.      
2aee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2aef0 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20  azArg[iName];.  
2af00 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61      if( optionMa
2af10 74 63 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a  tch(z,"new") ){.
2af20 20 20 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20          newFlag 
2af30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2af40 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
2af50 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2af60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
2af70 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
2af80 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
2af90 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2afa0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2afb0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2afc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  }.    }.    /* I
2afd0 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  f a filename is 
2afe0 73 70 65 63 69 66 69 65 64 2c 20 74 72 79 20 74  specified, try t
2aff0 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20  o open it first 
2b000 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e  */.    zNewFilen
2b010 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65  ame = nArg>iName
2b020 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   ? sqlite3_mprin
2b030 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  tf("%s", azArg[i
2b040 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20  Name]) : 0;.    
2b050 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  if( zNewFilename
2b060 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2b070 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c  wFlag ) shellDel
2b080 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65  eteFile(zNewFile
2b090 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  name);.      p->
2b0a0 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e  zDbFilename = zN
2b0b0 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  ewFilename;.    
2b0c0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b    open_db(p, 1);
2b0d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62  .      if( p->db
2b0e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2b0f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b100 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2b110 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20  t open '%s'\n", 
2b120 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zNewFilename);. 
2b130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b140 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  ree(zNewFilename
2b150 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b160 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65          p->zFree
2b170 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69  OnClose = zNewFi
2b180 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  lename;.      }.
2b190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2b1a0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >db==0 ){.      
2b1b0 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63  /* As a fall-bac
2b1c0 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61  k open a TEMP da
2b1d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2b1e0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
2b1f0 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
2b200 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  b(p, 0);.    }. 
2b210 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b220 3d 27 6f 27 0a 20 20 20 26 26 20 28 73 74 72 6e  ='o'.   && (strn
2b230 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2b240 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 7c 7c  utput", n)==0 ||
2b250 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b260 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30  ], "once", n)==0
2b270 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
2b280 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e   char *zFile = n
2b290 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
2b2a0 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20  ] : "stdout";.  
2b2b0 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a    if( nArg>2 ){.
2b2c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b2d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2b2e0 3a 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c 20 61  : .%s FILE\n", a
2b2f0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
2b300 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2b310 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2b320 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2b330 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63  if( n>1 && strnc
2b340 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e  mp(azArg[0], "on
2b350 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
2b360 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
2b370 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2b380 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2b390 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c 45 5c  age: .once FILE\
2b3a0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
2b3b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2b3c0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2b3d0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2b3e0 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d     p->outCount =
2b3f0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
2b400 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
2b410 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2b420 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
2b430 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30  .    if( zFile[0
2b440 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66  ]=='|' ){.#ifdef
2b450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
2b460 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  EN.      raw_pri
2b470 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2b480 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f  or: pipes are no
2b490 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74  t supported in t
2b4a0 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20  his OS\n");.    
2b4b0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2b4c0 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
2b4d0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e  .#else.      p->
2b4e0 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c  out = popen(zFil
2b4f0 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20  e + 1, "w");.   
2b500 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
2b510 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2b520 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2b530 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2b540 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e  en pipe \"%s\"\n
2b550 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20  ", zFile + 1);. 
2b560 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20         p->out = 
2b570 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  stdout;.        
2b580 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
2b590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2b5a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2b5b0 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29  zeof(p->outfile)
2b5c0 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25  , p->outfile, "%
2b5d0 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  s", zFile);.    
2b5e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2b5f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
2b600 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  ut = output_file
2b610 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20  _open(zFile);.  
2b620 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d      if( p->out==
2b630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
2b640 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f   strcmp(zFile,"o
2b650 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ff")!=0 ){.     
2b660 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2b670 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2b680 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  cannot write to 
2b690 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
2b6a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b6b0 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
2b6c0 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
2b6d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c   = 1;.      } el
2b6e0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  se {.        sql
2b6f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2b700 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29  zeof(p->outfile)
2b710 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25  , p->outfile, "%
2b720 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  s", zFile);.    
2b730 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2b740 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
2b750 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2b760 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72  mp(azArg[0], "pr
2b770 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
2b780 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2b790 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2b7a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
2b7b0 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >1 ) raw_printf(
2b7c0 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20  p->out, " ");.  
2b7d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b7e0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a  p->out, "%s", az
2b7f0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[i]);.    }. 
2b800 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2b810 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
2b820 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2b830 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  p' && strncmp(az
2b840 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22  Arg[0], "prompt"
2b850 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2b860 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a  f( nArg >= 2) {.
2b870 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61        strncpy(ma
2b880 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31  inPrompt,azArg[1
2b890 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
2b8a0 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b  (mainPrompt)-1);
2b8b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2b8c0 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20  Arg >= 3) {.    
2b8d0 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e    strncpy(contin
2b8e0 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32  uePrompt,azArg[2
2b8f0 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
2b900 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29  (continuePrompt)
2b910 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -1);.    }.  }el
2b920 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27  se..  if( c=='q'
2b930 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b940 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29  g[0], "quit", n)
2b950 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2b960 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  2;.  }else..  if
2b970 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
2b980 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b990 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29  g[0], "read", n)
2b9a0 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
2b9b0 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41  *alt;.    if( nA
2b9c0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
2b9d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b9e0 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64 20  , "Usage: .read 
2b9f0 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
2ba00 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2ba10 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2ba20 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2ba30 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  alt = fopen(azAr
2ba40 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20  g[1], "rb");.   
2ba50 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20   if( alt==0 ){. 
2ba60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2ba70 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2ba80 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2ba90 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2baa0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2bab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bac0 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
2bad0 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20  put(p, alt);.   
2bae0 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a     fclose(alt);.
2baf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2bb00 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
2bb10 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2bb20 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72  zArg[0], "restor
2bb30 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2bb40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
2bb50 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  cFile;.    const
2bb60 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
2bb70 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20  sqlite3 *pSrc;. 
2bb80 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
2bb90 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
2bba0 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30  int nTimeout = 0
2bbb0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ;..    if( nArg=
2bbc0 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =2 ){.      zSrc
2bbd0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
2bbe0 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61  .      zDb = "ma
2bbf0 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  in";.    }else i
2bc00 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
2bc10 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
2bc20 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a  zArg[2];.      z
2bc30 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  Db = azArg[1];. 
2bc40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2bc60 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73 74  r, "Usage: .rest
2bc70 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22  ore ?DB? FILE\n"
2bc80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2bc90 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2bca0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2bcb0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2bcc0 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46  lite3_open(zSrcF
2bcd0 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20  ile, &pSrc);.   
2bce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bcf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
2bd00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bd10 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2bd20 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
2bd30 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  SrcFile);.      
2bd40 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
2bd50 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
2bd60 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  n 1;.    }.    o
2bd70 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2bd80 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
2bd90 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
2bda0 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63  p->db, zDb, pSrc
2bdb0 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
2bdc0 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
2bdd0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2bde0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2bdf0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2be00 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2be10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2be20 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
2be30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2be40 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
2be50 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
2be60 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
2be70 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
2be80 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63  .          || rc
2be90 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29  ==SQLITE_BUSY  )
2bea0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
2beb0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
2bec0 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65         if( nTime
2bed0 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65  out++ >= 3 ) bre
2bee0 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
2bef0 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a  te3_sleep(100);.
2bf00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bf10 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2bf20 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
2bf30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2bf40 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
2bf50 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
2bf60 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2bf70 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
2bf80 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
2bf90 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2bfa0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2bfb0 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
2bfc0 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20  e is busy\n");. 
2bfd0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2bfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
2bff0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2c000 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2c010 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2c020 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72  p->db));.      r
2c030 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
2c040 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
2c050 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 0a  Src);.  }else...
2c060 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2c070 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2c080 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e  , "scanstats", n
2c090 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2c0a0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2c0b0 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20   p->scanstatsOn 
2c0c0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
2c0d0 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65  zArg[1]);.#ifnde
2c0e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c0f0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
2c100 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c110 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
2c120 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f  g: .scanstats no
2c130 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
2c140 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
2c150 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2c160 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c170 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c180 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e  e: .scanstats on
2c190 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2c1a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2c1b0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2c1c0 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
2c1d0 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
2c1e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c1f0 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
2c200 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  t;.    ShellStat
2c210 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
2c220 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2c230 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c240 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Div = 0;.    int
2c250 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 0a 20   iSchema = 0;.. 
2c260 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2c270 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2c280 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
2c290 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
2c2a0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2c2b0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2c2c0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2c2d0 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54  _Semi;.    initT
2c2e0 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
2c2f0 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 26     if( nArg>=2 &
2c300 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a  & optionMatch(az
2c310 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22  Arg[1], "indent"
2c320 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  ) ){.      data.
2c330 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2c340 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b  e = MODE_Pretty;
2c350 0a 20 20 20 20 20 20 6e 41 72 67 2d 2d 3b 0a 20  .      nArg--;. 
2c360 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32       if( nArg==2
2c370 20 29 20 61 7a 41 72 67 5b 31 5d 20 3d 20 61 7a   ) azArg[1] = az
2c380 41 72 67 5b 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  Arg[2];.    }.  
2c390 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26    if( nArg==2 &&
2c3a0 20 61 7a 41 72 67 5b 31 5d 5b 30 5d 21 3d 27 2d   azArg[1][0]!='-
2c3b0 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ' ){.      int i
2c3c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2c3d0 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69 2b   azArg[1][i]; i+
2c3e0 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20 3d  +) azArg[1][i] =
2c3f0 20 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67 5b 31   ToLower(azArg[1
2c400 5d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  ][i]);.      if(
2c410 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2c420 2c 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  ,"sqlite_master"
2c430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c440 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32  char *new_argv[2
2c450 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b  ], *new_colv[2];
2c460 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
2c470 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20 54  v[0] = "CREATE T
2c480 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  ABLE sqlite_mast
2c490 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20  er (\n".        
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2c4b0 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20   type text,\n". 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4d0 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78       "  name tex
2c4e0 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74              "  t
2c500 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  bl_name text,\n"
2c510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c520 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61         "  rootpa
2c530 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20  ge integer,\n". 
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74       "  sql text
2c560 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
2c570 20 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20            ")";. 
2c580 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b         new_argv[
2c590 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
2c5a0 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73  new_colv[0] = "s
2c5b0 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ql";.        new
2c5c0 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _colv[1] = 0;.  
2c5d0 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26        callback(&
2c5e0 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67  data, 1, new_arg
2c5f0 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20  v, new_colv);.  
2c600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c610 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
2c620 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
2c630 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65  rg[1],"sqlite_te
2c640 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29  mp_master")==0 )
2c650 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2c660 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65  new_argv[2], *ne
2c670 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20  w_colv[2];.     
2c680 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d     new_argv[0] =
2c690 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
2c6a0 42 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  BLE sqlite_temp_
2c6b0 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20  master (\n".    
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6d0 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c    "  type text,\
2c6e0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2c6f0 20 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65           "  name
2c700 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74  "  tbl_name text
2c730 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
2c740 20 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f             "  ro
2c750 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c  otpage integer,\
2c760 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2c770 20 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20           "  sql 
2c780 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  text\n".        
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
2c7a0 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ";.        new_a
2c7b0 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  rgv[1] = 0;.    
2c7c0 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20      new_colv[0] 
2c7d0 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20  = "sql";.       
2c7e0 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30   new_colv[1] = 0
2c7f0 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ;.        callba
2c800 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77  ck(&data, 1, new
2c810 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29  _argv, new_colv)
2c820 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
2c830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
2c850 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 20  Div = "(";.     
2c860 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2c870 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
2c880 20 20 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20    zDiv = "(";.  
2c890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c8a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2c8b0 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d  , "Usage: .schem
2c8c0 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49  a ?--indent? ?LI
2c8d0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
2c8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2c8f0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2c900 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2c910 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20   }.    if( zDiv 
2c920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c930 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
2c940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2c950 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2c960 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
2c970 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  ame FROM pragma_
2c980 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a  database_list",.
2c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
2c9b0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2c9c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c9d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c9e0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2c9f0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2ca00 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2ca10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ca20 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2ca30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2ca40 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2ca50 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2ca60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca70 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2ca80 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c  ect, "SELECT sql
2ca90 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20   FROM", 0);.    
2caa0 20 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20    iSchema = 0;. 
2cab0 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
2cac0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2cad0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2cae0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2caf0 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20  r *zDb = (const 
2cb00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2cb10 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2cb20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61   0);.        cha
2cb30 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20  r zScNum[30];.  
2cb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2cb50 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
2cb60 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22  cNum), zScNum, "
2cb70 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b  %d", ++iSchema);
2cb80 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2cb90 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
2cba0 69 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  iv, 0);.        
2cbb0 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41  zDiv = " UNION A
2cbc0 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 69 66  LL ";.        if
2cbd0 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 20 22 6d  ( strcmp(zDb, "m
2cbe0 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  ain")!=0 ){.    
2cbf0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2cc00 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
2cc10 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
2cc20 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
2cc30 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
2cc40 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
2cc50 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
2cc60 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2cc70 53 65 6c 65 63 74 2c 20 22 29 20 41 53 20 73 71  Select, ") AS sq
2cc80 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
2cc90 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22  e, name, rowid,"
2cca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ccb0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2ccc0 65 63 74 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b  ect, zScNum, 0);
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
2cce0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2ccf0 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20 30 29  " AS snum, ", 0)
2cd00 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  ;.          appe
2cd10 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2cd20 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
2cd30 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2cd40 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53  t(&sSelect, " AS
2cd50 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30   sname FROM ", 0
2cd60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  );.          app
2cd70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2cd80 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
2cd90 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2cda0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71  t(&sSelect, ".sq
2cdb0 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29  lite_master", 0)
2cdc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cdd0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
2cde0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2cdf0 22 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70  "SELECT sql, typ
2ce00 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
2ce10 65 2c 20 72 6f 77 69 64 2c 20 22 2c 20 30 29 3b  e, rowid, ", 0);
2ce20 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
2ce30 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2ce40 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
2ce50 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2ce60 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20  (&sSelect, " AS 
2ce70 73 6e 75 6d 2c 20 27 6d 61 69 6e 27 20 41 53 20  snum, 'main' AS 
2ce80 73 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74  sname FROM sqlit
2ce90 65 5f 6d 61 73 74 65 72 22 2c 30 29 3b 0a 20 20  e_master",0);.  
2cea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ceb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
2cec0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2ced0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2cee0 26 73 53 65 6c 65 63 74 2c 20 22 29 20 57 48 45  &sSelect, ") WHE
2cef0 52 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  RE ", 0);.      
2cf00 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20  if( nArg>1 ){.  
2cf10 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 61 72        char *zQar
2cf20 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
2cf30 6e 74 66 28 22 25 51 22 2c 20 61 7a 41 72 67 5b  ntf("%Q", azArg[
2cf40 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
2cf50 20 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31 5d   strchr(azArg[1]
2cf60 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  , '.') ){.      
2cf70 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2cf80 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28  sSelect, "lower(
2cf90 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73  printf('%s.%s',s
2cfa0 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22  name,tbl_name))"
2cfb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
2cfc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2cfd0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2cfe0 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e  ct, "lower(tbl_n
2cff0 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame)", 0);.     
2d000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70     }.        app
2d010 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2d020 2c 20 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31  , strchr(azArg[1
2d030 5d 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c 4f 42  ], '*') ? " GLOB
2d040 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30   " : " LIKE ", 0
2d050 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2d060 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2d070 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20  zQarg, 0);.     
2d080 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2d090 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
2d0a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2d0b0 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
2d0c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d0d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2d0e0 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
2d0f0 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
2d100 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d120 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
2d130 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
2d140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d150 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73  e3_exec(p->db, s
2d160 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61  Select.z, callba
2d170 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2d180 4d 73 67 29 3b 0a 20 20 20 20 20 20 66 72 65 65  Msg);.      free
2d190 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
2d1a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
2d1b0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
2d1c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2d1d0 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2d1e0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
2d1f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2d200 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
2d210 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2d220 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45  if( rc != SQLITE
2d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
2d240 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2d250 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
2d260 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2d270 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  on\n");.      rc
2d280 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2d290 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
2d2a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
2d2b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2d2c0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
2d2d0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2d2e0 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
2d2f0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d  if( c=='s' && n=
2d300 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  =11 && strncmp(a
2d310 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74  zArg[0], "select
2d320 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
2d330 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
2d340 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29 69  ctTrace = (int)i
2d350 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
2d360 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  g[1]);.  }else.#
2d370 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2d380 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2d390 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28 20  _SESSION).  if( 
2d3a0 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
2d3b0 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73  p(azArg[0],"sess
2d3c0 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e  ion",n)==0 && n>
2d3d0 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65  =3 ){.    OpenSe
2d3e0 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
2d3f0 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30  = &p->aSession[0
2d400 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  ];.    char **az
2d410 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b  Cmd = &azArg[1];
2d420 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d 20  .    int iSes = 
2d430 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64 20  0;.    int nCmd 
2d440 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20 20  = nArg - 1;.    
2d450 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
2d460 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65  Arg<=1 ) goto se
2d470 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
2d480 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  or;.    open_db(
2d490 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
2d4a0 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
2d4b0 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65 73  for(iSes=0; iSes
2d4c0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53  <p->nSession; iS
2d4d0 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  es++){.        i
2d4e0 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
2d4f0 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d  ssion[iSes].zNam
2d500 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20  e, azArg[1])==0 
2d510 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2d520 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73 3c  .      if( iSes<
2d530 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
2d540 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20         pSession 
2d550 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  = &p->aSession[i
2d560 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a  Ses];.        az
2d570 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  Cmd++;.        n
2d580 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  Cmd--;.      }el
2d590 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73  se{.        pSes
2d5a0 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2d5b0 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ion[0];.        
2d5c0 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iSes = 0;.      
2d5d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2d5e0 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68 20  .session attach 
2d5f0 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76  TABLE.    ** Inv
2d600 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 73  oke the sqlite3s
2d610 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
2d620 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74 74  interface to att
2d630 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ach a particular
2d640 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f  .    ** table so
2d650 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
2d660 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20 20  r filtered..    
2d670 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2d680 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61  p(azCmd[0],"atta
2d690 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ch")==0 ){.     
2d6a0 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67   if( nCmd!=2 ) g
2d6b0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2d6c0 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2d6d0 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d  if( pSession->p=
2d6e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
2d6f0 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a  ssion_not_open:.
2d700 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2d710 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
2d720 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61  R: No sessions a
2d730 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20  re open\n");.   
2d740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
2d760 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53 65  ssion_attach(pSe
2d770 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b  ssion->p, azCmd[
2d780 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
2d790 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2d7a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d7b0 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c 69  rr, "ERROR: sqli
2d7c0 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
2d7d0 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  h() returns %d\n
2d7e0 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
2d7f0 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
2d800 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d810 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
2d820 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  ession changeset
2d830 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65   FILE.    ** .se
2d840 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20 46  ssion patchset F
2d850 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74 65  ILE.    ** Write
2d860 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20   a changeset or 
2d870 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61 20  patchset into a 
2d880 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 20  file.  The file 
2d890 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  is overwritten..
2d8a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2d8b0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
2d8c0 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c  changeset")==0 |
2d8d0 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  | strcmp(azCmd[0
2d8e0 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d 30  ],"patchset")==0
2d8f0 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a   ){.      FILE *
2d900 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  out = 0;.      i
2d910 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74  f( nCmd!=2 ) got
2d920 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
2d930 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
2d940 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30  ( pSession->p==0
2d950 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
2d960 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20  not_open;.      
2d970 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d  out = fopen(azCm
2d980 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20  d[1], "wb");.   
2d990 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b     if( out==0 ){
2d9a0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2d9b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
2d9c0 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ROR: cannot open
2d9d0 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
2d9e0 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d  ing\n", azCmd[1]
2d9f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2da00 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43 68          int szCh
2da10 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64  ng;.        void
2da20 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20 20   *pChng;.       
2da30 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d   if( azCmd[0][0]
2da40 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20 20  =='c' ){.       
2da50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
2da60 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
2da70 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73  (pSession->p, &s
2da80 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a  zChng, &pChng);.
2da90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2daa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dab0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
2dac0 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e  chset(pSession->
2dad0 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68  p, &szChng, &pCh
2dae0 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
2daf0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2db00 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
2db10 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72 20  f("Error: error 
2db20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b  code %d\n", rc);
2db30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2db40 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2db50 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a 20       if( pChng. 
2db60 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72 69           && fwri
2db70 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67  te(pChng, szChng
2db80 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a  , 1, out)!=1 ){.
2db90 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2dba0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
2dbb0 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20 77  ROR: Failed to w
2dbc0 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d 62  rite entire %d-b
2dbd0 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20  yte output\n",. 
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbf0 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   szChng);.      
2dc00 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2dc10 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29 3b  te3_free(pChng);
2dc20 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
2dc30 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
2dc40 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
2dc50 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20  .session close. 
2dc60 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20     ** Close the 
2dc70 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73 69  identified sessi
2dc80 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  on.    */.    if
2dc90 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
2dca0 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29  ], "close")==0 )
2dcb0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  {.      if( nCmd
2dcc0 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=1 ) goto sessi
2dcd0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
2dce0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2dcf0 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
2dd00 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
2dd10 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
2dd20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69     p->aSession[i
2dd30 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69  Ses] = p->aSessi
2dd40 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e  on[--p->nSession
2dd50 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
2dd60 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
2dd70 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f  ssion enable ?BO
2dd80 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
2dd90 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 65  ery or set the e
2dda0 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a  nable flag.    *
2ddb0 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
2ddc0 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62  (azCmd[0], "enab
2ddd0 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
2dde0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
2ddf0 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f  f( nCmd>2 ) goto
2de00 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2de10 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20  error;.      ii 
2de20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a  = nCmd==1 ? -1 :
2de30 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2de40 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Cmd[1]);.      i
2de50 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
2de60 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
2de70 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e  qlite3session_en
2de80 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  able(pSession->p
2de90 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75  , ii);.        u
2dea0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2deb0 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 65  t, "session %s e
2dec0 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c  nable flag = %d\
2ded0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2dee0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
2def0 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
2df00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
2df10 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
2df20 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e   filter GLOB ...
2df30 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20 6c  ..    ** Set a l
2df40 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74 74  ist of GLOB patt
2df50 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e 61  erns of table na
2df60 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75 64  mes to be exclud
2df70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2df80 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
2df90 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d 30  0], "filter")==0
2dfa0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
2dfb0 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  , nByte;.      i
2dfc0 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f  f( nCmd<2 ) goto
2dfd0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2dfe0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
2dff0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
2e000 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
2e010 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  ; ii<pSession->n
2e020 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20  Filter; ii++){. 
2e030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e040 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
2e050 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20  azFilter[ii]);. 
2e060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e070 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
2e080 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
2e090 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  );.        nByte
2e0a0 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73 69   = sizeof(pSessi
2e0b0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29  on->azFilter[0])
2e0c0 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20  *(nCmd-1);.     
2e0d0 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
2e0e0 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  ilter = sqlite3_
2e0f0 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
2e100 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
2e110 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d  ssion->azFilter=
2e120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e130 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2e140 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
2e150 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  r memory\n");.  
2e160 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
2e170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e180 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c     for(ii=1; ii<
2e190 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCmd; ii++){.   
2e1a0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
2e1b0 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20  >azFilter[ii-1] 
2e1c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e1d0 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69  f("%s", azCmd[ii
2e1e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2e1f0 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
2e200 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a  nFilter = ii-1;.
2e210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e220 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
2e230 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f  on indirect ?BOO
2e240 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65  LEAN?.    ** Que
2e250 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69 6e  ry or set the in
2e260 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20 20  direct flag.    
2e270 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2e280 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64  p(azCmd[0], "ind
2e290 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20  irect")==0 ){.  
2e2a0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2e2b0 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67    if( nCmd>2 ) g
2e2c0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2e2d0 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2e2e0 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d  ii = nCmd==1 ? -
2e2f0 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  1 : booleanValue
2e300 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20  (azCmd[1]);.    
2e310 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
2e320 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
2e330 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
2e340 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73 69  _indirect(pSessi
2e350 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20  on->p, ii);.    
2e360 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e370 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
2e380 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c 61   %s indirect fla
2e390 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  g = %d\n",.     
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e3b0 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20  Session->zName, 
2e3c0 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ii);.      }.   
2e3d0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
2e3e0 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a  session isempty.
2e3f0 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65      ** Determine
2e400 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e 20   if the session 
2e410 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a  is empty.    */.
2e420 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
2e430 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74  zCmd[0], "isempt
2e440 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
2e450 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
2e460 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f  ( nCmd!=1 ) goto
2e470 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2e480 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
2e490 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
2e4a0 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
2e4b0 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d  ite3session_isem
2e4c0 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  pty(pSession->p)
2e4d0 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
2e4e0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
2e4f0 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70 74  ession %s isempt
2e500 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  y flag = %d\n",.
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
2e530 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
2e540 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
2e550 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73   /* .session lis
2e560 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c  t.    ** List al
2e570 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  l currently open
2e580 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f   sessions.    */
2e590 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2e5a0 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29  azCmd[0],"list")
2e5b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2e5c0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
2e5d0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
2e5e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e5f0 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e 22  ->out, "%d %s\n"
2e600 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e  , i, p->aSession
2e610 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
2e620 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
2e630 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f     /* .session o
2e640 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20 20  pen DB NAME.    
2e650 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65  ** Open a new se
2e660 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ssion called NAM
2e670 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68 65  E on the attache
2e680 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a 20  d database DB.. 
2e690 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d     ** DB is norm
2e6a0 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20  ally "main"..   
2e6b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
2e6c0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65  mp(azCmd[0],"ope
2e6d0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
2e6e0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2e6f0 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20 29     if( nCmd!=3 )
2e700 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
2e710 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
2e720 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b    zName = azCmd[
2e730 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  2];.      if( zN
2e740 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f  ame[0]==0 ) goto
2e750 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2e760 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  error;.      for
2e770 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
2e780 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
2e790 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
2e7a0 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61  >aSession[i].zNa
2e7b0 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  me,zName)==0 ){.
2e7c0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2e7d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
2e7e0 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c  ession \"%s\" al
2e7f0 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22 2c  ready exists\n",
2e800 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2e810 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e820 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2e830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e840 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
2e850 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70 2d  on>=ArraySize(p-
2e860 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20  >aSession) ){.  
2e870 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e880 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d 75  (stderr, "Maximu
2e890 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e 73  m of %d sessions
2e8a0 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28 70  \n", ArraySize(p
2e8b0 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20  ->aSession));.  
2e8c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2e8d0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2e8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73      }.      pSes
2e8f0 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2e900 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d  ion[p->nSession]
2e910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2e920 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61  ite3session_crea
2e930 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b  te(p->db, azCmd[
2e940 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70  1], &pSession->p
2e950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2e960 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2e970 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
2e980 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73 69  annot open sessi
2e990 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  on: error code=%
2e9a0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2e9b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
2e9c0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e9d0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2e9e0 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f   }.      pSessio
2e9f0 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a  n->nFilter = 0;.
2ea00 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65 73        sqlite3ses
2ea10 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65  sion_table_filte
2ea20 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73  r(pSession->p, s
2ea30 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70  ession_filter, p
2ea40 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  Session);.      
2ea50 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20  p->nSession++;. 
2ea60 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
2ea70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Name = sqlite3_m
2ea80 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61  printf("%s", zNa
2ea90 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20  me);.    }else. 
2eaa0 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d     /* If no comm
2eab0 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  and name matches
2eac0 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78 20  , show a syntax 
2ead0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73  error */.    ses
2eae0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
2eaf0 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 68  r:.    session_h
2eb00 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65 0a  elp(p);.  }else.
2eb10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
2eb20 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
2eb30 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f   Undocumented co
2eb40 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65 72  mmands for inter
2eb50 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53 75  nal testing.  Su
2eb60 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 0a  bject to change.
2eb70 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74    ** without not
2eb80 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d  ice. */.  if( c=
2eb90 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26 26  ='s' && n>=10 &&
2eba0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2ebb0 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c 20  ], "selftest-", 
2ebc0 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  9)==0 ){.    if(
2ebd0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2ebe0 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20  ]+9, "boolean", 
2ebf0 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
2ec00 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20 20   int i, v;.     
2ec10 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
2ec20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ec30 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  v = booleanValue
2ec40 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
2ec50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ec60 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64 20  p->out, "%s: %d 
2ec70 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  0x%x\n", azArg[i
2ec80 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20 20  ], v, v);.      
2ec90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2eca0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ecb0 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 6e  +9, "integer", n
2ecc0 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -9)==0 ){.      
2ecd0 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f 69  int i; sqlite3_i
2ece0 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66 6f  nt64 v;.      fo
2ecf0 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2ed00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2ed10 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
2ed20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65 72       v = integer
2ed30 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b  Value(azArg[i]);
2ed40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ed50 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2ed60 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a  (zBuf),zBuf,"%s:
2ed70 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c   %lld 0x%llx\n",
2ed80 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a   azArg[i],v,v);.
2ed90 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2eda0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
2edb0 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 7d  , zBuf);.      }
2edc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
2edd0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
2ede0 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73  's' && n>=4 && s
2edf0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2ee00 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30  "selftest",n)==0
2ee10 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73 49   ){.    int bIsI
2ee20 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
2ee30 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69 74   /* True to init
2ee40 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46 54  ialize the SELFT
2ee50 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  EST table */.   
2ee60 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20   int bVerbose = 
2ee70 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  0;        /* Ver
2ee80 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20  bose output */. 
2ee90 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73 74     int bSelftest
2eea0 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20 54  Exists;     /* T
2eeb0 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54 20  rue if SELFTEST 
2eec0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
2eed0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20  /.    int i, k; 
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eef0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2ef00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73 74  */.    int nTest
2ef10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ef20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 73  /* Number of tes
2ef30 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69  ts runs */.    i
2ef40 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
2ef50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ef60 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
2ef70 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
2ef80 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20 20  t str;          
2ef90 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20 61   /* Answer for a
2efa0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73 71   query */.    sq
2efb0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2efc0 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79 20  t = 0; /* Query 
2efd0 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c 46  against the SELF
2efe0 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  TEST table */.. 
2eff0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b     open_db(p,0);
2f000 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2f010 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2f020 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2f030 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
2f040 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
2f050 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
2f060 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
2f070 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d  rcmp(z,"-init")=
2f080 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 49  =0 ){.        bI
2f090 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
2f0a0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
2f0b0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d   strcmp(z,"-v")=
2f0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 56  =0 ){.        bV
2f0d0 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20  erbose++;.      
2f0e0 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20  }else.      {.  
2f0f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f100 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
2f110 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
2f120 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f140 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41     azArg[i], azA
2f150 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[0]);.        
2f160 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f170 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e  r, "Should be on
2f180 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c  e of: --init -v\
2f190 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
2f1a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2f1b0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2f1c0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2f1d0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
2f1e0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
2f1f0 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 22  metadata(p->db,"
2f200 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74 22  main","selftest"
2f210 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  ,0,0,0,0,0,0).  
2f220 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c 49           != SQLI
2f230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62  TE_OK ){.      b
2f240 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d  SelftestExists =
2f250 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2f260 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78       bSelftestEx
2f270 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ists = 1;.    }.
2f280 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74 20      if( bIsInit 
2f290 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65 53  ){.      createS
2f2a0 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29 3b  elftestTable(p);
2f2b0 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74  .      bSelftest
2f2c0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2f2d0 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  }.    initText(&
2f2e0 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  str);.    append
2f2f0 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c 20  Text(&str, "x", 
2f300 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53  0);.    for(k=bS
2f310 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20 6b  elftestExists; k
2f320 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20  >=0; k--){.     
2f330 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20   if( k==1 ){.   
2f340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f350 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2f360 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2f370 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63  "SELECT tno,op,c
2f380 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66  md,ans FROM self
2f390 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74 6e  test ORDER BY tn
2f3a0 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o",.            
2f3b0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2f3c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f3d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f3e0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2f3f0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 56  db,.          "V
2f400 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27  ALUES(0,'memo','
2f410 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53 54  Missing SELFTEST
2f420 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c 74   table - default
2f430 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27   checks only',''
2f440 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ),".          " 
2f450 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27 50       (1,'run','P
2f460 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2f470 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20  check','ok')",. 
2f480 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
2f490 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
2f4a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f4b0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2f4c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2f4d0 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20  or querying the 
2f4e0 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c 6e  selftest table\n
2f4f0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2f500 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
2f510 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2f520 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  mt);.        got
2f530 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2f540 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2f550 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69     for(i=1; sqli
2f560 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2f570 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b  =SQLITE_ROW; i++
2f580 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
2f590 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
2f5a0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
2f5b0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2f5c0 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f   char *zOp = (co
2f5d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2f5e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2f5f0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
2f600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2f610 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
2f620 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2f630 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
2f640 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2f650 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73  ar *zAns = (cons
2f660 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2f670 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2f680 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  t, 3);..        
2f690 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
2f6a0 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29 7b  f( bVerbose>0 ){
2f6b0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
2f6c0 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  *zQuote = sqlite
2f6d0 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c 20  3_mprintf("%q", 
2f6e0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zSql);.         
2f6f0 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73 20   printf("%d: %s 
2f700 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c  %s\n", tno, zOp,
2f710 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
2f720 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f730 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
2f740 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  }.        if( st
2f750 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29  rcmp(zOp,"memo")
2f760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f770 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2f780 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71  out, "%s\n", zSq
2f790 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
2f7a0 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  e.        if( st
2f7b0 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d  rcmp(zOp,"run")=
2f7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f7d0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2f7e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  0;.          str
2f7f0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2f800 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a    str.z[0] = 0;.
2f810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f820 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2f830 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72 65  b, zSql, capture
2f840 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20  OutputCallback, 
2f850 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b  &str, &zErrMsg);
2f860 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73 74  .          nTest
2f870 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
2f880 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
2f890 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2f8a0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52  rintf(p->out, "R
2f8b0 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74  esult: %s\n", st
2f8c0 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r.z);.          
2f8d0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2f8e0 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  rc || zErrMsg ){
2f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  .            nEr
2f900 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
2f910 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2f920 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f930 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65 72  (p->out, "%d: er
2f940 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73 5c  ror-code-%d: %s\
2f950 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72  n", tno, rc, zEr
2f960 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
2f970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f980 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2f9a0 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29  rcmp(zAns,str.z)
2f9b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2f9c0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
2f9d0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2f9e0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
2f9f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2fa00 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b 25  %d: Expected: [%
2fa10 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73  s]\n", tno, zAns
2fa20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
2fa30 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2fa40 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f 74  t, "%d:      Got
2fa50 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20  : [%s]\n", tno, 
2fa60 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  str.z);.        
2fa70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2fa80 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
2fa90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2faa0 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
2fab0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f        "Unknown o
2fac0 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20  peration \"%s\" 
2fad0 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e 65  on selftest line
2fae0 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f   %d\n", zOp, tno
2faf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2fb00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2fb10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2fb20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
2fb30 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  oop over rows of
2fb40 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53 45   content from SE
2fb50 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20  LFTEST */.      
2fb60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2fb70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20 2f  (pStmt);.    } /
2fb80 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * End loop over 
2fb90 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65 78  k */.    freeTex
2fba0 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74 66  t(&str);.    utf
2fbb0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2fbc0 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74 20   "%d errors out 
2fbd0 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c 20  of %d tests\n", 
2fbe0 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20 20  nErr, nTest);.  
2fbf0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2fc00 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
2fc10 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61  zArg[0], "separa
2fc20 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  tor", n)==0 ){. 
2fc30 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c 7c     if( nArg<2 ||
2fc40 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20   nArg>3 ){.     
2fc50 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2fc60 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70  rr, "Usage: .sep
2fc70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
2fc80 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2fc90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2fca0 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2fcb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fcc0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2fcd0 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2fce0 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  colSeparator,.  
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd00 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
2fd10 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63  t)ArraySize(p->c
2fd20 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20  olSeparator)-1, 
2fd30 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2fd40 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
2fd50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2fd60 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2fd70 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2fd80 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2fd90 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
2fdb0 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69  s", (int)ArraySi
2fdc0 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ze(p->rowSeparat
2fdd0 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29  or)-1, azArg[2])
2fde0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2fdf0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
2fe00 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70   n>=4 && strncmp
2fe10 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33 73  (azArg[0],"sha3s
2fe20 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  um",n)==0 ){.   
2fe30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
2fe40 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68 69  ke = 0;   /* Whi
2fe50 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63  ch table to chec
2fe60 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65 76  ksum. 0 means ev
2fe70 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
2fe80 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2fe90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2fea0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2feb0 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30 3b  int bSchema = 0;
2fec0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
2fed0 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d 61   hash the schema
2fee0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 70   */.    int bSep
2fef0 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20  arate = 0;      
2ff00 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74 61   /* Hash each ta
2ff10 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20 2a  ble separately *
2ff20 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20  /.    int iSize 
2ff30 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20 2f  = 224;         /
2ff40 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68 6d  * Hash algorithm
2ff50 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 69   to use */.    i
2ff60 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20 20  nt bDebug = 0;  
2ff70 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2ff80 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20 74  show the query t
2ff90 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 72  hat would have r
2ffa0 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  un */.    sqlite
2ffb0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
2ffc0 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79 69     /* For queryi
2ffd0 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73 20  ng tables names 
2ffe0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
2fff0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
30000 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75 6e  /* SQL to be run
30010 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
30020 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
30030 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f   /* Separator */
30040 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
30050 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Sql;          /*
30060 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66 6f   Complete SQL fo
30070 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 72  r the query to r
30080 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20  un the hash */. 
30090 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51 75     ShellText sQu
300a0 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ery;        /* S
300b0 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75 73  et of queries us
300c0 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20 63  ed to read all c
300d0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 70  ontent */.    op
300e0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
300f0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
30100 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
30110 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
30120 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
30130 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
30140 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
30150 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
30160 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
30170 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73   if( strcmp(z,"s
30180 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20  chema")==0 ){.  
30190 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61 20          bSchema 
301a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
301b0 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
301c0 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 32  trcmp(z,"sha3-22
301d0 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  4")==0 || strcmp
301e0 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d 3d  (z,"sha3-256")==
301f0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  0.         || st
30200 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38 34  rcmp(z,"sha3-384
30210 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
30220 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d 3d 30  z,"sha3-512")==0
30230 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
30240 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61 74        iSize = at
30250 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20 20  oi(&z[5]);.     
30260 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
30270 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64   if( strcmp(z,"d
30280 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
30290 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20         bDebug = 
302a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
302b0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
302c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
302d0 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77  (stderr, "Unknow
302e0 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20  n option \"%s\" 
302f0 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  on \"%s\"\n",.  
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30310 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
30320 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
30330 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
30340 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65  derr, "Should be
30350 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65 6d   one of: --schem
30360 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a".             
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30380 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d 73  " --sha3-224 --s
30390 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33 2d 33  ha3-255 --sha3-3
303a0 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e 22  84 --sha3-512\n"
303b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
303c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
303d0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
303e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
303f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30400 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
30410 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
30420 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 68  err, "Usage: .sh
30430 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20  a3sum ?OPTIONS? 
30440 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
30450 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
30460 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
30470 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30480 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
30490 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
304a0 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65 70   z;.        bSep
304b0 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  arate = 1;.     
304c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
304d0 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f 25  trlike("sqlite_%
304e0 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d 30 20  ", zLike, 0)==0 
304f0 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  ) bSchema = 1;. 
30500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30510 20 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b 0a   if( bSchema ){.
30520 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45        zSql = "SE
30530 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29  LECT lower(name)
30540 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
30550 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
30560 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
30570 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65  table' AND coale
30580 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
30590 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1".             
305a0 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  " UNION ALL SELE
305b0 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 65  CT 'sqlite_maste
305c0 72 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  r'".            
305d0 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f   " ORDER BY 1 co
305e0 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20  llate nocase";. 
305f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30600 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c  zSql = "SELECT l
30610 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20  ower(name) FROM 
30620 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
30630 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
30640 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
30650 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
30660 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20  otpage,0)>1".   
30670 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
30680 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
30690 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
306a0 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
306b0 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61  Y 1 collate noca
306c0 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se";.    }.    s
306d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
306e0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
306f0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
30700 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 51 75     initText(&sQu
30710 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54 65  ery);.    initTe
30720 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 61  xt(&sSql);.    a
30730 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
30740 20 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d 24   "WITH [sha3sum$
30750 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28 22  query](a,b) AS("
30760 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  ,0);.    zSep = 
30770 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20 77  "VALUES(";.    w
30780 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
30790 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
307a0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
307b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
307c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
307d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
307e0 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20  xt(pStmt,0);.   
307f0 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26 20     if( zLike && 
30800 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
30810 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29 21  zLike, zTab, 0)!
30820 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30830 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
30840 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 22  (zTab, "sqlite_"
30850 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,7)!=0 ){.      
30860 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
30870 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20 46  uery,"SELECT * F
30880 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
30890 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
308a0 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29 3b  Query,zTab,'"');
308b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
308c0 65 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e 4f  ext(&sQuery," NO
308d0 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29 3b  T INDEXED;", 0);
308e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
308f0 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
30900 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d  qlite_master")==
30910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
30920 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
30930 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  "SELECT type,nam
30940 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46  e,tbl_name,sql F
30950 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
30960 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
30980 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c  ORDER BY name;",
30990 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
309a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
309b0 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
309c0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
309d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
309e0 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e 61  Query,"SELECT na
309f0 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c 69  me,seq FROM sqli
30a00 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20 20  te_sequence".   
30a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
30a30 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20  BY name;", 0);. 
30a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
30a50 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
30a60 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29  ite_stat1")==0 )
30a70 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
30a80 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45  Text(&sQuery,"SE
30a90 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61  LECT tbl,idx,sta
30aa0 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  t FROM sqlite_st
30ab0 61 74 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  at1".           
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ad0 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 69  " ORDER BY tbl,i
30ae0 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  dx;", 0);.      
30af0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
30b00 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
30b10 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20 20  tat3")==0.      
30b20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
30b30 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
30b40 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tat4")==0 ){.   
30b50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
30b60 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43 54  &sQuery, "SELECT
30b70 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20   * FROM ", 0);. 
30b80 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
30b90 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62 2c  t(&sQuery, zTab,
30ba0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
30bb0 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
30bc0 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c   " ORDER BY tbl,
30bd0 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c   idx, rowid;\n",
30be0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
30bf0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
30c00 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a 20  Sql, zSep, 0);. 
30c10 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
30c20 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a 2c  &sSql, sQuery.z,
30c30 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73 51   '\'');.      sQ
30c40 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  uery.n = 0;.    
30c50 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
30c60 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ql, ",", 0);.   
30c70 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
30c80 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27 29  Sql, zTab, '\'')
30c90 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
30ca0 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ),(";.    }.    
30cb0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
30cc0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
30cd0 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20 20   bSeparate ){.  
30ce0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
30cf0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
30d00 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20        "%s))".   
30d10 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20         " SELECT 
30d20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71  lower(hex(sha3_q
30d30 75 65 72 79 28 61 2c 25 64 29 29 29 20 41 53 20  uery(a,%d))) AS 
30d40 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65 6c  hash, b AS label
30d50 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
30d60 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75  FROM [sha3sum$qu
30d70 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  ery]",.         
30d80 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b   sSql.z, iSize);
30d90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30da0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
30db0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
30dc0 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20 20      "%s))".     
30dd0 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f       " SELECT lo
30de0 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75 65  wer(hex(sha3_que
30df0 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ry(group_concat(
30e00 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20 68  a,''),%d))) AS h
30e10 61 73 68 22 0a 20 20 20 20 20 20 20 20 20 20 22  ash".          "
30e20 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d     FROM [sha3sum
30e30 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20  $query]",.      
30e40 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a      sSql.z, iSiz
30e50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  e);.    }.    fr
30e60 65 65 54 65 78 74 28 26 73 51 75 65 72 79 29 3b  eeText(&sQuery);
30e70 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
30e80 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 44  Sql);.    if( bD
30e90 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75 74  ebug ){.      ut
30ea0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
30eb0 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
30ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30ed0 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e    shell_exec(p->
30ee0 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f  db, zSql, shell_
30ef0 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b  callback, p, 0);
30f00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30f10 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
30f20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
30f30 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74 72 6e  ='s'.   && (strn
30f40 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
30f50 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20  hell", n)==0 || 
30f60 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30f70 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d 30 29  ,"system",n)==0)
30f80 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
30f90 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 2c  zCmd;.    int i,
30fa0 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   x;.    if( nArg
30fb0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
30fc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30fd0 55 73 61 67 65 3a 20 2e 73 79 73 74 65 6d 20 43  Usage: .system C
30fe0 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20 20 20  OMMAND\n");.    
30ff0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31000 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31010 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
31020 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33    zCmd = sqlite3
31030 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28  _mprintf(strchr(
31040 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29 3d 3d 30  azArg[1],' ')==0
31050 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22 22 2c 20  ?"%s":"\"%s\"", 
31060 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
31070 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20  or(i=2; i<nArg; 
31080 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64  i++){.      zCmd
31090 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
310a0 74 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b  tf(strchr(azArg[
310b0 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 7a 20 25  i],' ')==0?"%z %
310c0 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22 22 2c 0a  s":"%z \"%s\"",.
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6d               zCm
310f0 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  d, azArg[i]);.  
31100 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 79 73 74    }.    x = syst
31110 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20 73 71  em(zCmd);.    sq
31120 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
31130 3b 0a 20 20 20 20 69 66 28 20 78 20 29 20 72 61  ;.    if( x ) ra
31140 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31150 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61 6e 64   "System command
31160 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
31170 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  x);.  }else..  i
31180 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
31190 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
311a0 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  show", n)==0 ){.
311b0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
311c0 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20   char *azBool[] 
311d0 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e 22 2c  = { "off", "on",
311e0 20 22 66 75 6c 6c 22 2c 20 22 75 6e 6b 22 20 7d   "full", "unk" }
311f0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
31200 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
31210 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31220 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
31230 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20 20 20   .show\n");.    
31240 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31250 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31260 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
31270 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
31280 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
31290 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 0a 20 20  %s\n","echo",.  
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312c0 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48 61 73 46  azBool[ShellHasF
312d0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68  lag(p, SHFLG_Ech
312e0 6f 29 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  o)]);.    utf8_p
312f0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
31300 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65  12.12s: %s\n","e
31310 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 61  qp", azBool[p->a
31320 75 74 6f 45 51 50 26 33 5d 29 3b 0a 20 20 20 20  utoEQP&3]);.    
31330 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31340 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73  ut, "%12.12s: %s
31350 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 0a 20  \n","explain",. 
31360 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 3d          p->mode=
31370 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 3f 20  =MODE_Explain ? 
31380 22 6f 6e 22 20 3a 20 70 2d 3e 61 75 74 6f 45 78  "on" : p->autoEx
31390 70 6c 61 69 6e 20 3f 20 22 61 75 74 6f 22 20 3a  plain ? "auto" :
313a0 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 75 74 66   "off");.    utf
313b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
313c0 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c  "%12.12s: %s\n",
313d0 22 68 65 61 64 65 72 73 22 2c 20 61 7a 42 6f 6f  "headers", azBoo
313e0 6c 5b 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 21  l[p->showHeader!
313f0 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  =0]);.    utf8_p
31400 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
31410 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6d  12.12s: %s\n","m
31420 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b  ode", modeDescr[
31430 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 75  p->mode]);.    u
31440 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
31450 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20  t, "%12.12s: ", 
31460 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20  "nullvalue");.  
31470 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
31480 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e  ing(p->out, p->n
31490 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
314a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
314b0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
314c0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
314d0 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  t,"%12.12s: %s\n
314e0 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20 20 20 20  ","output",.    
314f0 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 33 30          strlen30
31500 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70  (p->outfile) ? p
31510 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73 74 64  ->outfile : "std
31520 6f 75 74 22 29 3b 0a 20 20 20 20 75 74 66 38 5f  out");.    utf8_
31530 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
31540 31 32 2e 31 32 73 3a 20 22 2c 20 22 63 6f 6c 73  12.12s: ", "cols
31550 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20  eparator");.    
31560 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
31570 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 63 6f 6c  g(p->out, p->col
31580 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
31590 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
315a0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
315b0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
315c0 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20  ut,"%12.12s: ", 
315d0 22 72 6f 77 73 65 70 61 72 61 74 6f 72 22 29 3b  "rowseparator");
315e0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
315f0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
31600 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
31610 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31620 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
31630 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
31640 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
31650 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22  s: %s\n","stats"
31660 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 74 61 74  , azBool[p->stat
31670 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74  sOn!=0]);.    ut
31680 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
31690 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  , "%12.12s: ", "
316a0 77 69 64 74 68 22 29 3b 0a 20 20 20 20 66 6f 72  width");.    for
316b0 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72   (i=0;i<(int)Arr
316c0 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
316d0 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64  th) && p->colWid
316e0 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20  th[i] != 0;i++) 
316f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
31700 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 22  tf(p->out, "%d "
31710 2c 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d  , p->colWidth[i]
31720 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
31730 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
31740 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f  "\n");.    utf8_
31750 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31760 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 20  %12.12s: %s\n", 
31770 22 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20 20  "filename",.    
31780 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
31790 44 62 46 69 6c 65 6e 61 6d 65 20 3f 20 70 2d 3e  DbFilename ? p->
317a0 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3a 20 22 22  zDbFilename : ""
317b0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
317c0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
317d0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
317e0 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  tats", n)==0 ){.
317f0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
31800 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74 61 74  ){.      p->stat
31810 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  sOn = booleanVal
31820 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
31830 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
31840 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 64 69 73  ==1 ){.      dis
31850 70 6c 61 79 5f 73 74 61 74 73 28 70 2d 3e 64 62  play_stats(p->db
31860 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , p, 0);.    }el
31870 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
31880 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
31890 61 67 65 3a 20 2e 73 74 61 74 73 20 3f 6f 6e 7c  age: .stats ?on|
318a0 6f 66 66 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  off?\n");.      
318b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
318c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d  }else..  if( (c=
318d0 3d 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73  ='t' && n>1 && s
318e0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
318f0 20 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30   "tables", n)==0
31900 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 69 27 20  ).   || (c=='i' 
31910 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72  && (strncmp(azAr
31920 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22 2c  g[0], "indices",
31930 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   n)==0.         
31940 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6e 63          || strnc
31950 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e  mp(azArg[0], "in
31960 64 65 78 65 73 22 2c 20 6e 29 3d 3d 30 29 20 29  dexes", n)==0) )
31970 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
31980 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
31990 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75     char **azResu
319a0 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77  lt;.    int nRow
319b0 2c 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e  , nAlloc;.    in
319c0 74 20 69 69 3b 0a 20 20 20 20 53 68 65 6c 6c 54  t ii;.    ShellT
319d0 65 78 74 20 73 3b 0a 20 20 20 20 69 6e 69 74 54  ext s;.    initT
319e0 65 78 74 28 26 73 29 3b 0a 20 20 20 20 6f 70 65  ext(&s);.    ope
319f0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
31a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
31a10 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
31a20 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
31a30 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d  list", -1, &pStm
31a40 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
31a50 63 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  c ) return shell
31a60 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d  DatabaseError(p-
31a70 3e 64 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  >db);..    if( n
31a80 41 72 67 3e 32 20 26 26 20 63 3d 3d 27 69 27 20  Arg>2 && c=='i' 
31a90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
31aa0 73 20 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20  s an historical 
31ab0 61 63 63 69 64 65 6e 74 20 74 68 61 74 20 74 68  accident that th
31ac0 65 20 2e 69 6e 64 65 78 65 73 20 63 6f 6d 6d 61  e .indexes comma
31ad0 6e 64 20 73 68 6f 77 73 20 61 6e 20 65 72 72 6f  nd shows an erro
31ae0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
31af0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
31b00 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
31b10 61 72 67 75 6d 65 6e 74 73 20 77 68 65 72 65 61  arguments wherea
31b20 73 20 74 68 65 20 2e 74 61 62 6c 65 73 0a 20 20  s the .tables.  
31b30 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64      ** command d
31b40 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20  oes not. */.    
31b50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31b60 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6e  err, "Usage: .in
31b70 64 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41 54 54  dexes ?LIKE-PATT
31b80 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ERN?\n");.      
31b90 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
31ba0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
31bb0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
31bc0 66 6f 72 28 69 69 3d 30 3b 20 73 71 6c 69 74 65  for(ii=0; sqlite
31bd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
31be0 51 4c 49 54 45 5f 52 4f 57 3b 20 69 69 2b 2b 29  QLITE_ROW; ii++)
31bf0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
31c00 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63  ar *zDbName = (c
31c10 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
31c20 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
31c30 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
31c40 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
31c50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31c60 20 69 66 28 20 73 2e 7a 20 26 26 20 73 2e 7a 5b   if( s.z && s.z[
31c70 30 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  0] ) appendText(
31c80 26 73 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20  &s, " UNION ALL 
31c90 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
31ca0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
31cb0 28 7a 44 62 4e 61 6d 65 2c 20 22 6d 61 69 6e 22  (zDbName, "main"
31cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
31cd0 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
31ce0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
31cf0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   ", 0);.      }e
31d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70  lse{.        app
31d10 65 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c  endText(&s, "SEL
31d20 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ECT ", 0);.     
31d30 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
31d40 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 5c 27 27 29  , zDbName, '\'')
31d50 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
31d60 54 65 78 74 28 26 73 2c 20 22 7c 7c 27 2e 27 7c  Text(&s, "||'.'|
31d70 7c 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29  |name FROM ", 0)
31d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31d90 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a  appendText(&s, z
31da0 44 62 4e 61 6d 65 2c 20 27 22 27 29 3b 0a 20 20  DbName, '"');.  
31db0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31dc0 73 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  s, ".sqlite_mast
31dd0 65 72 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  er ", 0);.      
31de0 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
31df0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
31e00 28 26 73 2c 22 20 57 48 45 52 45 20 74 79 70 65  (&s," WHERE type
31e10 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
31e20 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
31e30 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
31e40 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
31e50 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20  E 'sqlite_%'".  
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e70 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65      "   AND name
31e80 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20   LIKE ?1", 0);. 
31e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31ea0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31eb0 73 2c 22 20 57 48 45 52 45 20 74 79 70 65 3d 27  s," WHERE type='
31ec0 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20  index'".        
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
31ee0 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c    AND tbl_name L
31ef0 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20  IKE ?1", 0);.   
31f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
31f10 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
31f20 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
31f30 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
31f40 22 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 30  " ORDER BY 1", 0
31f50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
31f60 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
31f70 2d 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26  ->db, s.z, -1, &
31f80 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
31f90 72 65 65 54 65 78 74 28 26 73 29 3b 0a 20 20 20  reeText(&s);.   
31fa0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31fb0 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
31fc0 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20  ror(p->db);..   
31fd0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20   /* Run the SQL 
31fe0 73 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72  statement prepar
31ff0 65 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 20  ed by the above 
32000 62 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74 68 65  block. Store the
32010 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20   results.    ** 
32020 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  as an array of n
32030 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
32040 72 69 6e 67 73 20 69 6e 20 61 7a 52 65 73 75 6c  rings in azResul
32050 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e 52 6f  t[].  */.    nRo
32060 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a  w = nAlloc = 0;.
32070 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30      azResult = 0
32080 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  ;.    if( nArg>1
32090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
320a0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
320b0 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  t, 1, azArg[1], 
320c0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
320d0 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
320e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
320f0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
32100 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c   1, "%", -1, SQL
32110 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
32120 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71   }.    while( sq
32130 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
32140 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
32150 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e  .      if( nRow>
32160 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
32170 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b     char **azNew;
32180 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20  .        int n2 
32190 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b  = nAlloc*2 + 10;
321a0 0a 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d  .        azNew =
321b0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
321c0 36 34 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a  64(azResult, siz
321d0 65 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29  eof(azResult[0])
321e0 2a 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  *n2);.        if
321f0 28 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  ( azNew==0 ){.  
32200 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
32210 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a  llNomemError();.
32220 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
32230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32240 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a     nAlloc = n2;.
32250 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74          azResult
32260 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   = azNew;.      
32270 7d 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74  }.      azResult
32280 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33  [nRow] = sqlite3
32290 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
322a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
322b0 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
322c0 20 20 20 20 20 69 66 28 20 30 3d 3d 61 7a 52 65       if( 0==azRe
322d0 73 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20  sult[nRow] ){.  
322e0 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
322f0 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20  NomemError();.  
32300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32310 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b     }.      nRow+
32320 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
32330 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
32340 65 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  e(pStmt)!=SQLITE
32350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
32360 3d 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  = shellDatabaseE
32370 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rror(p->db);.   
32380 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 74   }..    /* Prett
32390 79 2d 70 72 69 6e 74 20 74 68 65 20 63 6f 6e 74  y-print the cont
323a0 65 6e 74 73 20 6f 66 20 61 72 72 61 79 20 61 7a  ents of array az
323b0 52 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68 65 20  Result[] to the 
323c0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 66  output */.    if
323d0 28 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f 77 3e  ( rc==0 && nRow>
323e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  0 ){.      int l
323f0 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a  en, maxlen = 0;.
32400 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
32410 20 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74        int nPrint
32420 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a  Col, nPrintRow;.
32430 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
32440 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRow; i++){.   
32450 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
32460 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29  n30(azResult[i])
32470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
32480 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65  n>maxlen ) maxle
32490 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  n = len;.      }
324a0 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c  .      nPrintCol
324b0 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29   = 80/(maxlen+2)
324c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69  ;.      if( nPri
324d0 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74  ntCol<1 ) nPrint
324e0 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  Col = 1;.      n
324f0 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77  PrintRow = (nRow
32500 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31   + nPrintCol - 1
32510 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20  )/nPrintCol;.   
32520 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
32530 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20  rintRow; i++){. 
32540 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20         for(j=i; 
32550 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e  j<nRow; j+=nPrin
32560 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20  tRow){.         
32570 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e   char *zSp = j<n
32580 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20  PrintRow ? "" : 
32590 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20  "  ";.          
325a0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
325b0 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53  ut, "%s%-*s", zS
325c0 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20 20 20  p, maxlen,.     
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325e0 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61   azResult[j] ? a
325f0 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a  zResult[j]:"");.
32600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32610 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
32620 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
32630 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
32640 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77  or(ii=0; ii<nRow
32650 3b 20 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f  ; ii++) sqlite3_
32660 66 72 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69  free(azResult[ii
32670 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32680 66 72 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a  free(azResult);.
32690 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 42 65    }else..  /* Be
326a0 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
326b0 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 66 69  output to the fi
326c0 6c 65 20 22 74 65 73 74 63 61 73 65 2d 6f 75 74  le "testcase-out
326d0 2e 74 78 74 22 20 2a 2f 0a 20 20 69 66 28 20 63  .txt" */.  if( c
326e0 3d 3d 27 74 27 20 26 26 20 73 74 72 63 6d 70 28  =='t' && strcmp(
326f0 61 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74 63 61  azArg[0],"testca
32700 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  se")==0 ){.    o
32710 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
32720 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74      p->out = out
32730 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 22 74  put_file_open("t
32740 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
32750 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  );.    if( p->ou
32760 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  t==0 ){.      ra
32770 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32780 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
32790 6f 70 65 6e 20 27 74 65 73 74 63 61 73 65 2d 6f  open 'testcase-o
327a0 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20  ut.txt'\n");.   
327b0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
327c0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
327d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
327e0 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65  eof(p->zTestcase
327f0 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c  ), p->zTestcase,
32800 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29   "%s", azArg[1])
32810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32820 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32830 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54  ntf(sizeof(p->zT
32840 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65  estcase), p->zTe
32850 73 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a 20 20  stcase, "?");.  
32860 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
32870 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
32880 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
32890 27 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73  't' && n>=8 && s
328a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
328b0 20 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d   "testctrl", n)=
328c0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
328d0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
328e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
328f0 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20  r *zCtrlName;   
32900 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73  /* Name of a tes
32910 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e  t-control option
32920 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63   */.       int c
32930 74 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20  trlCode;        
32940 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63      /* Integer c
32950 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74  ode for that opt
32960 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 63 6f  ion */.       co
32970 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
32980 3b 20 20 20 20 20 20 2f 2a 20 55 73 61 67 65 20  ;      /* Usage 
32990 6e 6f 74 65 73 20 2a 2f 0a 20 20 20 20 7d 20 61  notes */.    } a
329a0 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Ctrl[] = {.     
329b0 20 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20   { "always",    
329c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
329d0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
329e0 20 20 20 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e          "BOOLEAN
329f0 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
32a00 20 20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22        { "assert"
32a10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
32a20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
32a30 53 45 52 54 2c 20 20 20 20 20 20 20 20 22 42 4f  SERT,        "BO
32a40 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20  OLEAN"          
32a50 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 62 65    },.    /*{ "be
32a60 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b  nign_malloc_hook
32a70 73 22 2c 53 51 4c 49 54 45 5f 54 45 53 54 43 54  s",SQLITE_TESTCT
32a80 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
32a90 5f 48 4f 4f 4b 53 2c 20 22 22 20 20 20 20 20 20  _HOOKS, ""      
32aa0 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20 2f 2a 7b      },*/.    /*{
32ab0 20 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c 20   "bitvec_test", 
32ac0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
32ad0 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
32ae0 53 54 2c 20 20 20 22 22 20 20 20 20 20 20 20 20  ST,   ""        
32af0 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20          },*/.   
32b00 20 20 20 7b 20 22 62 79 74 65 6f 72 64 65 72 22     { "byteorder"
32b10 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
32b20 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
32b30 52 44 45 52 2c 20 20 20 20 20 22 22 20 20 20 20  RDER,     ""    
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
32b50 2c 0a 20 20 20 20 2f 2a 7b 20 22 66 61 75 6c 74  ,.    /*{ "fault
32b60 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20  _install",      
32b70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
32b80 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 22  FAULT_INSTALL, "
32b90 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
32ba0 20 7d 2c 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22   }, */.      { "
32bb0 69 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20  imposter",      
32bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
32bd0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 20  CTRL_IMPOSTER,  
32be0 20 22 53 43 48 45 4d 41 20 4f 4e 2f 4f 46 46 20   "SCHEMA ON/OFF 
32bf0 52 4f 4f 54 50 41 47 45 22 7d 2c 0a 23 69 66 64  ROOTPAGE"},.#ifd
32c00 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
32c10 4f 52 44 0a 20 20 20 20 20 20 7b 20 22 69 73 6b  ORD.      { "isk
32c20 65 79 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20  eyword",        
32c30 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
32c40 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 20 20 20  L_ISKEYWORD,    
32c50 20 22 49 44 45 4e 54 49 46 49 45 52 22 20 20 20   "IDENTIFIER"   
32c60 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
32c70 20 20 20 20 20 20 7b 20 22 6c 6f 63 61 6c 74 69        { "localti
32c80 6d 65 5f 66 61 75 6c 74 22 2c 20 20 20 20 53 51  me_fault",    SQ
32c90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
32ca0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 22 42  CALTIME_FAULT,"B
32cb0 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20  OOLEAN"         
32cc0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6e 65    },.      { "ne
32cd0 76 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20  ver_corrupt",   
32ce0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
32cf0 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
32d00 2c 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20  , "BOOLEAN"     
32d10 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
32d20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  { "optimizations
32d30 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54  ",      SQLITE_T
32d40 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
32d50 54 49 4f 4e 53 2c 20 22 44 49 53 41 42 4c 45 2d  TIONS, "DISABLE-
32d60 4d 41 53 4b 22 20 20 20 20 20 20 20 7d 2c 0a 20  MASK"       },. 
32d70 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f       { "pending_
32d80 62 79 74 65 22 2c 20 20 20 20 20 20 20 53 51 4c  byte",       SQL
32d90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
32da0 44 49 4e 47 5f 42 59 54 45 2c 20 20 22 4f 46 46  DING_BYTE,  "OFF
32db0 53 45 54 20 20 22 20 20 20 20 20 20 20 20 20 20  SET  "          
32dc0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e   },.      { "prn
32dd0 67 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20  g_reset",       
32de0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
32df0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 2c 20 20 20  L_PRNG_RESET,   
32e00 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
32e10 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
32e20 20 22 70 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c   "prng_restore",
32e30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
32e40 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
32e50 4f 52 45 2c 20 20 22 22 20 20 20 20 20 20 20 20  ORE,  ""        
32e60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32e70 20 20 20 20 7b 20 22 70 72 6e 67 5f 73 61 76 65      { "prng_save
32e80 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
32e90 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
32ea0 5f 53 41 56 45 2c 20 20 20 20 20 22 22 20 20 20  _SAVE,     ""   
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 73 65  },.      { "rese
32ed0 72 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  rve",           
32ee0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
32ef0 5f 52 45 53 45 52 56 45 2c 20 20 20 20 20 20 20  _RESERVE,       
32f00 22 42 59 54 45 53 2d 4f 46 2d 52 45 53 45 52 56  "BYTES-OF-RESERV
32f10 45 22 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20  E"   },.    };. 
32f20 20 20 20 69 6e 74 20 74 65 73 74 63 74 72 6c 20     int testctrl 
32f30 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69 43  = -1;.    int iC
32f40 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  trl = -1;.    in
32f50 74 20 72 63 32 20 3d 20 30 3b 20 20 20 20 2f 2a  t rc2 = 0;    /*
32f60 20 30 3a 20 75 73 61 67 65 2e 20 20 31 3a 20 25   0: usage.  1: %
32f70 64 20 20 32 3a 20 25 78 20 20 33 3a 20 6e 6f 2d  d  2: %x  3: no-
32f80 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e  output */.    in
32f90 74 20 69 73 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  t isOk = 0;.    
32fa0 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 63  int i, n2;.    c
32fb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 20  onst char *zCmd 
32fc0 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64  = 0;..    open_d
32fd0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6d  b(p, 0);.    zCm
32fe0 64 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  d = nArg>=2 ? az
32ff0 41 72 67 5b 31 5d 20 3a 20 22 68 65 6c 70 22 3b  Arg[1] : "help";
33000 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67  ..    /* The arg
33010 75 6d 65 6e 74 20 63 61 6e 20 6f 70 74 69 6f 6e  ument can option
33020 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20  ally begin with 
33030 22 2d 22 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a 20  "-" or "--" */. 
33040 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d     if( zCmd[0]==
33050 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29  '-' && zCmd[1] )
33060 7b 0a 20 20 20 20 20 20 7a 43 6d 64 2b 2b 3b 0a  {.      zCmd++;.
33070 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64 5b 30        if( zCmd[0
33080 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31  ]=='-' && zCmd[1
33090 5d 20 29 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20  ] ) zCmd++;.    
330a0 7d 0a 0a 20 20 20 20 2f 2a 20 2d 2d 68 65 6c 70  }..    /* --help
330b0 20 6c 69 73 74 73 20 61 6c 6c 20 74 65 73 74 2d   lists all test-
330c0 63 6f 6e 74 72 6f 6c 73 20 2a 2f 0a 20 20 20 20  controls */.    
330d0 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
330e0 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "help")==0 ){.  
330f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33100 70 2d 3e 6f 75 74 2c 20 22 41 76 61 69 6c 61 62  p->out, "Availab
33110 6c 65 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73  le test-controls
33120 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
33130 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
33140 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a  e(aCtrl); i++){.
33150 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
33160 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 20 2e  ntf(p->out, "  .
33170 74 65 73 74 63 74 72 6c 20 25 73 20 25 73 5c 6e  testctrl %s %s\n
33180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33190 20 20 20 20 20 20 20 61 43 74 72 6c 5b 69 5d 2e         aCtrl[i].
331a0 7a 43 74 72 6c 4e 61 6d 65 2c 20 61 43 74 72 6c  zCtrlName, aCtrl
331b0 5b 69 5d 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20  [i].zUsage);.   
331c0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
331d0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
331e0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
331f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63  .    }..    /* c
33200 6f 6e 76 65 72 74 20 74 65 73 74 63 74 72 6c 20  onvert testctrl 
33210 74 65 78 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76  text option to v
33220 61 6c 75 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20  alue. allow any 
33230 75 6e 69 71 75 65 20 70 72 65 66 69 78 0a 20 20  unique prefix.  
33240 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69    ** of the opti
33250 6f 6e 20 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75  on name, or a nu
33260 6d 65 72 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a  merical value. *
33270 2f 0a 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65  /.    n2 = strle
33280 6e 33 30 28 7a 43 6d 64 29 3b 0a 20 20 20 20 66  n30(zCmd);.    f
33290 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
332a0 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29  ize(aCtrl); i++)
332b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
332c0 63 6d 70 28 7a 43 6d 64 2c 20 61 43 74 72 6c 5b  cmp(zCmd, aCtrl[
332d0 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e 32  i].zCtrlName, n2
332e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
332f0 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29  if( testctrl<0 )
33300 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
33310 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b 69 5d 2e  ctrl = aCtrl[i].
33320 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20 20 20 20  ctrlCode;.      
33330 20 20 20 20 69 43 74 72 6c 20 3d 20 69 3b 0a 20      iCtrl = i;. 
33340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33350 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
33360 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
33370 6f 72 3a 20 61 6d 62 69 67 75 6f 75 73 20 74 65  or: ambiguous te
33380 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25 73  st-control: \"%s
33390 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  \"\n".          
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333b0 20 20 20 20 22 55 73 65 20 5c 22 2e 74 65 73 74      "Use \".test
333c0 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22 20 66 6f  ctrl --help\" fo
333d0 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29  r help\n", zCmd)
333e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
333f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
33400 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
33410 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
33420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33430 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30    if( testctrl<0
33440 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
33450 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
33460 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65 73  ror: unknown tes
33470 74 2d 63 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e 22  t-control: %s\n"
33480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33490 20 20 20 20 20 20 20 20 20 20 22 55 73 65 20 5c            "Use \
334a0 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c  ".testctrl --hel
334b0 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c  p\" for help\n",
334c0 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 65 6c 73   zCmd);.    }els
334d0 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  e{.      switch(
334e0 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20 20 20  testctrl){..    
334f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
33500 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c  est_control(int,
33510 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20   db, int) */.   
33520 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
33530 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
33540 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20  ZATIONS:.       
33550 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
33560 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 0a 20  TCTRL_RESERVE:. 
33570 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
33580 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
33590 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 28 69      int opt = (i
335a0 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b  nt)strtol(azArg[
335b0 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  2], 0, 0);.     
335c0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
335d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
335e0 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64  l(testctrl, p->d
335f0 62 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  b, opt);.       
33600 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20       isOk = 3;. 
33610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33620 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
33630 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
33640 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
33650 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  ) */.        cas
33660 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
33670 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 0a 20 20 20  L_PRNG_SAVE:.   
33680 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
33690 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
336a0 45 53 54 4f 52 45 3a 0a 20 20 20 20 20 20 20 20  ESTORE:.        
336b0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
336c0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
336d0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
336e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
336f0 54 45 4f 52 44 45 52 3a 0a 20 20 20 20 20 20 20  TEORDER:.       
33700 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
33710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
33720 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  2 = sqlite3_test
33730 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
33740 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
33750 69 73 4f 6b 20 3d 20 74 65 73 74 63 74 72 6c 3d  isOk = testctrl=
33760 3d 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  =SQLITE_TESTCTRL
33770 5f 42 59 54 45 4f 52 44 45 52 20 3f 20 31 20 3a  _BYTEORDER ? 1 :
33780 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
33790 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
337a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
337b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
337c0 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20 2a 2f 0a  l(int, uint) */.
337d0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
337e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
337f0 44 49 4e 47 5f 42 59 54 45 3a 0a 20 20 20 20 20  DING_BYTE:.     
33800 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
33810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33820 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 70 74  unsigned int opt
33830 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74   = (unsigned int
33840 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
33850 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[2]);.       
33860 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
33870 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
33880 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a  testctrl, opt);.
33890 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
338a0 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
338b0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
338c0 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
338d0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
338e0 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f  rol(int, int) */
338f0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
33900 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
33910 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 63 61  SERT:.        ca
33920 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
33930 52 4c 5f 41 4c 57 41 59 53 3a 0a 20 20 20 20 20  RL_ALWAYS:.     
33940 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
33950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33960 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61  int opt = boolea
33970 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  nValue(azArg[2])
33980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
33990 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  2 = sqlite3_test
339a0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
339b0 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  l, opt);.       
339c0 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b 0a 20       isOk = 1;. 
339d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
339e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
339f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
33a00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
33a10 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
33a20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
33a30 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
33a40 5f 46 41 55 4c 54 3a 0a 20 20 20 20 20 20 20 20  _FAULT:.        
33a50 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
33a60 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
33a70 50 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  PT:.          if
33a80 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
33a90 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74           int opt
33aa0 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
33ab0 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
33ac0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
33ad0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
33ae0 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
33af0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
33b00 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  Ok = 3;.        
33b10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
33b20 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  eak;..        /*
33b30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
33b40 6e 74 72 6f 6c 28 69 6e 74 2c 20 63 68 61 72 20  ntrol(int, char 
33b50 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  *) */.#ifdef SQL
33b60 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
33b70 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
33b80 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
33b90 57 4f 52 44 3a 0a 20 20 20 20 20 20 20 20 20 20  WORD:.          
33ba0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
33bb0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
33bc0 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41   char *opt = azA
33bd0 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg[2];.         
33be0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
33bf0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
33c00 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
33c10 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d            isOk =
33c20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
33c30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
33c40 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
33c50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
33c60 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 0a  TCTRL_IMPOSTER:.
33c70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
33c80 72 67 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  rg==5 ){.       
33c90 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
33ca0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
33cb0 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c  testctrl, p->db,
33cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33cd0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
33ce0 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [2],.           
33cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
33d00 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
33d10 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  g[3]),.         
33d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d30 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a   integerValue(az
33d40 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[4]));.      
33d50 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a        isOk = 3;.
33d60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
33d90 66 28 20 69 73 4f 6b 3d 3d 30 20 26 26 20 69 43  f( isOk==0 && iC
33da0 74 72 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  trl>=0 ){.      
33db0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33dc0 75 74 2c 20 22 55 73 61 67 65 3a 20 2e 74 65 73  ut, "Usage: .tes
33dd0 74 63 74 72 6c 20 25 73 20 25 73 5c 6e 22 2c 20  tctrl %s %s\n", 
33de0 7a 43 6d 64 2c 20 61 43 74 72 6c 5b 69 43 74 72  zCmd, aCtrl[iCtr
33df0 6c 5d 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  l].zUsage);.    
33e00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
33e10 6c 73 65 20 69 66 28 20 69 73 4f 6b 3d 3d 31 20  lse if( isOk==1 
33e20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
33e30 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 5c  ntf(p->out, "%d\
33e40 6e 22 2c 20 72 63 32 29 3b 0a 20 20 20 20 7d 65  n", rc2);.    }e
33e50 6c 73 65 20 69 66 28 20 69 73 4f 6b 3d 3d 32 20  lse if( isOk==2 
33e60 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
33e70 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 30 78 25  ntf(p->out, "0x%
33e80 30 38 78 5c 6e 22 2c 20 72 63 32 29 3b 0a 20 20  08x\n", rc2);.  
33e90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
33ea0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
33eb0 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
33ec0 29 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ) */..  if( c=='
33ed0 74 27 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72  t' && n>4 && str
33ee0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33ef0 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20  timeout", n)==0 
33f00 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
33f10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
33f20 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  3_busy_timeout(p
33f30 2d 3e 64 62 2c 20 6e 41 72 67 3e 3d 32 20 3f 20  ->db, nArg>=2 ? 
33f40 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
33f50 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  e(azArg[1]) : 0)
33f60 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
33f70 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20   c=='t' && n>=5 
33f80 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33f90 5b 30 5d 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29  [0], "timer", n)
33fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
33fb0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
33fc0 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f  enableTimer = bo
33fd0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
33fe0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
33ff0 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 21  enableTimer && !
34000 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20  HAS_TIMER ){.   
34010 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34020 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
34030 74 69 6d 65 72 20 6e 6f 74 20 61 76 61 69 6c 61  timer not availa
34040 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 79 73 74  ble on this syst
34050 65 6d 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  em.\n");.       
34060 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30   enableTimer = 0
34070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
34080 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
34090 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
340a0 73 61 67 65 3a 20 2e 74 69 6d 65 72 20 6f 6e 7c  sage: .timer on|
340b0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
340c0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
340d0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
340e0 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
340f0 41 72 67 5b 30 5d 2c 20 22 74 72 61 63 65 22 2c  Arg[0], "trace",
34100 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
34110 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
34120 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
34130 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34140 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
34150 20 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66   .trace FILE|off
34160 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
34170 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
34180 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
34190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70  ;.    }.    outp
341a0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
341b0 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20  >traceOut);.    
341c0 70 2d 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f 75  p->traceOut = ou
341d0 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61  tput_file_open(a
341e0 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64  zArg[1]);.#if !d
341f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34200 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
34210 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34220 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
34230 29 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  ).    if( p->tra
34240 63 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ceOut==0 ){.    
34250 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f    sqlite3_trace_
34260 76 32 28 70 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  v2(p->db, 0, 0, 
34270 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
34280 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
34290 63 65 5f 76 32 28 70 2d 3e 64 62 2c 20 53 51 4c  ce_v2(p->db, SQL
342a0 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 2c 20  ITE_TRACE_STMT, 
342b0 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61  sql_trace_callba
342c0 63 6b 2c 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b  ck,p->traceOut);
342d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
342e0 7d 65 6c 73 65 0a 0a 23 69 66 20 53 51 4c 49 54  }else..#if SQLIT
342f0 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
34300 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27  ATION.  if( c=='
34310 75 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  u' && strncmp(az
34320 41 72 67 5b 30 5d 2c 20 22 75 73 65 72 22 2c 20  Arg[0], "user", 
34330 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
34340 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
34350 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34360 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65  rr, "Usage: .use
34370 72 20 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e  r SUBCOMMAND ...
34380 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
34390 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
343a0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
343b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
343c0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
343d0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
343e0 31 5d 2c 22 6c 6f 67 69 6e 22 29 3d 3d 30 20 29  1],"login")==0 )
343f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
34400 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=4 ){.        r
34410 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34420 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
34430 6c 6f 67 69 6e 20 55 53 45 52 20 50 41 53 53 57  login USER PASSW
34440 4f 52 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ORD\n");.       
34450 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
34460 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34470 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
34480 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34490 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
344a0 69 63 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41  icate(p->db, azA
344b0 72 67 5b 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c  rg[2], azArg[3],
344c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
344d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344e0 20 20 20 20 20 28 69 6e 74 29 73 74 72 6c 65 6e       (int)strlen
344f0 28 61 7a 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20  (azArg[3]));.   
34500 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34510 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34520 28 73 74 64 65 72 72 2c 20 22 41 75 74 68 65 6e  (stderr, "Authen
34530 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  tication failed 
34540 66 6f 72 20 75 73 65 72 20 25 73 5c 6e 22 2c 20  for user %s\n", 
34550 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
34560 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34570 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
34580 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
34590 2c 22 61 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"add")==0 ){.  
345a0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20      if( nArg!=5 
345b0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
345c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
345d0 73 61 67 65 3a 20 2e 75 73 65 72 20 61 64 64 20  sage: .user add 
345e0 55 53 45 52 20 50 41 53 53 57 4f 52 44 20 49 53  USER PASSWORD IS
345f0 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  ADMIN\n");.     
34600 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34610 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
34620 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
34630 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
34640 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 70  lite3_user_add(p
34650 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a  ->db, azArg[2],.
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
34680 67 5b 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65  g[3], (int)strle
34690 6e 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20  n(azArg[3]),.   
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346b0 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e           boolean
346c0 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29  Value(azArg[4]))
346d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
346e0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
346f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
34700 65 72 2d 41 64 64 20 66 61 69 6c 65 64 3a 20 25  er-Add failed: %
34710 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
34720 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34730 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
34740 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
34750 2c 22 65 64 69 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"edit")==0 ){. 
34760 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35       if( nArg!=5
34770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
34780 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34790 55 73 61 67 65 3a 20 2e 75 73 65 72 20 65 64 69  Usage: .user edi
347a0 74 20 55 53 45 52 20 50 41 53 53 57 4f 52 44 20  t USER PASSWORD 
347b0 49 53 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20  ISADMIN\n");.   
347c0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
347d0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
347e0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
347f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
34800 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
34810 6e 67 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67  nge(p->db, azArg
34820 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [2],.           
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e     azArg[3], (in
34850 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33  t)strlen(azArg[3
34860 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
34870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34880 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61    booleanValue(a
34890 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20  zArg[4]));.     
348a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
348b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
348c0 64 65 72 72 2c 20 22 55 73 65 72 2d 45 64 69 74  derr, "User-Edit
348d0 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20   failed: %d\n", 
348e0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rc);.        rc 
348f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
34900 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
34910 70 28 61 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65  p(azArg[1],"dele
34920 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
34930 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
34940 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
34950 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
34960 65 3a 20 2e 75 73 65 72 20 64 65 6c 65 74 65 20  e: .user delete 
34970 55 53 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20  USER\n");.      
34980 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
34990 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
349a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
349b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
349c0 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
349d0 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d  (p->db, azArg[2]
349e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
349f0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
34a00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
34a10 73 65 72 2d 44 65 6c 65 74 65 20 66 61 69 6c 65  ser-Delete faile
34a20 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  d: %d\n", rc);. 
34a30 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34a50 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
34a60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
34a70 65 3a 20 2e 75 73 65 72 20 6c 6f 67 69 6e 7c 61  e: .user login|a
34a80 64 64 7c 65 64 69 74 7c 64 65 6c 65 74 65 20 2e  dd|edit|delete .
34a90 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ..\n");.      rc
34aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
34ab0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
34ac0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
34ad0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
34ae0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
34af0 43 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28  CATION */..  if(
34b00 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
34b10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65  mp(azArg[0], "ve
34b20 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  rsion", n)==0 ){
34b30 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
34b40 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65  (p->out, "SQLite
34b50 20 25 73 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72   %s %s\n" /*extr
34b60 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f  a-version-info*/
34b70 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
34b80 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
34b90 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
34ba0 28 29 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ());.  }else..  
34bb0 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74  if( c=='v' && st
34bc0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34bd0 22 76 66 73 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30  "vfsinfo", n)==0
34be0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
34bf0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41  ar *zDbName = nA
34c00 72 67 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg==2 ? azArg[1]
34c10 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73   : "main";.    s
34c20 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
34c30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
34c40 3e 64 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >db ){.      sql
34c50 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
34c60 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65  l(p->db, zDbName
34c70 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  , SQLITE_FCNTL_V
34c80 46 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70 56 66  FS_POINTER, &pVf
34c90 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56  s);.      if( pV
34ca0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  fs ){.        ut
34cb0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34cc0 2c 20 22 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20  , "vfs.zName    
34cd0 20 20 3d 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70    = \"%s\"\n", p
34ce0 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
34cf0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34d00 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 69 56 65  p->out, "vfs.iVe
34d10 72 73 69 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c  rsion   = %d\n",
34d20 20 70 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29   pVfs->iVersion)
34d30 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
34d40 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
34d50 73 2e 73 7a 4f 73 46 69 6c 65 20 20 20 3d 20 25  s.szOsFile   = %
34d60 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 73 7a 4f 73  d\n", pVfs->szOs
34d70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
34d80 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
34d90 2c 20 22 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  , "vfs.mxPathnam
34da0 65 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d  e = %d\n", pVfs-
34db0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  >mxPathname);.  
34dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
34dd0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76  lse..  if( c=='v
34de0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
34df0 72 67 5b 30 5d 2c 20 22 76 66 73 6c 69 73 74 22  rg[0], "vfslist"
34e00 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
34e10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
34e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
34e30 73 20 2a 70 43 75 72 72 65 6e 74 20 3d 20 30 3b  s *pCurrent = 0;
34e40 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29  .    if( p->db )
34e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34e60 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
34e70 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
34e80 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49  TE_FCNTL_VFS_POI
34e90 4e 54 45 52 2c 20 26 70 43 75 72 72 65 6e 74 29  NTER, &pCurrent)
34ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
34eb0 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73  pVfs=sqlite3_vfs
34ec0 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20  _find(0); pVfs; 
34ed0 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74  pVfs=pVfs->pNext
34ee0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
34ef0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
34f00 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c  s.zName      = \
34f10 22 25 73 5c 22 25 73 5c 6e 22 2c 20 70 56 66 73  "%s\"%s\n", pVfs
34f20 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
34f30 20 20 20 20 70 56 66 73 3d 3d 70 43 75 72 72 65      pVfs==pCurre
34f40 6e 74 20 3f 20 22 20 20 3c 2d 2d 2d 20 43 55 52  nt ? "  <--- CUR
34f50 52 45 4e 54 22 20 3a 20 22 22 29 3b 0a 20 20 20  RENT" : "");.   
34f60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
34f70 3e 6f 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73  >out, "vfs.iVers
34f80 69 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70  ion   = %d\n", p
34f90 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a  Vfs->iVersion);.
34fa0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34fb0 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a  (p->out, "vfs.sz
34fc0 4f 73 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22  OsFile   = %d\n"
34fd0 2c 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  , pVfs->szOsFile
34fe0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
34ff0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73  ntf(p->out, "vfs
35000 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 25 64  .mxPathname = %d
35010 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  \n", pVfs->mxPat
35020 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  hname);.      if
35030 28 20 70 56 66 73 2d 3e 70 4e 65 78 74 20 29 7b  ( pVfs->pNext ){
35040 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35050 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  ntf(p->out, "---
35060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35080 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
35090 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
350a0 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72  f( c=='v' && str
350b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
350c0 76 66 73 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20  vfsname", n)==0 
350d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
350e0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72  r *zDbName = nAr
350f0 67 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g==2 ? azArg[1] 
35100 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68  : "main";.    ch
35110 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30  ar *zVfsName = 0
35120 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20  ;.    if( p->db 
35130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35140 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
35150 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  >db, zDbName, SQ
35160 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
35170 4d 45 2c 20 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  ME, &zVfsName);.
35180 20 20 20 20 20 20 69 66 28 20 7a 56 66 73 4e 61        if( zVfsNa
35190 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  me ){.        ut
351a0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
351b0 2c 20 22 25 73 5c 6e 22 2c 20 7a 56 66 73 4e 61  , "%s\n", zVfsNa
351c0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
351d0 69 74 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61  ite3_free(zVfsNa
351e0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
351f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20   }.  }else..#if 
35200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
35210 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
35220 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
35230 48 45 52 45 54 52 41 43 45 29 0a 20 20 69 66 28  HERETRACE).  if(
35240 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63   c=='w' && strnc
35250 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 68  mp(azArg[0], "wh
35260 65 72 65 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30  eretrace", n)==0
35270 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
35280 68 65 72 65 54 72 61 63 65 20 3d 20 6e 41 72 67  hereTrace = nArg
35290 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c  >=2 ? booleanVal
352a0 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30  ue(azArg[1]) : 0
352b0 78 66 66 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  xff;.  }else.#en
352c0 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 77  dif..  if( c=='w
352d0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
352e0 72 67 5b 30 5d 2c 20 22 77 69 64 74 68 22 2c 20  rg[0], "width", 
352f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
35300 20 6a 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   j;.    assert( 
35310 6e 41 72 67 3c 3d 41 72 72 61 79 53 69 7a 65 28  nArg<=ArraySize(
35320 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 66 6f  azArg) );.    fo
35330 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26  r(j=1; j<nArg &&
35340 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   j<ArraySize(p->
35350 63 6f 6c 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b  colWidth); j++){
35360 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
35370 74 68 5b 6a 2d 31 5d 20 3d 20 28 69 6e 74 29 69  th[j-1] = (int)i
35380 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
35390 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[j]);.    }.  }
353a0 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 75 74  else..  {.    ut
353b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
353c0 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  , "Error: unknow
353d0 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e 76  n command or inv
353e0 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a 20  alid arguments: 
353f0 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22  ".      " \"%s\"
35400 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c  . Enter \".help\
35410 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61  " for help\n", a
35420 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 72 63  zArg[0]);.    rc
35430 20 3d 20 31 3b 0a 20 20 7d 0a 0a 6d 65 74 61 5f   = 1;.  }..meta_
35440 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3a 0a 20 20  command_exit:.  
35450 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20  if( p->outCount 
35460 29 7b 0a 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  ){.    p->outCou
35470 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  nt--;.    if( p-
35480 3e 6f 75 74 43 6f 75 6e 74 3d 3d 30 20 29 20 6f  >outCount==0 ) o
35490 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
354a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
354b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
354c0 20 54 52 55 45 20 69 66 20 61 20 73 65 6d 69 63   TRUE if a semic
354d0 6f 6c 6f 6e 20 6f 63 63 75 72 73 20 61 6e 79 77  olon occurs anyw
354e0 68 65 72 65 20 69 6e 20 74 68 65 20 66 69 72 73  here in the firs
354f0 74 20 4e 20 63 68 61 72 61 63 74 65 72 73 0a 2a  t N characters.*
35500 2a 20 6f 66 20 73 74 72 69 6e 67 20 7a 5b 5d 2e  * of string z[].
35510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
35520 69 6e 65 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d  ine_contains_sem
35530 69 63 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  icolon(const cha
35540 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  r *z, int N){.  
35550 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
35560 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20 69 66  ; i<N; i++){  if
35570 28 20 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20 72 65  ( z[i]==';' ) re
35580 74 75 72 6e 20 31 3b 20 7d 0a 20 20 72 65 74 75  turn 1; }.  retu
35590 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
355a0 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 61 20  est to see if a 
355b0 6c 69 6e 65 20 63 6f 6e 73 69 73 74 73 20 65 6e  line consists en
355c0 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65 73  tirely of whites
355d0 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
355e0 69 6e 74 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70  int _all_whitesp
355f0 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ace(const char *
35600 7a 29 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a 3b 20  z){.  for(; *z; 
35610 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 49 73  z++){.    if( Is
35620 53 70 61 63 65 28 7a 5b 30 5d 29 20 29 20 63 6f  Space(z[0]) ) co
35630 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
35640 2a 7a 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d  *z=='/' && z[1]=
35650 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20  ='*' ){.      z 
35660 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
35670 65 28 20 2a 7a 20 26 26 20 28 2a 7a 21 3d 27 2a  e( *z && (*z!='*
35680 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2f 27 29 20  ' || z[1]!='/') 
35690 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ z++; }.      
356a0 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75  if( *z==0 ) retu
356b0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  rn 0;.      z++;
356c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
356d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a  .    }.    if( *
356e0 7a 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  z=='-' && z[1]==
356f0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b  '-' ){.      z +
35700 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 2;.      while
35710 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27  ( *z && *z!='\n'
35720 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
35730 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74   if( *z==0 ) ret
35740 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  urn 1;.      con
35750 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
35760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
35770 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
35780 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
35790 69 66 20 74 68 65 20 6c 69 6e 65 20 74 79 70 65  if the line type
357a0 64 20 69 6e 20 69 73 20 61 6e 20 53 51 4c 20 63  d in is an SQL c
357b0 6f 6d 6d 61 6e 64 20 74 65 72 6d 69 6e 61 74 6f  ommand terminato
357c0 72 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20  r other.** than 
357d0 61 20 73 65 6d 69 2d 63 6f 6c 6f 6e 2e 20 20 54  a semi-colon.  T
357e0 68 65 20 53 51 4c 20 53 65 72 76 65 72 20 73 74  he SQL Server st
357f0 79 6c 65 20 22 67 6f 22 20 63 6f 6d 6d 61 6e 64  yle "go" command
35800 20 69 73 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a   is understood.*
35810 2a 20 61 73 20 69 73 20 74 68 65 20 4f 72 61 63  * as is the Orac
35820 6c 65 20 22 2f 22 2e 0a 2a 2f 0a 73 74 61 74 69  le "/"..*/.stati
35830 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f  c int line_is_co
35840 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72  mmand_terminator
35850 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
35860 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 49 73  ne){.  while( Is
35870 53 70 61 63 65 28 7a 4c 69 6e 65 5b 30 5d 29 20  Space(zLine[0]) 
35880 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20  ){ zLine++; };. 
35890 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
358a0 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  /' && _all_white
358b0 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d 29  space(&zLine[1])
358c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
358d0 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a  ;  /* Oracle */.
358e0 20 20 7d 0a 20 20 69 66 28 20 54 6f 4c 6f 77 65    }.  if( ToLowe
358f0 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27  r(zLine[0])=='g'
35900 20 26 26 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e   && ToLower(zLin
35910 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20  e[1])=='o'.     
35920 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74      && _all_whit
35930 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d  espace(&zLine[2]
35940 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
35950 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65  1;  /* SQL Serve
35960 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  r */.  }.  retur
35970 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
35980 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53 71  turn true if zSq
35990 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  l is a complete 
359a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
359b0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
359c0 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74 68  it.** ends in th
359d0 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73 74  e middle of a st
359e0 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72 20  ring literal or 
359f0 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 2e  C-style comment.
35a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
35a10 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28  ine_is_complete(
35a20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e 74 20  char *zSql, int 
35a30 6e 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nSql){.  int rc;
35a40 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
35a50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 53 71   return 1;.  zSq
35a60 6c 5b 6e 53 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20  l[nSql] = ';';. 
35a70 20 7a 53 71 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20   zSql[nSql+1] = 
35a80 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
35a90 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29  3_complete(zSql)
35aa0 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d  ;.  zSql[nSql] =
35ab0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
35ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  .}../*.** Run a 
35ad0 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 53  single line of S
35ae0 51 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  QL.*/.static int
35af0 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 53   runOneSqlLine(S
35b00 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 68  hellState *p, ch
35b10 61 72 20 2a 7a 53 71 6c 2c 20 46 49 4c 45 20 2a  ar *zSql, FILE *
35b20 69 6e 2c 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  in, int startlin
35b30 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
35b40 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
35b50 30 3b 0a 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0;..  open_db(p,
35b60 20 30 29 3b 0a 20 20 69 66 28 20 53 68 65 6c 6c   0);.  if( Shell
35b70 48 61 73 46 6c 61 67 28 70 2c 53 48 46 4c 47 5f  HasFlag(p,SHFLG_
35b80 42 61 63 6b 73 6c 61 73 68 29 20 29 20 72 65 73  Backslash) ) res
35b90 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
35ba0 28 7a 53 71 6c 29 3b 0a 20 20 42 45 47 49 4e 5f  (zSql);.  BEGIN_
35bb0 54 49 4d 45 52 3b 0a 20 20 72 63 20 3d 20 73 68  TIMER;.  rc = sh
35bc0 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
35bd0 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
35be0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73  back, p, &zErrMs
35bf0 67 29 3b 0a 20 20 45 4e 44 5f 54 49 4d 45 52 3b  g);.  END_TIMER;
35c00 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72  .  if( rc || zEr
35c10 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
35c20 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 0a 20   zPrefix[100];. 
35c30 20 20 20 69 66 28 20 69 6e 21 3d 30 20 7c 7c 20     if( in!=0 || 
35c40 21 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61  !stdin_is_intera
35c50 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
35c60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35c70 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
35c80 20 7a 50 72 65 66 69 78 2c 0a 20 20 20 20 20 20   zPrefix,.      
35c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ca0 20 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69   "Error: near li
35cb0 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69  ne %d:", startli
35cc0 6e 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ne);.    }else{.
35cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
35ce0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50  printf(sizeof(zP
35cf0 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c  refix), zPrefix,
35d00 20 22 45 72 72 6f 72 3a 22 29 3b 0a 20 20 20 20   "Error:");.    
35d10 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
35d20 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  g!=0 ){.      ut
35d30 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
35d40 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72  , "%s %s\n", zPr
35d50 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  efix, zErrMsg);.
35d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
35d70 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
35d80 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
35d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35da0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35db0 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20  err, "%s %s\n", 
35dc0 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74 65 33  zPrefix, sqlite3
35dd0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
35de0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
35df0 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 1;.  }else if(
35e00 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
35e10 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e   SHFLG_CountChan
35e20 67 65 73 29 20 29 7b 0a 20 20 20 20 72 61 77 5f  ges) ){.    raw_
35e30 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
35e40 63 68 61 6e 67 65 73 3a 20 25 33 64 20 20 20 74  changes: %3d   t
35e50 6f 74 61 6c 5f 63 68 61 6e 67 65 73 3a 20 25 64  otal_changes: %d
35e60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35e70 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
35e80 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
35e90 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
35ea0 2d 3e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 72 65  ->db));.  }.  re
35eb0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
35ec0 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
35ed0 6d 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73  m *in and proces
35ee0 73 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30  s it.  If *in==0
35ef0 20 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69   then input.** i
35f00 73 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20  s interactive - 
35f10 74 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69  the user is typi
35f20 6e 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72  ng it it.  Other
35f30 77 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69  wise, input.** i
35f40 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
35f50 66 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20  file or device. 
35f60 20 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73   A prompt is iss
35f70 75 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a  ued and history.
35f80 2a 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79  ** is saved only
35f90 20 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74   if input is int
35fa0 65 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e  eractive.  An in
35fb0 74 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77  terrupt signal w
35fc0 69 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69  ill.** cause thi
35fd0 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69  s routine to exi
35fe0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75  t immediately, u
35ff0 6e 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69  nless input is i
36000 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  nteractive..**.*
36010 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
36020 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
36030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36040 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c  cess_input(Shell
36050 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a  State *p, FILE *
36060 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  in){.  char *zLi
36070 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ne = 0;         
36080 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 70   /* A single inp
36090 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61  ut line */.  cha
360a0 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 20 20 20 20  r *zSql = 0;    
360b0 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
360c0 6c 61 74 65 64 20 53 51 4c 20 74 65 78 74 20 2a  lated SQL text *
360d0 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
360e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
360f0 20 4c 65 6e 67 74 68 20 6f 66 20 63 75 72 72 65   Length of curre
36100 6e 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  nt line */.  int
36110 20 6e 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20   nSql = 0;      
36120 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
36130 6f 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 2a  of zSql[] used *
36140 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
36150 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
36160 20 41 6c 6c 6f 63 61 74 65 64 20 7a 53 71 6c 5b   Allocated zSql[
36170 5d 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74  ] space */.  int
36180 20 6e 53 71 6c 50 72 69 6f 72 20 3d 20 30 3b 20   nSqlPrior = 0; 
36190 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
361a0 6f 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 62  of zSql[] used b
361b0 79 20 70 72 69 6f 72 20 6c 69 6e 65 20 2a 2f 0a  y prior line */.
361c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
361d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
361e0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
361f0 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b 20 20  nt errCnt = 0;  
36200 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36210 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
36220 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  n */.  int linen
36230 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
36240 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65   /* Current line
36250 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
36260 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 20   startline = 0; 
36270 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
36280 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
36290 6f 66 20 63 75 72 72 65 6e 74 20 69 6e 70 75 74  of current input
362a0 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 65 72   */..  while( er
362b0 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c  rCnt==0 || !bail
362c0 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e  _on_error || (in
362d0 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f 69 73 5f  ==0 && stdin_is_
362e0 69 6e 74 65 72 61 63 74 69 76 65 29 20 29 7b 0a  interactive) ){.
362f0 20 20 20 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75      fflush(p->ou
36300 74 29 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20  t);.    zLine = 
36310 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 69  one_input_line(i
36320 6e 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c 3e 30  n, zLine, nSql>0
36330 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  );.    if( zLine
36340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
36350 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a  End of input */.
36360 20 20 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20        if( in==0 
36370 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  && stdin_is_inte
36380 72 61 63 74 69 76 65 20 29 20 70 72 69 6e 74 66  ractive ) printf
36390 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ("\n");.      br
363a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
363b0 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
363c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e   ){.      if( in
363d0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
363e0 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
363f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
36400 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
36410 28 20 6e 53 71 6c 3d 3d 30 20 26 26 20 5f 61 6c  ( nSql==0 && _al
36420 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69  l_whitespace(zLi
36430 6e 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ne) ){.      if(
36440 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
36450 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 20 70   SHFLG_Echo) ) p
36460 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c  rintf("%s\n", zL
36470 69 6e 65 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ine);.      cont
36480 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
36490 69 66 28 20 7a 4c 69 6e 65 20 26 26 20 7a 4c 69  if( zLine && zLi
364a0 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 6e 53  ne[0]=='.' && nS
364b0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ql==0 ){.      i
364c0 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  f( ShellHasFlag(
364d0 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29  p, SHFLG_Echo) )
364e0 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
364f0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 63  zLine);.      rc
36500 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61   = do_meta_comma
36510 6e 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a 20 20  nd(zLine, p);.  
36520 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29 7b      if( rc==2 ){
36530 20 2f 2a 20 65 78 69 74 20 72 65 71 75 65 73 74   /* exit request
36540 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  ed */.        br
36550 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
36560 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
36570 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20     errCnt++;.   
36580 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
36590 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
365a0 66 28 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 6d 61  f( line_is_comma
365b0 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c  nd_terminator(zL
365c0 69 6e 65 29 20 26 26 20 6c 69 6e 65 5f 69 73 5f  ine) && line_is_
365d0 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 2c 20 6e  complete(zSql, n
365e0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  Sql) ){.      me
365f0 6d 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22 2c 32  mcpy(zLine,";",2
36600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4c 69  );.    }.    nLi
36610 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  ne = strlen30(zL
36620 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ine);.    if( nS
36630 71 6c 2b 6e 4c 69 6e 65 2b 32 3e 3d 6e 41 6c 6c  ql+nLine+2>=nAll
36640 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  oc ){.      nAll
36650 6f 63 20 3d 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b  oc = nSql+nLine+
36660 31 30 30 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  100;.      zSql 
36670 3d 20 72 65 61 6c 6c 6f 63 28 7a 53 71 6c 2c 20  = realloc(zSql, 
36680 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  nAlloc);.      i
36690 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
366a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
366b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
366c0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
366d0 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
366e0 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
366f0 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69 6f 72   }.    nSqlPrior
36700 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28   = nSql;.    if(
36710 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   nSql==0 ){.    
36720 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
36730 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d  or(i=0; zLine[i]
36740 20 26 26 20 49 73 53 70 61 63 65 28 7a 4c 69 6e   && IsSpace(zLin
36750 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  e[i]); i++){}.  
36760 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 6c 6c      assert( nAll
36770 6f 63 3e 30 20 26 26 20 7a 53 71 6c 21 3d 30 20  oc>0 && zSql!=0 
36780 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
36790 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2b 69 2c 20 6e  zSql, zLine+i, n
367a0 4c 69 6e 65 2b 31 2d 69 29 3b 0a 20 20 20 20 20  Line+1-i);.     
367b0 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 6c 69 6e   startline = lin
367c0 65 6e 6f 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20  eno;.      nSql 
367d0 3d 20 6e 4c 69 6e 65 2d 69 3b 0a 20 20 20 20 7d  = nLine-i;.    }
367e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
367f0 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c 6e 27 3b  [nSql++] = '\n';
36800 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53  .      memcpy(zS
36810 71 6c 2b 6e 53 71 6c 2c 20 7a 4c 69 6e 65 2c 20  ql+nSql, zLine, 
36820 6e 4c 69 6e 65 2b 31 29 3b 0a 20 20 20 20 20 20  nLine+1);.      
36830 6e 53 71 6c 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20  nSql += nLine;. 
36840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 71     }.    if( nSq
36850 6c 20 26 26 20 6c 69 6e 65 5f 63 6f 6e 74 61 69  l && line_contai
36860 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 26 7a 53  ns_semicolon(&zS
36870 71 6c 5b 6e 53 71 6c 50 72 69 6f 72 5d 2c 20 6e  ql[nSqlPrior], n
36880 53 71 6c 2d 6e 53 71 6c 50 72 69 6f 72 29 0a 20  Sql-nSqlPrior). 
36890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
368a0 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  & sqlite3_comple
368b0 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20  te(zSql) ){.    
368c0 20 20 65 72 72 43 6e 74 20 2b 3d 20 72 75 6e 4f    errCnt += runO
368d0 6e 65 53 71 6c 4c 69 6e 65 28 70 2c 20 7a 53 71  neSqlLine(p, zSq
368e0 6c 2c 20 69 6e 2c 20 73 74 61 72 74 6c 69 6e 65  l, in, startline
368f0 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  );.      nSql = 
36900 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
36910 6f 75 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  outCount ){.    
36920 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
36930 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
36940 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  outCount = 0;.  
36950 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
36960 69 66 28 20 6e 53 71 6c 20 26 26 20 5f 61 6c 6c  if( nSql && _all
36970 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
36980 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  ) ){.      if( S
36990 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
369a0 48 46 4c 47 5f 45 63 68 6f 29 20 29 20 70 72 69  HFLG_Echo) ) pri
369b0 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 53 71 6c  ntf("%s\n", zSql
369c0 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  );.      nSql = 
369d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
369e0 66 28 20 6e 53 71 6c 20 26 26 20 21 5f 61 6c 6c  f( nSql && !_all
369f0 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
36a00 29 20 29 7b 0a 20 20 20 20 72 75 6e 4f 6e 65 53  ) ){.    runOneS
36a10 71 6c 4c 69 6e 65 28 70 2c 20 7a 53 71 6c 2c 20  qlLine(p, zSql, 
36a20 69 6e 2c 20 73 74 61 72 74 6c 69 6e 65 29 3b 0a  in, startline);.
36a30 20 20 7d 0a 20 20 66 72 65 65 28 7a 53 71 6c 29    }.  free(zSql)
36a40 3b 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b  ;.  free(zLine);
36a50 0a 20 20 72 65 74 75 72 6e 20 65 72 72 43 6e 74  .  return errCnt
36a60 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  >0;.}../*.** Ret
36a70 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77  urn a pathname w
36a80 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72  hich is the user
36a90 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  's home director
36aa0 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72  y.  A.** 0 retur
36ab0 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65  n indicates an e
36ac0 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  rror of some kin
36ad0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
36ae0 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72  r *find_home_dir
36af0 28 69 6e 74 20 63 6c 65 61 72 46 6c 61 67 29 7b  (int clearFlag){
36b00 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
36b10 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b  home_dir = NULL;
36b20 0a 20 20 69 66 28 20 63 6c 65 61 72 46 6c 61 67  .  if( clearFlag
36b30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 68 6f 6d   ){.    free(hom
36b40 65 5f 64 69 72 29 3b 0a 20 20 20 20 68 6f 6d 65  e_dir);.    home
36b50 5f 64 69 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  _dir = 0;.    re
36b60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
36b70 28 20 68 6f 6d 65 5f 64 69 72 20 29 20 72 65 74  ( home_dir ) ret
36b80 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 0a 23  urn home_dir;..#
36b90 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
36ba0 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
36bb0 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
36bc0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 5c  ed(_WIN32_WCE) \
36bd0 0a 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65  .     && !define
36be0 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64  d(__RTP__) && !d
36bf0 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
36c00 45 4c 29 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  EL).  {.    stru
36c10 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74  ct passwd *pwent
36c20 3b 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 20  ;.    uid_t uid 
36c30 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 20 20  = getuid();.    
36c40 69 66 28 20 28 70 77 65 6e 74 3d 67 65 74 70 77  if( (pwent=getpw
36c50 75 69 64 28 75 69 64 29 29 20 21 3d 20 4e 55 4c  uid(uid)) != NUL
36c60 4c 29 20 7b 0a 20 20 20 20 20 20 68 6f 6d 65 5f  L) {.      home_
36c70 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f  dir = pwent->pw_
36c80 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dir;.    }.  }.#
36c90 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
36ca0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20  ed(_WIN32_WCE). 
36cb0 20 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28   /* Windows CE (
36cc0 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33  arm-wince-mingw3
36cd0 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f  2ce-gcc) does no
36ce0 74 20 70 72 6f 76 69 64 65 20 67 65 74 65 6e 76  t provide getenv
36cf0 28 29 0a 20 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f  ().   */.  home_
36d00 64 69 72 20 3d 20 22 2f 22 3b 0a 23 65 6c 73 65  dir = "/";.#else
36d10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
36d20 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
36d30 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68  (WIN32).  if (!h
36d40 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
36d50 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
36d60 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
36d70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
36d80 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
36d90 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
36da0 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20  etenv("HOME");. 
36db0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
36dc0 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
36dd0 65 64 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28  ed(WIN32).  if (
36de0 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
36df0 20 63 68 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a   char *zDrive, *
36e00 7a 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e  zPath;.    int n
36e10 3b 0a 20 20 20 20 7a 44 72 69 76 65 20 3d 20 67  ;.    zDrive = g
36e20 65 74 65 6e 76 28 22 48 4f 4d 45 44 52 49 56 45  etenv("HOMEDRIVE
36e30 22 29 3b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  ");.    zPath = 
36e40 67 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48  getenv("HOMEPATH
36e50 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 72 69  ");.    if( zDri
36e60 76 65 20 26 26 20 7a 50 61 74 68 20 29 7b 0a 20  ve && zPath ){. 
36e70 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
36e80 30 28 7a 44 72 69 76 65 29 20 2b 20 73 74 72 6c  0(zDrive) + strl
36e90 65 6e 33 30 28 7a 50 61 74 68 29 20 2b 20 31 3b  en30(zPath) + 1;
36ea0 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  .      home_dir 
36eb0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  = malloc( n );. 
36ec0 20 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69       if( home_di
36ed0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
36ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
36ef0 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f  nprintf(n, home_
36f00 64 69 72 2c 20 22 25 73 25 73 22 2c 20 7a 44 72  dir, "%s%s", zDr
36f10 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  ive, zPath);.   
36f20 20 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64     return home_d
36f30 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f  ir;.    }.    ho
36f40 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b  me_dir = "c:\\";
36f50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  .  }.#endif..#en
36f60 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57  dif /* !_WIN32_W
36f70 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d  CE */..  if( hom
36f80 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 69 6e 74  e_dir ){.    int
36f90 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f   n = strlen30(ho
36fa0 6d 65 5f 64 69 72 29 20 2b 20 31 3b 0a 20 20 20  me_dir) + 1;.   
36fb0 20 63 68 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f   char *z = mallo
36fc0 63 28 20 6e 20 29 3b 0a 20 20 20 20 69 66 28 20  c( n );.    if( 
36fd0 7a 20 29 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f  z ) memcpy(z, ho
36fe0 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20  me_dir, n);.    
36ff0 68 6f 6d 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20  home_dir = z;.  
37000 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68 6f 6d 65  }..  return home
37010 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _dir;.}../*.** R
37020 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 74  ead input from t
37030 68 65 20 66 69 6c 65 20 67 69 76 65 6e 20 62 79  he file given by
37040 20 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69   sqliterc_overri
37050 64 65 2e 20 20 4f 72 20 69 66 20 74 68 61 74 0a  de.  Or if that.
37060 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
37070 4e 55 4c 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74  NULL, take input
37080 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72   from ~/.sqliter
37090 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  c.**.** Returns 
370a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
370b0 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
370c0 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 73 71 6c  void process_sql
370d0 69 74 65 72 63 28 0a 20 20 53 68 65 6c 6c 53 74  iterc(.  ShellSt
370e0 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
370f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
37100 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 20 2a  iguration data *
37110 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
37120 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64  sqliterc_overrid
37130 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e   /* Name of c
37140 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55 4c 4c  onfig file. NULL
37150 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
37160 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 68 6f  */.){.  char *ho
37170 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20  me_dir = NULL;. 
37180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
37190 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65 72 63  iterc = sqliterc
371a0 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63 68 61  _override;.  cha
371b0 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 46  r *zBuf = 0;.  F
371c0 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a  ILE *in = NULL;.
371d0 0a 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20  .  if (sqliterc 
371e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68  == NULL) {.    h
371f0 6f 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68  ome_dir = find_h
37200 6f 6d 65 5f 64 69 72 28 30 29 3b 0a 20 20 20 20  ome_dir(0);.    
37210 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20  if( home_dir==0 
37220 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
37230 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20  ntf(stderr, "-- 
37240 77 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20  warning: cannot 
37250 66 69 6e 64 20 68 6f 6d 65 20 64 69 72 65 63 74  find home direct
37260 6f 72 79 3b 22 0a 20 20 20 20 20 20 20 20 20 20  ory;".          
37270 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 61              " ca
37280 6e 6e 6f 74 20 72 65 61 64 20 7e 2f 2e 73 71 6c  nnot read ~/.sql
37290 69 74 65 72 63 5c 6e 22 29 3b 0a 20 20 20 20 20  iterc\n");.     
372a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
372b0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69     sqlite3_initi
372c0 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7a 42 75  alize();.    zBu
372d0 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  f = sqlite3_mpri
372e0 6e 74 66 28 22 25 73 2f 2e 73 71 6c 69 74 65 72  ntf("%s/.sqliter
372f0 63 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20  c",home_dir);.  
37300 20 20 73 71 6c 69 74 65 72 63 20 3d 20 7a 42 75    sqliterc = zBu
37310 66 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  f;.  }.  in = fo
37320 70 65 6e 28 73 71 6c 69 74 65 72 63 2c 22 72 62  pen(sqliterc,"rb
37330 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a  ");.  if( in ){.
37340 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73      if( stdin_is
37350 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
37360 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
37370 66 28 73 74 64 65 72 72 2c 22 2d 2d 20 4c 6f 61  f(stderr,"-- Loa
37380 64 69 6e 67 20 72 65 73 6f 75 72 63 65 73 20 66  ding resources f
37390 72 6f 6d 20 25 73 5c 6e 22 2c 73 71 6c 69 74 65  rom %s\n",sqlite
373a0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rc);.    }.    p
373b0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69  rocess_input(p,i
373c0 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
373d0 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
373e0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 7d 0a  3_free(zBuf);.}.
373f0 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69  ./*.** Show avai
37400 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  lable command li
37410 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  ne options.*/.st
37420 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
37430 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 0a 20 20 22  zOptions[] =.  "
37440 20 20 20 2d 61 73 63 69 69 20 20 20 20 20 20 20     -ascii       
37450 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
37460 75 74 20 6d 6f 64 65 20 74 6f 20 27 61 73 63 69  ut mode to 'asci
37470 69 27 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69  i'\n".  "   -bai
37480 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
37490 20 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74   stop after hitt
374a0 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a  ing an error\n".
374b0 20 20 22 20 20 20 2d 62 61 74 63 68 20 20 20 20    "   -batch    
374c0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65             force
374d0 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22 0a 20 20   batch I/O\n".  
374e0 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20  "   -column     
374f0 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
37500 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c  put mode to 'col
37510 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 63  umn'\n".  "   -c
37520 6d 64 20 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20  md COMMAND      
37530 20 20 20 72 75 6e 20 5c 22 43 4f 4d 4d 41 4e 44     run \"COMMAND
37540 5c 22 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  \" before readin
37550 67 20 73 74 64 69 6e 5c 6e 22 0a 20 20 22 20 20  g stdin\n".  "  
37560 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20   -csv           
37570 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
37580 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e   mode to 'csv'\n
37590 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
375b0 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo