/ Hex Artifact Content
Login

Artifact 4cfa9394737306c5a5f3d7f72e74868df5f3010676d6a1a2a52db37b61b0c13a:


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 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 23 69 66  _uint64 u64;.#if
0720: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
0730: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 23 20 69 6e  HENTICATION.# in
0740: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 75 73  clude "sqlite3us
0750: 65 72 61 75 74 68 2e 68 22 0a 23 65 6e 64 69 66  erauth.h".#endif
0760: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
0770: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0780: 64 61 72 67 2e 68 3e 0a 0a 23 69 66 20 21 64 65  darg.h>..#if !de
0790: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26  fined(_WIN32) &&
07a0: 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29   !defined(WIN32)
07b0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e  .# include <sign
07c0: 61 6c 2e 68 3e 0a 23 20 69 66 20 21 64 65 66 69  al.h>.# if !defi
07d0: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20  ned(__RTP__) && 
07e0: 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45  !defined(_WRS_KE
07f0: 52 4e 45 4c 29 0a 23 20 20 69 6e 63 6c 75 64 65  RNEL).#  include
0800: 20 3c 70 77 64 2e 68 3e 0a 23 20 65 6e 64 69 66   <pwd.h>.# endif
0810: 0a 23 65 6e 64 69 66 0a 23 69 66 20 28 21 64 65  .#endif.#if (!de
0820: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26  fined(_WIN32) &&
0830: 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29   !defined(WIN32)
0840: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 4d  ) || defined(__M
0850: 49 4e 47 57 5f 48 29 0a 23 20 69 6e 63 6c 75 64  INGW_H).# includ
0860: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69  e <unistd.h>.# i
0870: 6e 63 6c 75 64 65 20 3c 64 69 72 65 6e 74 2e 68  nclude <dirent.h
0880: 3e 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  >.# if defined(_
0890: 5f 4d 49 4e 47 57 5f 48 29 0a 23 20 20 64 65 66  _MINGW_H).#  def
08a0: 69 6e 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e  ine DIRENT diren
08b0: 74 0a 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53  t.#  ifndef S_IS
08c0: 4c 4e 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53  LNK.#   define S
08d0: 5f 49 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29  _ISLNK(mode) (0)
08e0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69  .#  endif.# endi
08f0: 66 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64  f.#endif.#includ
0900: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0910: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
0920: 61 74 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f  at.h>..#if HAVE_
0930: 52 45 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75  READLINE.# inclu
0940: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61  de <readline/rea
0950: 64 6c 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  dline.h>.# inclu
0960: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73  de <readline/his
0970: 74 6f 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  tory.h>.#endif..
0980: 23 69 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e  #if HAVE_EDITLIN
0990: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69  E.# include <edi
09a0: 74 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68  tline/readline.h
09b0: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41  >.#endif..#if HA
09c0: 56 45 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48  VE_EDITLINE || H
09d0: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20  AVE_READLINE..# 
09e0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64  define shell_add
09f0: 5f 68 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f  _history(X) add_
0a00: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
0a10: 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68  ine shell_read_h
0a20: 69 73 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68  istory(X) read_h
0a30: 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69  istory(X).# defi
0a40: 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68  ne shell_write_h
0a50: 69 73 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f  istory(X) write_
0a60: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
0a70: 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65  ine shell_stifle
0a80: 5f 68 69 73 74 6f 72 79 28 58 29 20 73 74 69 66  _history(X) stif
0a90: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  le_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
0ab0: 64 6c 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e  dline(X) readlin
0ac0: 65 28 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45  e(X)..#elif HAVE
0ad0: 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e  _LINENOISE..# in
0ae0: 63 6c 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65  clude "linenoise
0af0: 2e 68 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65  .h".# define she
0b00: 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58  ll_add_history(X
0b10: 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f  ) linenoiseHisto
0b20: 72 79 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e  ryAdd(X).# defin
0b30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0b40: 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73  tory(X) linenois
0b50: 65 48 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a  eHistoryLoad(X).
0b60: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77  # define shell_w
0b70: 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20  rite_history(X) 
0b80: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b90: 53 61 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65  Save(X).# define
0ba0: 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69   shell_stifle_hi
0bb0: 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69  story(X) linenoi
0bc0: 73 65 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c  seHistorySetMaxL
0bd0: 65 6e 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  en(X).# define s
0be0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29  hell_readline(X)
0bf0: 20 6c 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23   linenoise(X)..#
0c00: 65 6c 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73  else..# define s
0c10: 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72  hell_read_histor
0c20: 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  y(X).# define sh
0c30: 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72  ell_write_histor
0c40: 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  y(X).# define sh
0c50: 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f  ell_stifle_histo
0c60: 72 79 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20  ry(X)..# define 
0c70: 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f  SHELL_USE_LOCAL_
0c80: 47 45 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66  GETLINE 1.#endif
0c90: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ...#if defined(_
0ca0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
0cb0: 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75  d(WIN32).# inclu
0cc0: 64 65 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c  de <io.h>.# incl
0cd0: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20  ude <fcntl.h>.# 
0ce0: 64 65 66 69 6e 65 20 69 73 61 74 74 79 28 68 29  define isatty(h)
0cf0: 20 5f 69 73 61 74 74 79 28 68 29 0a 23 20 69 66   _isatty(h).# if
0d00: 6e 64 65 66 20 61 63 63 65 73 73 0a 23 20 20 64  ndef access.#  d
0d10: 65 66 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d  efine access(f,m
0d20: 29 20 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d  ) _access((f),(m
0d30: 29 29 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64  )).# endif.# und
0d40: 65 66 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e  ef popen.# defin
0d50: 65 20 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23  e popen _popen.#
0d60: 20 75 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20   undef pclose.# 
0d70: 64 65 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70  define pclose _p
0d80: 63 6c 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20  close.#else. /* 
0d90: 4d 61 6b 65 20 73 75 72 65 20 69 73 61 74 74 79  Make sure isatty
0da0: 28 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79  () has a prototy
0db0: 70 65 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69  pe. */. extern i
0dc0: 6e 74 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a  nt isatty(int);.
0dd0: 0a 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f  .# if !defined(_
0de0: 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
0df0: 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
0e00: 0a 20 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20  .  /* popen and 
0e10: 70 63 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43  pclose are not C
0e20: 38 39 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  89 functions and
0e30: 20 73 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d   so are.  ** som
0e40: 65 74 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66  etimes omitted f
0e50: 72 6f 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68  rom the <stdio.h
0e60: 3e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65  > header */.   e
0e70: 78 74 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65  xtern FILE *pope
0e80: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  n(const char*,co
0e90: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65  nst char*);.   e
0ea0: 78 74 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65  xtern int pclose
0eb0: 28 46 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a  (FILE*);.# else.
0ec0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0ed0: 5f 4f 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20  _OMIT_POPEN 1.# 
0ee0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69  endif.#endif..#i
0ef0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
0f00: 5f 57 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73  _WCE)./* Windows
0f10: 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d   CE (arm-wince-m
0f20: 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f  ingw32ce-gcc) do
0f30: 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69  es not provide i
0f40: 73 61 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20  satty(). * thus 
0f50: 77 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65  we always assume
0f60: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 61 20   that we have a 
0f70: 63 6f 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61  console. That ca
0f80: 6e 20 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64  n be. * overridd
0f90: 65 6e 20 77 69 74 68 20 74 68 65 20 2d 62 61 74  en with the -bat
0fa0: 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ch command line 
0fb0: 6f 70 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66  option.. */.#def
0fc0: 69 6e 65 20 69 73 61 74 74 79 28 78 29 20 31 0a  ine isatty(x) 1.
0fd0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65  #endif../* ctype
0fe0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72   macros that wor
0ff0: 6b 20 77 69 74 68 20 73 69 67 6e 65 64 20 63 68  k with signed ch
1000: 61 72 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66  aracters */.#def
1010: 69 6e 65 20 49 73 53 70 61 63 65 28 58 29 20 20  ine IsSpace(X)  
1020: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
1030: 64 20 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e  d char)X).#defin
1040: 65 20 49 73 44 69 67 69 74 28 58 29 20 20 69 73  e IsDigit(X)  is
1050: 64 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20  digit((unsigned 
1060: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1070: 54 6f 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61  ToLower(X)  (cha
1080: 72 29 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67  r)tolower((unsig
1090: 6e 65 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66  ned char)X)..#if
10a0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
10b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
10c0: 32 29 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e  2).#include <win
10d0: 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69  dows.h>../* stri
10e0: 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f  ng conversion ro
10f0: 75 74 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64  utines only need
1100: 65 64 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65  ed on Win32 */.e
1110: 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69  xtern char *sqli
1120: 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64  te3_win32_unicod
1130: 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54  e_to_utf8(LPCWST
1140: 52 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20  R);.extern char 
1150: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
1160: 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63  bcs_to_utf8_v2(c
1170: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
1180: 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a  );.extern char *
1190: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
11a0: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f  f8_to_mbcs_v2(co
11b0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29  nst char *, int)
11c0: 3b 0a 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20  ;.extern LPWSTR 
11d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
11e0: 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f  f8_to_unicode(co
11f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29  nst char *zText)
1200: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20  ;.#endif../* On 
1210: 57 69 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d  Windows, we norm
1220: 61 6c 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75  ally run with ou
1230: 74 70 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58  tput mode of TEX
1240: 54 20 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61  T so that \n cha
1250: 72 61 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61  racters.** are a
1260: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61  utomatically tra
1270: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c  nslated into \r\
1280: 6e 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69  n.  However, thi
1290: 73 20 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73  s behavior needs
12a0: 0a 2a 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c  .** to be disabl
12b0: 65 64 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ed in some cases
12c0: 20 28 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72   (ex: when gener
12d0: 61 74 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74  ating CSV output
12e0: 20 61 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e   and when.** ren
12f0: 64 65 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74  dering quoted st
1300: 72 69 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61  rings that conta
1310: 69 6e 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73  in \n characters
1320: 29 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ).  The followin
1330: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61  g.** routines ta
1340: 6b 65 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e  ke care of that.
1350: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1360: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
1370: 65 64 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63  ed(WIN32).static
1380: 20 76 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d   void setBinaryM
1390: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
13a0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
13b0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
13c0: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
13d0: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
13e0: 28 66 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52  (file), _O_BINAR
13f0: 59 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  Y);.}.static voi
1400: 64 20 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49  d setTextMode(FI
1410: 4c 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73  LE *file, int is
1420: 4f 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69  Output){.  if( i
1430: 73 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68  sOutput ) fflush
1440: 28 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f  (file);.  _setmo
1450: 64 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29  de(_fileno(file)
1460: 2c 20 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65  , _O_TEXT);.}.#e
1470: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74  lse.# define set
1480: 42 69 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a  BinaryMode(X,Y).
1490: 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 78 74  # define setText
14a0: 4d 6f 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66  Mode(X,Y).#endif
14b0: 0a 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68  .../* True if th
14c0: 65 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c  e timer is enabl
14d0: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ed */.static int
14e0: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30   enableTimer = 0
14f0: 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  ;../* Return the
1500: 20 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c   current wall-cl
1510: 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74  ock time */.stat
1520: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
1530: 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29   timeOfDay(void)
1540: 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
1550: 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73  e3_vfs *clockVfs
1560: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1570: 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63  int64 t;.  if( c
1580: 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f  lockVfs==0 ) clo
1590: 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ckVfs = sqlite3_
15a0: 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
15b0: 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65  f( clockVfs->iVe
15c0: 72 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63  rsion>=2 && cloc
15d0: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
15e0: 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20  meInt64!=0 ){.  
15f0: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
1600: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c  rentTimeInt64(cl
1610: 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d  ockVfs, &t);.  }
1620: 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65  else{.    double
1630: 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   r;.    clockVfs
1640: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63  ->xCurrentTime(c
1650: 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20  lockVfs, &r);.  
1660: 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69    t = (sqlite3_i
1670: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
1680: 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  .0);.  }.  retur
1690: 6e 20 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  n t;.}..#if !def
16a0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20  ined(_WIN32) && 
16b0: 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20  !defined(WIN32) 
16c0: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69  && !defined(__mi
16d0: 6e 75 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73  nux).#include <s
16e0: 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  ys/time.h>.#incl
16f0: 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63  ude <sys/resourc
1700: 65 2e 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73  e.h>../* VxWorks
1710: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
1720: 74 20 67 65 74 72 75 73 61 67 65 28 29 20 61 73  t getrusage() as
1730: 20 66 61 72 20 61 73 20 77 65 20 63 61 6e 20 64   far as we can d
1740: 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20  etermine */.#if 
1750: 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
1760: 4e 45 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  NEL) || defined(
1770: 5f 5f 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20  __RTP__).struct 
1780: 72 75 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63  rusage {.  struc
1790: 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69  t timeval ru_uti
17a0: 6d 65 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20  me; /* user CPU 
17b0: 74 69 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73  time used */.  s
17c0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75  truct timeval ru
17d0: 5f 73 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65  _stime; /* syste
17e0: 6d 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  m CPU time used 
17f0: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65  */.};.#define ge
1800: 74 72 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d  trusage(A,B) mem
1810: 73 65 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a  set(B,0,sizeof(*
1820: 42 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53  B)).#endif../* S
1830: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
1840: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1850: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
1860: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
1870: 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73  tatic struct rus
1880: 61 67 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20  age sBegin;  /* 
1890: 43 50 55 20 74 69 6d 65 20 61 74 20 73 74 61 72  CPU time at star
18a0: 74 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  t */.static sqli
18b0: 74 65 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e  te3_int64 iBegin
18c0: 3b 20 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b  ;  /* Wall-clock
18d0: 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a   time at start *
18e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  /../*.** Begin t
18f0: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
1900: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
1910: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
1920: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1930: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74  Timer ){.    get
1940: 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
1950: 4c 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20  LF, &sBegin);.  
1960: 20 20 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f    iBegin = timeO
1970: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
1980: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
1990: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74  ference of two t
19a0: 69 6d 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73  ime_structs in s
19b0: 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63  econds */.static
19c0: 20 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66   double timeDiff
19d0: 28 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20  (struct timeval 
19e0: 2a 70 53 74 61 72 74 2c 20 73 74 72 75 63 74 20  *pStart, struct 
19f0: 74 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a  timeval *pEnd){.
1a00: 20 20 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e    return (pEnd->
1a10: 74 76 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74  tv_usec - pStart
1a20: 2d 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30  ->tv_usec)*0.000
1a30: 30 30 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28  001 +.         (
1a40: 64 6f 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76  double)(pEnd->tv
1a50: 5f 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74  _sec - pStart->t
1a60: 76 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  v_sec);.}../*.**
1a70: 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e   Print the timin
1a80: 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  g results..*/.st
1a90: 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d  atic void endTim
1aa0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
1ab0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1ac0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1ad0: 20 69 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61   iEnd = timeOfDa
1ae0: 79 28 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20  y();.    struct 
1af0: 72 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20  rusage sEnd;.   
1b00: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
1b10: 45 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a  E_SELF, &sEnd);.
1b20: 20 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20      printf("Run 
1b30: 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20  Time: real %.3f 
1b40: 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e  user %f sys %f\n
1b50: 22 2c 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20  ",.       (iEnd 
1b60: 2d 20 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  - iBegin)*0.001,
1b70: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
1b80: 28 26 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d  (&sBegin.ru_utim
1b90: 65 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d  e, &sEnd.ru_utim
1ba0: 65 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  e),.       timeD
1bb0: 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73  iff(&sBegin.ru_s
1bc0: 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73  time, &sEnd.ru_s
1bd0: 74 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  time));.  }.}..#
1be0: 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d  define BEGIN_TIM
1bf0: 45 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a  ER beginTimer().
1c00: 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45  #define END_TIME
1c10: 52 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65  R endTimer().#de
1c20: 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31  fine HAS_TIMER 1
1c30: 0a 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64  ..#elif (defined
1c40: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
1c50: 6e 65 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20  ned(WIN32))../* 
1c60: 53 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69  Saved resource i
1c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
1c80: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1c90: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  an operation */.
1ca0: 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50  static HANDLE hP
1cb0: 72 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46  rocess;.static F
1cc0: 49 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c  ILETIME ftKernel
1cd0: 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49  Begin;.static FI
1ce0: 4c 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67  LETIME ftUserBeg
1cf0: 69 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74  in;.static sqlit
1d00: 65 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42  e3_int64 ftWallB
1d10: 65 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f  egin;.typedef BO
1d20: 4f 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50  OL (WINAPI *GETP
1d30: 52 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45  ROCTIMES)(HANDLE
1d40: 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50  , LPFILETIME, LP
1d50: 46 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20  FILETIME,.      
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 50                LP
1d80: 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45  FILETIME, LPFILE
1d90: 54 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45  TIME);.static GE
1da0: 54 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72  TPROCTIMES getPr
1db0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
1dc0: 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   NULL;../*.** Ch
1dd0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
1de0: 20 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70   have timer supp
1df0: 6f 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ort.  Return 1 i
1e00: 66 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73  f necessary.** s
1e10: 75 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72  upport found (or
1e20: 20 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c   found previousl
1e30: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y)..*/.static in
1e40: 74 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29  t hasTimer(void)
1e50: 7b 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65  {.  if( getProce
1e60: 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20  ssTimesAddr ){. 
1e70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1e80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47   else {.    /* G
1e90: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29  etProcessTimes()
1ea0: 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1eb0: 20 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f   in WIN95 and so
1ec0: 6d 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  me other Windows
1ed0: 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73  .    ** versions
1ee0: 2e 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72  . See if the ver
1ef0: 73 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e  sion we are runn
1f00: 69 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61  ing on has it, a
1f10: 6e 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20  nd if it.    ** 
1f20: 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61  does, save off a
1f30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61   pointer to it a
1f40: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  nd the current p
1f50: 72 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20  rocess handle.. 
1f60: 20 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65     */.    hProce
1f70: 73 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50  ss = GetCurrentP
1f80: 72 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66  rocess();.    if
1f90: 28 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20  ( hProcess ){.  
1fa0: 20 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69      HINSTANCE hi
1fb0: 6e 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62  nstLib = LoadLib
1fc0: 72 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65  rary(TEXT("Kerne
1fd0: 6c 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20  l32.dll"));.    
1fe0: 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69    if( NULL != hi
1ff0: 6e 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20  nstLib ){.      
2000: 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65    getProcessTime
2010: 73 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20  sAddr =.        
2020: 20 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45      (GETPROCTIME
2030: 53 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  S) GetProcAddres
2040: 73 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74  s(hinstLib, "Get
2050: 50 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a  ProcessTimes");.
2060: 20 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c          if( NULL
2070: 20 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69   != getProcessTi
2080: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20  mesAddr ){.     
2090: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
20a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b0: 20 46 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e   FreeLibrary(hin
20c0: 73 74 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a  stLib);.      }.
20d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  rn 0;.}../*.** B
20f0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
2100: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
2110: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
2120: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
2130: 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67  enableTimer && g
2140: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
2150: 64 72 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49  dr ){.    FILETI
2160: 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66  ME ftCreation, f
2170: 74 45 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72  tExit;.    getPr
2180: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
2190: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
21a0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20  ion,&ftExit,.   
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65       &ftKernelBe
21d0: 67 69 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e  gin,&ftUserBegin
21e0: 29 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67  );.    ftWallBeg
21f0: 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  in = timeOfDay()
2200: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ;.  }.}../* Retu
2210: 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  rn the differenc
2220: 65 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d  e of two FILETIM
2230: 45 20 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  E structs in sec
2240: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
2250: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46  ouble timeDiff(F
2260: 49 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c  ILETIME *pStart,
2270: 20 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29   FILETIME *pEnd)
2280: 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  {.  sqlite_int64
2290: 20 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73   i64Start = *((s
22a0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70  qlite_int64 *) p
22b0: 53 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  Start);.  sqlite
22c0: 5f 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20  _int64 i64End = 
22d0: 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  *((sqlite_int64 
22e0: 2a 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75  *) pEnd);.  retu
22f0: 72 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36  rn (double) ((i6
2300: 34 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29  4End - i64Start)
2310: 20 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a   / 10000000.0);.
2320: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
2330: 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74  he timing result
2340: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2350: 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29  d endTimer(void)
2360: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
2370: 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73  mer && getProces
2380: 73 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20  sTimesAddr){.   
2390: 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61   FILETIME ftCrea
23a0: 74 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74  tion, ftExit, ft
23b0: 4b 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65  KernelEnd, ftUse
23c0: 72 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  rEnd;.    sqlite
23d0: 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e  3_int64 ftWallEn
23e0: 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  d = timeOfDay();
23f0: 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54  .    getProcessT
2400: 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73  imesAddr(hProces
2410: 73 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66  s,&ftCreation,&f
2420: 74 45 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45  tExit,&ftKernelE
2430: 6e 64 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a  nd,&ftUserEnd);.
2440: 20 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20      printf("Run 
2450: 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20  Time: real %.3f 
2460: 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e  user %f sys %f\n
2470: 22 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c  ",.       (ftWal
2480: 6c 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67  lEnd - ftWallBeg
2490: 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20  in)*0.001,.     
24a0: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55 73    timeDiff(&ftUs
24b0: 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72  erBegin, &ftUser
24c0: 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d  End),.       tim
24d0: 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42  eDiff(&ftKernelB
24e0: 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45  egin, &ftKernelE
24f0: 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  nd));.  }.}..#de
2500: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2510: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
2520: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
2530: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
2540: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73  ne HAS_TIMER has
2550: 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23  Timer()..#else.#
2560: 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d  define BEGIN_TIM
2570: 45 52 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ER.#define END_T
2580: 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53  IMER.#define HAS
2590: 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a  _TIMER 0.#endif.
25a0: 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70  ./*.** Used to p
25b0: 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20  revent warnings 
25c0: 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72  about unused par
25d0: 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69  ameters.*/.#defi
25e0: 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ne UNUSED_PARAME
25f0: 54 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29  TER(x) (void)(x)
2600: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
2610: 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20 69 73  ollowing flag is
2620: 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d 6d 61   set, then comma
2630: 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73 74 6f  nd execution sto
2640: 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72 72 6f  ps.** at an erro
2650: 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  r if we are not 
2660: 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a  interactive..*/.
2670: 73 74 61 74 69 63 20 69 6e 74 20 62 61 69 6c 5f  static int bail_
2680: 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f  on_error = 0;../
2690: 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74 64 69  *.** Threat stdi
26a0: 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61 63 74  n as an interact
26b0: 69 76 65 20 69 6e 70 75 74 20 69 66 20 74 68 65  ive input if the
26c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
26d0: 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65 2e 20  ble.** is true. 
26e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
26f0: 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f 6e 6e  me stdin is conn
2700: 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c 65 20  ected to a file 
2710: 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74 61 74  or pipe..*/.stat
2720: 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69 73 5f  ic int stdin_is_
2730: 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 31 3b  interactive = 1;
2740: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f  ../*.** On Windo
2750: 77 73 20 73 79 73 74 65 6d 73 20 77 65 20 68 61  ws systems we ha
2760: 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66 20 73 74  ve to know if st
2770: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 69 73  andard output is
2780: 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e   a console.** in
2790: 20 6f 72 64 65 72 20 74 6f 20 74 72 61 6e 73 6c   order to transl
27a0: 61 74 65 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d  ate UTF-8 into M
27b0: 42 43 53 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  BCS.  The follow
27c0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 0a  ing variable is.
27d0: 2a 2a 20 74 72 75 65 20 69 66 20 74 72 61 6e 73  ** true if trans
27e0: 6c 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  lation is requir
27f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2800: 74 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73  t stdout_is_cons
2810: 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20  ole = 1;../*.** 
2820: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2830: 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69 74 65   the open SQLite
2840: 20 64 61 74 61 62 61 73 65 2e 20 20 57 65 20 6d   database.  We m
2850: 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ake a pointer.**
2860: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
2870: 65 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  e a static varia
2880: 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ble so that it c
2890: 61 6e 20 62 65 20 61 63 63 65 73 73 65 64 0a 2a  an be accessed.*
28a0: 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e 54 20  * by the SIGINT 
28b0: 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74 65 72  handler to inter
28c0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 70 72  rupt database pr
28d0: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61  ocessing..*/.sta
28e0: 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67 6c 6f  tic sqlite3 *glo
28f0: 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  balDb = 0;../*.*
2900: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69 6e 74  * True if an int
2910: 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f 6c 2d  errupt (Control-
2920: 43 29 20 68 61 73 20 62 65 65 6e 20 72 65 63 65  C) has been rece
2930: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
2940: 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73 65 65  volatile int see
2950: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
2960: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2970: 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72 20 70  he name of our p
2980: 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20 73 65  rogram. It is se
2990: 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75 73 65  t in main(), use
29a0: 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62 65 72  d.** in a number
29b0: 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63 65 73   of other places
29c0: 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65 72 72  , mostly for err
29d0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
29e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 41 72 67  static char *Arg
29f0: 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70  v0;../*.** Promp
2a00: 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69 74 69  t strings. Initi
2a10: 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e 2e 20  alized in main. 
2a20: 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a  Settable with.**
2a30: 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69 6e 20     .prompt main 
2a40: 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74 61 74  continue.*/.stat
2a50: 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72 6f 6d  ic char mainProm
2a60: 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a 20 46  pt[20];     /* F
2a70: 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d 70 74  irst line prompt
2a80: 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71 6c 69  . default: "sqli
2a90: 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63 20 63  te> "*/.static c
2aa0: 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  har continueProm
2ab0: 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69  pt[20]; /* Conti
2ac0: 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 20  nuation prompt. 
2ad0: 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e 2e 2e  default: "   ...
2ae0: 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  > " */../*.** Re
2af0: 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65  nder output like
2b00: 20 66 70 72 69 6e 74 66 28 29 2e 20 20 45 78 63   fprintf().  Exc
2b10: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 75 74 70  ept, if the outp
2b20: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 74  ut is going to t
2b30: 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e  he.** console an
2b40: 64 20 69 66 20 74 68 69 73 20 69 73 20 72 75 6e  d if this is run
2b50: 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e 64 6f 77  ning on a Window
2b60: 73 20 6d 61 63 68 69 6e 65 2c 20 74 72 61 6e 73  s machine, trans
2b70: 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f 75 74 70  late the.** outp
2b80: 75 74 20 66 72 6f 6d 20 55 54 46 2d 38 20 69 6e  ut from UTF-8 in
2b90: 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23 69 66 20  to MBCS..*/.#if 
2ba0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
2bb0: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
2bc0: 29 0a 76 6f 69 64 20 75 74 66 38 5f 70 72 69 6e  ).void utf8_prin
2bd0: 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  tf(FILE *out, co
2be0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2bf0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2c00: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
2c10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2c20: 20 20 69 66 28 20 73 74 64 6f 75 74 5f 69 73 5f    if( stdout_is_
2c30: 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f 75 74 3d  console && (out=
2c40: 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d  =stdout || out==
2c50: 73 74 64 65 72 72 29 20 29 7b 0a 20 20 20 20 63  stderr) ){.    c
2c60: 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c 69 74 65  har *z1 = sqlite
2c70: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
2c80: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 63 68 61  at, ap);.    cha
2c90: 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f  r *z2 = sqlite3_
2ca0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
2cb0: 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b 0a 20 20  cs_v2(z1, 0);.  
2cc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cd0: 31 29 3b 0a 20 20 20 20 66 70 75 74 73 28 7a 32  1);.    fputs(z2
2ce0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  , out);.    sqli
2cf0: 74 65 33 5f 66 72 65 65 28 7a 32 29 3b 0a 20 20  te3_free(z2);.  
2d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66 70 72 69  }else{.    vfpri
2d10: 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72 6d 61 74  ntf(out, zFormat
2d20: 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  , ap);.  }.  va_
2d30: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6c 69 66  end(ap);.}.#elif
2d40: 20 21 64 65 66 69 6e 65 64 28 75 74 66 38 5f 70   !defined(utf8_p
2d50: 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e 65 20  rintf).# define 
2d60: 75 74 66 38 5f 70 72 69 6e 74 66 20 66 70 72 69  utf8_printf fpri
2d70: 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ntf.#endif../*.*
2d80: 2a 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20  * Render output 
2d90: 6c 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20  like fprintf(). 
2da0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
2db0: 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e 79 74   be used on anyt
2dc0: 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 69 6e 63  hing that.** inc
2dd0: 6c 75 64 65 73 20 73 74 72 69 6e 67 20 66 6f 72  ludes string for
2de0: 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e 20 22 25  matting (e.g. "%
2df0: 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  s")..*/.#if !def
2e00: 69 6e 65 64 28 72 61 77 5f 70 72 69 6e 74 66 29  ined(raw_printf)
2e10: 0a 23 20 64 65 66 69 6e 65 20 72 61 77 5f 70 72  .# define raw_pr
2e20: 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23 65 6e  intf fprintf.#en
2e30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
2e40: 20 49 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74   I/O traces to t
2e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2e60: 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  eam..*/.#ifdef S
2e70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
2e80: 52 41 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45  RACE.static FILE
2e90: 20 2a 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23   *iotrace = 0;.#
2ea0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2eb0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
2ec0: 6c 69 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74  like printf in t
2ed0: 68 61 74 20 69 74 73 20 66 69 72 73 74 20 61 72  hat its first ar
2ee0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66  gument is a.** f
2ef0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64  ormat string and
2f00: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
2f10: 6d 65 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73  ments are values
2f20: 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
2f30: 65 64 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f  ed.** in place o
2f40: 66 20 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65  f % fields.  The
2f50: 20 72 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61   result of forma
2f60: 74 74 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e  tting this strin
2f70: 67 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  g.** is written 
2f80: 74 6f 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23  to iotrace..*/.#
2f90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2fa0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
2fb0: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43  ic void SQLITE_C
2fc0: 44 45 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e  DECL iotracePrin
2fd0: 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
2fe0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
2ff0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
3000: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74  ar *z;.  if( iot
3010: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
3020: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
3030: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d   zFormat);.  z =
3040: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
3050: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
3060: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3070: 75 74 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72  utf8_printf(iotr
3080: 61 63 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  ace, "%s", z);. 
3090: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
30a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
30b0: 2a 20 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20  * Output string 
30c0: 7a 55 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70  zUtf to stream p
30d0: 4f 75 74 20 61 73 20 77 20 63 68 61 72 61 63 74  Out as w charact
30e0: 65 72 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65  ers.  If w is ne
30f0: 67 61 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20  gative,.** then 
3100: 72 69 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68  right-justify th
3110: 65 20 74 65 78 74 2e 20 20 57 20 69 73 20 74 68  e text.  W is th
3120: 65 20 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38  e width in UTF-8
3130: 20 63 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74   characters, not
3140: 0a 2a 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54  .** in bytes.  T
3150: 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
3160: 20 66 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20   from the %*.*s 
3170: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
3180: 20 70 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65   printf.** since
3190: 20 77 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20   with %*.*s the 
31a0: 77 69 64 74 68 20 69 73 20 6d 65 61 73 75 72 65  width is measure
31b0: 64 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20  d in bytes, not 
31c0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
31d0: 74 61 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f  tatic void utf8_
31e0: 77 69 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45  width_print(FILE
31f0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63   *pOut, int w, c
3200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29  onst char *zUtf)
3210: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
3220: 20 6e 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77   n;.  int aw = w
3230: 3c 30 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63  <0 ? -w : w;.  c
3240: 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a  har zBuf[1000];.
3250: 20 20 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69    if( aw>(int)si
3260: 7a 65 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61  zeof(zBuf)/3 ) a
3270: 77 20 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28  w = (int)sizeof(
3280: 7a 42 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69  zBuf)/3;.  for(i
3290: 3d 6e 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69  =n=0; zUtf[i]; i
32a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55  ++){.    if( (zU
32b0: 74 66 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38  tf[i]&0xc0)!=0x8
32c0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  0 ){.      n++;.
32d0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20        if( n==aw 
32e0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69  ){.        do{ i
32f0: 2b 2b 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74  ++; }while( (zUt
3300: 66 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30  f[i]&0xc0)==0x80
3310: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
3320: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3330: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77  .  }.  if( n>=aw
3340: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
3350: 6e 74 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22  ntf(pOut, "%.*s"
3360: 2c 20 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65  , i, zUtf);.  }e
3370: 6c 73 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20  lse if( w<0 ){. 
3380: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
3390: 4f 75 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77  Out, "%*s%s", aw
33a0: 2d 6e 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20  -n, "", zUtf);. 
33b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38   }else{.    utf8
33c0: 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  _printf(pOut, "%
33d0: 73 25 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d  s%*s", zUtf, aw-
33e0: 6e 2c 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  n, "");.  }.}...
33f0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73  /*.** Determines
3400: 20 69 66 20 61 20 73 74 72 69 6e 67 20 69 73 20   if a string is 
3410: 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e  a number of not.
3420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3430: 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68  sNumber(const ch
3440: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c  ar *z, int *real
3450: 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d  num){.  if( *z==
3460: 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29  '-' || *z=='+' )
3470: 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44   z++;.  if( !IsD
3480: 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20  igit(*z) ){.    
3490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
34a0: 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e  z++;.  if( realn
34b0: 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20  um ) *realnum = 
34c0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69  0;.  while( IsDi
34d0: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
34e0: 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20  }.  if( *z=='.' 
34f0: 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  ){.    z++;.    
3500: 69 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29  if( !IsDigit(*z)
3510: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
3520: 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
3530: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
3540: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3550: 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
3560: 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20  }.  if( *z=='e' 
3570: 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20  || *z=='E' ){.  
3580: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a    z++;.    if( *
3590: 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d  z=='+' || *z=='-
35a0: 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ' ) z++;.    if(
35b0: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
35c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
35d0: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
35e0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
35f0: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
3600: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
3610: 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
3620: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
3630: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
3640: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
3650: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
3660: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
3670: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
3680: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
3690: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
36a0: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
36b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
36c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
36d0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
36e0: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
36f0: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
3700: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
3710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3720: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20  the length of a 
3730: 73 74 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63  string in charac
3740: 74 65 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65  ters.  Multibyte
3750: 20 55 54 46 38 20 63 68 61 72 61 63 74 65 72 73   UTF8 characters
3760: 0a 2a 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73  .** count as a s
3770: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e  ingle character.
3780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3790: 74 72 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20  trlenChar(const 
37a0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
37b0: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
37c0: 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30  *z ){.    if( (0
37d0: 78 63 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38  xc0&*(z++))!=0x8
37e0: 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72  0 ) n++;.  }.  r
37f0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
3800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3810: 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74  eads a line of t
3820: 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ext from FILE in
3830: 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20  , stores.** the 
3840: 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  text in memory o
3850: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
3860: 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e  loc() and return
3870: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
3880: 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c  o the text.  NUL
3890: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74  L is returned at
38a0: 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72   end of file, or
38b0: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20   if malloc().** 
38c0: 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
38d0: 7a 4c 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  zLine is not NUL
38e0: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d  L then it is a m
38f0: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72  alloced buffer r
3900: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  eturned from.** 
3910: 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20  a previous call 
3920: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
3930: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 75 73  that may be reus
3940: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
3950: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
3960: 65 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46  e(char *zLine, F
3970: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20  ILE *in){.  int 
3980: 6e 4c 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30  nLine = zLine==0
3990: 20 3f 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e   ? 0 : 100;.  in
39a0: 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  t n = 0;..  whil
39b0: 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20  e( 1 ){.    if( 
39c0: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
39d0: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
39e0: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
39f0: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
3a00: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
3a10: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
3a20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3a30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
3a40: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
3a50: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
3a60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
3a70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
3a80: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
3a90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3aa0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
3ab0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [n] = 0;.      b
3ac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ad0: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
3ae0: 29 20 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e  ) n++;.    if( n
3af0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
3b00: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
3b10: 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  n--;.      if( n
3b20: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
3b30: 3d 3d 27 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20 20  =='\r' ) n--;.  
3b40: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
3b50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b60: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66     }.  }.#if def
3b70: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
3b80: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
3b90: 20 2f 2a 20 46 6f 72 20 69 6e 74 65 72 61 63 74   /* For interact
3ba0: 69 76 65 20 69 6e 70 75 74 20 6f 6e 20 57 69 6e  ive input on Win
3bb0: 64 6f 77 73 20 73 79 73 74 65 6d 73 2c 20 74 72  dows systems, tr
3bc0: 61 6e 73 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a  anslate the.  **
3bd0: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
3be0: 61 63 74 65 72 73 65 74 20 63 68 61 72 61 63 74  acterset charact
3bf0: 65 72 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20  ers into UTF-8. 
3c00: 2a 2f 0a 20 20 69 66 28 20 73 74 64 69 6e 5f 69  */.  if( stdin_i
3c10: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 26 26  s_interactive &&
3c20: 20 69 6e 3d 3d 73 74 64 69 6e 20 29 7b 0a 20 20   in==stdin ){.  
3c30: 20 20 63 68 61 72 20 2a 7a 54 72 61 6e 73 20 3d    char *zTrans =
3c40: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
3c50: 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 7a  bcs_to_utf8_v2(z
3c60: 4c 69 6e 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Line, 0);.    if
3c70: 28 20 7a 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  ( zTrans ){.    
3c80: 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 73    int nTrans = s
3c90: 74 72 6c 65 6e 33 30 28 7a 54 72 61 6e 73 29 2b  trlen30(zTrans)+
3ca0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72  1;.      if( nTr
3cb0: 61 6e 73 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  ans>nLine ){.   
3cc0: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
3cd0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 54 72 61  lloc(zLine, nTra
3ce0: 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ns);.        if(
3cf0: 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20   zLine==0 ){.   
3d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3d10: 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20  ree(zTrans);.   
3d20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
3d30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3d40: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
3d50: 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73 2c 20 6e  zLine, zTrans, n
3d60: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 73 71  Trans);.      sq
3d70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e  lite3_free(zTran
3d80: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  s);.    }.  }.#e
3d90: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
3da0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3db0: 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a 20 20 72  ed(WIN32) */.  r
3dc0: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
3dd0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
3de0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
3df0: 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a  input text..**.*
3e00: 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65 6e 20  * If in==0 then 
3e10: 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e 64 61  read from standa
3e20: 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70 72 6f  rd input and pro
3e30: 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63 68 20  mpt before each 
3e40: 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f  line..** If isCo
3e50: 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 74 72  ntinuation is tr
3e60: 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e 74 69  ue, then a conti
3e70: 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 20 69  nuation prompt i
3e80: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
3e90: 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74  * If isContinuat
3ea0: 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ion is zero, the
3eb0: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 6d 70  n the main promp
3ec0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3ed0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72 69 6f  ..**.** If zPrio
3ee0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  r is not NULL th
3ef0: 65 6e 20 69 74 20 69 73 20 61 20 62 75 66 66 65  en it is a buffe
3f00: 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  r from a prior c
3f10: 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72  all to this.** r
3f20: 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61 6e 20  outine that can 
3f30: 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  be reused..**.**
3f40: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   The result is s
3f50: 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f  tored in space o
3f60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
3f70: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 65  loc() and must e
3f80: 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72 65 65  ither.** be free
3f90: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
3fa0: 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64 20 62  or else passed b
3fb0: 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  ack into this ro
3fc0: 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a 2a 2a  utine via the.**
3fd0: 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65 6e 74   zPrior argument
3fe0: 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 73   for reuse..*/.s
3ff0: 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f  tatic char *one_
4000: 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c 45 20  input_line(FILE 
4010: 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72 69 6f  *in, char *zPrio
4020: 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69 6e 75  r, int isContinu
4030: 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72 20 2a  ation){.  char *
4040: 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20  zPrompt;.  char 
4050: 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66 28 20  *zResult;.  if( 
4060: 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a 52 65  in!=0 ){.    zRe
4070: 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  sult = local_get
4080: 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69 6e 29  line(zPrior, in)
4090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
40a0: 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e 74 69  Prompt = isConti
40b0: 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74 69 6e  nuation ? contin
40c0: 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69 6e 50  uePrompt : mainP
40d0: 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48 45 4c 4c  rompt;.#if SHELL
40e0: 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49  _USE_LOCAL_GETLI
40f0: 4e 45 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  NE.    printf("%
4100: 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a 20 20  s", zPrompt);.  
4110: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
4120: 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20  ;.    zResult = 
4130: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50  local_getline(zP
4140: 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a 23 65  rior, stdin);.#e
4150: 6c 73 65 0a 20 20 20 20 66 72 65 65 28 7a 50 72  lse.    free(zPr
4160: 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c  ior);.    zResul
4170: 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69  t = shell_readli
4180: 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20  ne(zPrompt);.   
4190: 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26 26 20   if( zResult && 
41a0: 2a 7a 52 65 73 75 6c 74 20 29 20 73 68 65 6c 6c  *zResult ) shell
41b0: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52 65  _add_history(zRe
41c0: 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  sult);.#endif.  
41d0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
41e0: 6c 74 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 41 20 76 61  lt;.}./*.** A va
41f0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4200: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4210: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4220: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4230: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
4240: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
4250: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
4260: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
4270: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
4280: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
4290: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
42a0: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
42b0: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
42c0: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
42d0: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
42e0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
42f0: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4300: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4310: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4320: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4330: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
4340: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
4350: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
4360: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
4370: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
4380: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
4390: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
43a0: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
43b0: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
43c0: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
43d0: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
43e0: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
43f0: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4400: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4410: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4420: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4430: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
4440: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
4450: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
4460: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
4470: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
4480: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
4490: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
44a0: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
44b0: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
44c0: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
44d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
44e0: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
44f0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4500: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4510: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4520: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4530: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4540: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4550: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4570: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4580: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4590: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
45a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
45b0: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
45c0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
45d0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
45e0: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
45f0: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4600: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4610: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4620: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4630: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4640: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4650: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4660: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4670: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4680: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4690: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
46a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
46b0: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
46c0: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
46d0: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
46e0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
46f0: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4700: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4710: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4720: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4730: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4740: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4750: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4760: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4770: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4780: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4790: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
47a0: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
47b0: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
47c0: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
47d0: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
47e0: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
47f0: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4800: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4810: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4820: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4830: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4840: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4850: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4860: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4870: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4880: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4890: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
48a0: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
48b0: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
48c0: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
48d0: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
48e0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
48f0: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4900: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4910: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4920: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4930: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4940: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4950: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4960: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4970: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4980: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4990: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
49a0: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
49b0: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
49c0: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
49d0: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
49e0: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
49f0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4a00: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4a10: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4a20: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4a30: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4a40: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4a50: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4a60: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4a70: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4a80: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4a90: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
4aa0: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
4ab0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
4ac0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
4ad0: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
4ae0: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
4af0: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
4b00: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
4b10: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
4b20: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
4b30: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
4b40: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
4b50: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
4b60: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
4b70: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
4b80: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
4b90: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
4ba0: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
4bb0: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
4bc0: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
4bd0: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
4be0: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
4bf0: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
4c00: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
4c10: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
4c20: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
4c30: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
4c40: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
4c50: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
4c60: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
4c70: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
4c80: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
4c90: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
4ca0: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
4cb0: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
4cc0: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
4cd0: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
4ce0: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
4cf0: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
4d00: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
4d10: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
4d20: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
4d30: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
4d40: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
4d50: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
4d60: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
4d70: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
4d80: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
4d90: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
4da0: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
4db0: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
4dc0: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
4dd0: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
4de0: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
4df0: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
4e00: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
4e10: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
4e20: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
4e30: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
4e40: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
4e50: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
4e60: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
4e70: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
4e80: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
4e90: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
4ea0: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
4eb0: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
4ec0: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
4ed0: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
4ee0: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
4ef0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
4f00: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
4f10: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
4f20: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
4f30: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
4f40: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
4f50: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
4f60: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
4f70: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
4f80: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
4f90: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
4fa0: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
4fb0: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
4fc0: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
4fd0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
4fe0: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
4ff0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5000: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5010: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5020: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5030: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5040: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
5050: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5060: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
5070: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
5080: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
5090: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
50a0: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
50b0: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
50c0: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
50d0: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
50e0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
50f0: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5100: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5110: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5120: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5140: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5150: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
5160: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
5170: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
5180: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
5190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
51a0: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
51b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
51c0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
51d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
51e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
51f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5200: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5210: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5220: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5230: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
5240: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
5250: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
5260: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
5270: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
5280: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
5290: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
52c0: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
52d0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
52e0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
52f0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5300: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5310: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5320: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5330: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
5340: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5350: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
5360: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5370: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5380: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
5390: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
53a0: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
53b0: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
53c0: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
53d0: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
53e0: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
53f0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5400: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5410: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5420: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5430: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
5440: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5460: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
5470: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5480: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
5490: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
54a0: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
54b0: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
54c0: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
54d0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
54e0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
54f0: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5500: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5510: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5520: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5530: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5540: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5550: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5560: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5570: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5580: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5590: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
55a0: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
55b0: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
55c0: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
55d0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
55e0: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
55f0: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5600: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5620: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5630: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5640: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5650: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5660: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5680: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5690: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
56a0: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
56b0: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
56c0: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
56d0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56e0: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
56f0: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  , 0, zName);.  i
5700: 66 28 20 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20  f( zFake ){.    
5710: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5720: 65 78 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65  ext(pCtx, sqlite
5730: 33 5f 6d 70 72 69 6e 74 66 28 22 2f 2a 20 25 7a  3_mprintf("/* %z
5740: 20 2a 2f 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20   */", zFake),.  
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 20 20 20 2d 31 2c 20 73 71 6c 69 74 65        -1, sqlite
5770: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
5780: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
5790: 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73  on:  shell_add_s
57a0: 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a  chema(S,X).**.**
57b0: 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61 20   Add the schema 
57c0: 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43 52  name X to the CR
57d0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69  EATE statement i
57e0: 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20 74  n S and return t
57f0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78  he result..** Ex
5800: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
5810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5820: 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41 54  (x)   ->   CREAT
5830: 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28 78  E TABLE xyz.t1(x
5840: 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f  );.**.** Also wo
5850: 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  rks on.**.**    
5860: 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20  CREATE INDEX.** 
5870: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
5880: 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45   INDEX.**    CRE
5890: 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20 43  ATE VIEW.**    C
58a0: 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a 2a  REATE TRIGGER.**
58b0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
58c0: 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54  AL TABLE.**.** T
58d0: 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64 20  his UDF is used 
58e0: 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20 63  by the .schema c
58f0: 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72 74  ommand to insert
5900: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5910: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
5920: 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20 74  databases into t
5930: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
5940: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73   sqlite_master.s
5950: 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ql field..*/.sta
5960: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41 64  tic void shellAd
5970: 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73  dSchemaName(.  s
5980: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5990: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
59a0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
59b0: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
59c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
59d0: 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a   *aPrefix[] = {.
59e0: 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20 20       "TABLE",.  
59f0: 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20 20     "INDEX",.    
5a00: 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22 2c   "UNIQUE INDEX",
5a10: 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20 20  .     "VIEW",.  
5a20: 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20 20     "TRIGGER",.  
5a30: 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42 4c     "VIRTUAL TABL
5a40: 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20  E".  };.  int i 
5a50: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
5a60: 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20  r *zIn = (const 
5a70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5a80: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
5a90: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
5aa0: 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e   *zSchema = (con
5ab0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5ac0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
5ad0: 6c 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  l[1]);.  const c
5ae0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
5af0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5b00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
5b10: 61 6c 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65  al[2]);.  sqlite
5b20: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
5b30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
5b40: 65 28 70 43 74 78 29 3b 0a 20 20 69 66 28 20 7a  e(pCtx);.  if( z
5b50: 49 6e 21 3d 30 20 26 26 20 73 74 72 6e 63 6d 70  In!=0 && strncmp
5b60: 28 7a 49 6e 2c 20 22 43 52 45 41 54 45 20 22 2c  (zIn, "CREATE ",
5b70: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f   7)==0 ){.    fo
5b80: 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73  r(i=0; i<(int)(s
5b90: 69 7a 65 6f 66 28 61 50 72 65 66 69 78 29 2f 73  izeof(aPrefix)/s
5ba0: 69 7a 65 6f 66 28 61 50 72 65 66 69 78 5b 30 5d  izeof(aPrefix[0]
5bb0: 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  )); i++){.      
5bc0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
5bd0: 28 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20  (aPrefix[i]);.  
5be0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
5bf0: 7a 49 6e 2b 37 2c 20 61 50 72 65 66 69 78 5b 69  zIn+7, aPrefix[i
5c00: 5d 2c 20 6e 29 3d 3d 30 20 26 26 20 7a 49 6e 5b  ], n)==0 && zIn[
5c10: 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n+7]==' ' ){.   
5c20: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30       char *z = 0
5c30: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
5c40: 7a 46 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 20  zFake = 0;.     
5c50: 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 20 29     if( zSchema )
5c60: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
5c70: 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43   cQuote = quoteC
5c80: 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20  har(zSchema);.  
5c90: 20 20 20 20 20 20 20 20 69 66 28 20 63 51 75 6f          if( cQuo
5ca0: 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  te && sqlite3_st
5cb0: 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c 22 74  ricmp(zSchema,"t
5cc0: 65 6d 70 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  emp")!=0 ){.    
5cd0: 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69          z = sqli
5ce0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a  te3_mprintf("%.*
5cf0: 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c 20 6e 2b  s \"%w\".%s", n+
5d00: 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c  7, zIn, zSchema,
5d10: 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20   zIn+n+8);.     
5d20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5d30: 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69          z = sqli
5d40: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a  te3_mprintf("%.*
5d50: 73 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a  s %s.%s", n+7, z
5d60: 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e  In, zSchema, zIn
5d70: 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 20  +n+8);.         
5d80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5d90: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 0a 20       if( zName. 
5da0: 20 20 20 20 20 20 20 20 26 26 20 61 50 72 65 66          && aPref
5db0: 69 78 5b 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20 20  ix[i][0]=='V'.  
5dc0: 20 20 20 20 20 20 20 26 26 20 28 7a 46 61 6b 65         && (zFake
5dd0: 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65   = shellFakeSche
5de0: 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20  ma(db, zSchema, 
5df0: 7a 4e 61 6d 65 29 29 21 3d 30 0a 20 20 20 20 20  zName))!=0.     
5e00: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
5e10: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
5e20: 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69          z = sqli
5e30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 5c  te3_mprintf("%s\
5e40: 6e 2f 2a 20 25 7a 20 2a 2f 22 2c 20 7a 49 6e 2c  n/* %z */", zIn,
5e50: 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20 20   zFake);.       
5e60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5e70: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
5e80: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e 2f  3_mprintf("%z\n/
5e90: 2a 20 25 7a 20 2a 2f 22 2c 20 7a 2c 20 7a 46 61  * %z */", z, zFa
5ea0: 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ke);.          }
5eb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ec0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
5ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5ee0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
5ef0: 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  z, -1, sqlite3_f
5f00: 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
5f10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
5f20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
5f30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
5f40: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
5f50: 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f   apVal[0]);.}../
5f60: 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63 65 20  *.** The source 
5f70: 63 6f 64 65 20 66 6f 72 20 73 65 76 65 72 61 6c  code for several
5f80: 20 72 75 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62   run-time loadab
5f90: 6c 65 20 65 78 74 65 6e 73 69 6f 6e 73 20 69 73  le extensions is
5fa0: 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c   inserted.** bel
5fb0: 6f 77 20 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f  ow by the ../too
5fc0: 6c 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73  l/mkshellc.tcl s
5fd0: 63 72 69 70 74 2e 20 20 42 65 66 6f 72 65 20 70  cript.  Before p
5fe0: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 69  rocessing that i
5ff0: 6e 63 6c 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c  ncluded.** code,
6000: 20 77 65 20 6e 65 65 64 20 74 6f 20 6f 76 65 72   we need to over
6010: 72 69 64 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73  ride some macros
6020: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 63   to make the inc
6030: 6c 75 64 65 64 20 70 72 6f 67 72 61 6d 20 63 6f  luded program co
6040: 64 65 0a 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20  de.** work here 
6050: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
6060: 20 74 68 69 73 20 72 65 67 75 6c 61 72 20 70 72   this regular pr
6070: 6f 67 72 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ogram..*/.#defin
6080: 65 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49  e SQLITE_EXTENSI
6090: 4f 4e 5f 49 4e 49 54 31 0a 23 64 65 66 69 6e 65  ON_INIT1.#define
60a0: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
60b0: 4e 5f 49 4e 49 54 32 28 58 29 20 28 76 6f 69 64  N_INIT2(X) (void
60c0: 29 28 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  )(X)..#if define
60d0: 64 28 5f 57 49 4e 33 32 29 20 26 26 20 64 65 66  d(_WIN32) && def
60e0: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49  ined(_MSC_VER).I
60f0: 4e 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e 64  NCLUDE test_wind
6100: 69 72 65 6e 74 2e 63 0a 23 64 65 66 69 6e 65 20  irent.c.#define 
6110: 64 69 72 65 6e 74 20 44 49 52 45 4e 54 0a 23 65  dirent DIRENT.#e
6120: 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ndif.INCLUDE ../
6130: 65 78 74 2f 6d 69 73 63 2f 73 68 61 74 68 72 65  ext/misc/shathre
6140: 65 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65  e.c.INCLUDE ../e
6150: 78 74 2f 6d 69 73 63 2f 66 69 6c 65 69 6f 2e 63  xt/misc/fileio.c
6160: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
6170: 6d 69 73 63 2f 63 6f 6d 70 6c 65 74 69 6f 6e 2e  misc/completion.
6180: 63 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  c.#ifdef SQLITE_
6190: 48 41 56 45 5f 5a 4c 49 42 0a 49 4e 43 4c 55 44  HAVE_ZLIB.INCLUD
61a0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 7a 69  E ../ext/misc/zi
61b0: 70 66 69 6c 65 2e 63 0a 49 4e 43 4c 55 44 45 20  pfile.c.INCLUDE 
61c0: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 71 6c 61  ../ext/misc/sqla
61d0: 72 2e 63 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  r.c.#endif.INCLU
61e0: 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74  DE ../ext/expert
61f0: 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e 68  /sqlite3expert.h
6200: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
6210: 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78  expert/sqlite3ex
6220: 70 65 72 74 2e 63 0a 0a 23 69 66 20 64 65 66 69  pert.c..#if defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
6240: 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
6250: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
6260: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
6270: 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f 0a  open session.*/.
6280: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4f  typedef struct O
6290: 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e 53  penSession OpenS
62a0: 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20 4f  ession;.struct O
62b0: 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20 63  penSession {.  c
62c0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
62d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
62e0: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  lic name for thi
62f0: 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  s session */.  i
6300: 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20 20  nt nFilter;     
6310: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6320: 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  r of xFilter rej
6330: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
6340: 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  erns */.  char *
6350: 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20 20  *azFilter;      
6360: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 78     /* Array of x
6370: 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e  Filter rejection
6380: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a   GLOB patterns *
6390: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  /.  sqlite3_sess
63a0: 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a 20  ion *p;      /* 
63b0: 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  The open session
63c0: 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f   */.};.#endif../
63d0: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
63e0: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
63f0: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
6400: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a 2a  .explain on",.**
6410: 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20 69   saved so that i
6420: 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  t can be restore
6430: 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20 6f  d by ".explain o
6440: 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ff".*/.typedef s
6450: 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49  truct SavedModeI
6460: 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e 66  nfo SavedModeInf
6470: 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64 4d  o;.struct SavedM
6480: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  odeInfo {.  int 
6490: 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  valid;          
64a0: 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69  /* Is there legi
64b0: 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20  t data in here? 
64c0: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
64d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
64e0: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
64f0: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6500: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
6510: 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65 72   /* The ".header
6520: 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72 20  " setting prior 
6530: 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  to ".explain on"
6540: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64   */.  int colWid
6550: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f 6c  th[100];  /* Col
6560: 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f 72  umn widths prior
6570: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
6580: 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  " */.};..typedef
6590: 20 73 74 72 75 63 74 20 45 78 70 65 72 74 49 6e   struct ExpertIn
65a0: 66 6f 20 45 78 70 65 72 74 49 6e 66 6f 3b 0a 73  fo ExpertInfo;.s
65b0: 74 72 75 63 74 20 45 78 70 65 72 74 49 6e 66 6f  truct ExpertInfo
65c0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70 65   {.  sqlite3expe
65d0: 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 20 20 69  rt *pExpert;.  i
65e0: 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a 7d 3b 0a  nt bVerbose;.};.
65f0: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
6600: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6610: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
6620: 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61 69  ection is contai
6630: 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 73  ned in an.** ins
6640: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6650: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6660: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
6670: 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 53  uct ShellState S
6680: 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75 63  hellState;.struc
6690: 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a 20  t ShellState {. 
66a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
66b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
66c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
66d0: 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20   autoExplain;   
66e0: 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
66f0: 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65 78  ally turn on .ex
6700: 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  plain mode */.  
6710: 69 6e 74 20 61 75 74 6f 45 51 50 3b 20 20 20 20  int autoEQP;    
6720: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45 58         /* Run EX
6730: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
6740: 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68 20   prior to seach 
6750: 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  SQL stmt */.  in
6760: 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  t statsOn;      
6770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6780: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
6790: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
67a0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69   finalize */.  i
67b0: 6e 74 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20  nt scanstatsOn; 
67c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
67d0: 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   display scan st
67e0: 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20  ats before each 
67f0: 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e  finalize */.  in
6800: 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20  t outCount;     
6810: 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74       /* Revert t
6820: 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65  o stdout when re
6830: 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20  aching zero */. 
6840: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
6850: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6860: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73  r of records dis
6870: 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f  played so far */
6880: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  .  FILE *out;   
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
68a0: 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
68b0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65  */.  FILE *trace
68c0: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  Out;        /* O
68d0: 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65  utput for sqlite
68e0: 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69  3_trace() */.  i
68f0: 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20  nt nErr;        
6900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6910: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
6920: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20  /.  int mode;   
6930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
6940: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74   output mode set
6950: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 4d  ting */.  int cM
6960: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
6970: 20 2f 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 75   /* temporary ou
6980: 74 70 75 74 20 6d 6f 64 65 20 66 6f 72 20 74 68  tput mode for th
6990: 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 20  e current query 
69a0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d  */.  int normalM
69b0: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ode;        /* O
69c0: 75 74 70 75 74 20 6d 6f 64 65 20 62 65 66 6f 72  utput mode befor
69d0: 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20  e ".explain on" 
69e0: 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c  */.  int writabl
69f0: 65 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54  eSchema;    /* T
6a00: 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77 72  rue if PRAGMA wr
6a10: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
6a20: 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65   */.  int showHe
6a30: 61 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ader;        /* 
6a40: 54 72 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c  True to show col
6a50: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73  umn names in Lis
6a60: 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65  t or Column mode
6a70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 65 63 6b   */.  int nCheck
6a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a90: 4e 75 6d 62 65 72 20 6f 66 20 22 2e 63 68 65 63  Number of ".chec
6aa0: 6b 22 20 63 6f 6d 6d 61 6e 64 73 20 72 75 6e 20  k" commands run 
6ab0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68  */.  unsigned sh
6ac0: 65 6c 6c 46 6c 67 73 3b 20 20 20 20 2f 2a 20 56  ellFlgs;    /* V
6ad0: 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
6ae0: 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54 61 62    char *zDestTab
6af0: 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  le;      /* Name
6b00: 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   of destination 
6b10: 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44 45 5f  table when MODE_
6b20: 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72  Insert */.  char
6b30: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6b40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6b50: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
6b60: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
6b70: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
6b80: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
6b90: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
6ba0: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
6bb0: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
6bc0: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
6bd0: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
6be0: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
6bf0: 69 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  i */.  int colWi
6c00: 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a  dth[100];     /*
6c10: 20 52 65 71 75 65 73 74 65 64 20 77 69 64 74 68   Requested width
6c20: 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
6c30: 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d  when in column m
6c40: 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75  ode*/.  int actu
6c50: 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  alWidth[100];  /
6c60: 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f  * Actual width o
6c70: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f  f each column */
6c80: 0a 20 20 63 68 61 72 20 6e 75 6c 6c 56 61 6c 75  .  char nullValu
6c90: 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65  e[20];    /* The
6ca0: 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77   text to print w
6cb0: 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
6cc0: 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20   back from.     
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
6cf0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75  ase */.  char ou
6d00: 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d  tfile[FILENAME_M
6d10: 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  AX]; /* Filename
6d20: 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63   for *out */.  c
6d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69  onst char *zDbFi
6d40: 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61  lename;    /* na
6d50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
6d60: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
6d70: 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 3b  r *zFreeOnClose;
6d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
6d90: 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77 68 65  name to free whe
6da0: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 63  n closing */.  c
6db0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
6dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6dd0: 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75 73 65  me of VFS to use
6de0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
6df0: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20  mt *pStmt;   /* 
6e00: 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  Current statemen
6e10: 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46  t if any. */.  F
6e20: 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20  ILE *pLog;      
6e30: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6c        /* Write l
6e40: 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a  og output here *
6e50: 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64 65 6e  /.  int *aiInden
6e60: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  t;         /* Ar
6e70: 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73 20 75  ray of indents u
6e80: 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78 70 6c  sed in MODE_Expl
6e90: 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ain */.  int nIn
6ea0: 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  dent;           
6eb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
6ec0: 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20   aiIndent[] */. 
6ed0: 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20 20 20   int iIndent;   
6ee0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6ef0: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70 20 69   of current op i
6f00: 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  n aiIndent[] */.
6f10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6f20: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
6f30: 4e 29 0a 20 20 69 6e 74 20 6e 53 65 73 73 69 6f  N).  int nSessio
6f40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
6f50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  * Number of acti
6f60: 76 65 20 73 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  ve sessions */. 
6f70: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 61 53 65   OpenSession aSe
6f80: 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72  ssion[4];  /* Ar
6f90: 72 61 79 20 6f 66 20 73 65 73 73 69 6f 6e 73 2e  ray of sessions.
6fa0: 20 20 5b 30 5d 20 69 73 20 69 6e 20 66 6f 63 75    [0] is in focu
6fb0: 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 45  s. */.#endif.  E
6fc0: 78 70 65 72 74 49 6e 66 6f 20 65 78 70 65 72 74  xpertInfo expert
6fd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69  ;        /* Vali
6fe0: 64 20 69 66 20 70 72 65 76 69 6f 75 73 20 63 6f  d if previous co
6ff0: 6d 6d 61 6e 64 20 77 61 73 20 22 2e 65 78 70 65  mmand was ".expe
7000: 72 74 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b  rt OPT..." */.};
7010: 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  ../* Allowed val
7020: 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61  ues for ShellSta
7030: 74 65 2e 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64  te.autoEQP.*/.#d
7040: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66  efine AUTOEQP_of
7050: 66 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  f      0.#define
7060: 20 41 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20   AUTOEQP_on     
7070: 20 20 31 0a 23 64 65 66 69 6e 65 20 41 55 54 4f    1.#define AUTO
7080: 45 51 50 5f 74 72 69 67 67 65 72 20 20 32 0a 23  EQP_trigger  2.#
7090: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 66  define AUTOEQP_f
70a0: 75 6c 6c 20 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a  ull     3../*.**
70b0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
70c0: 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73  llowed shellFlgs
70d0: 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69   values.*/.#defi
70e0: 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63  ne SHFLG_Pagecac
70f0: 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  he      0x000000
7100: 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65  01 /* The --page
7110: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20  cache option is 
7120: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
7130: 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20  SHFLG_Lookaside 
7140: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32 20       0x00000002 
7150: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
7160: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ory is used */.#
7170: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63  define SHFLG_Bac
7180: 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30 30  kslash      0x00
7190: 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d  000004 /* The --
71a0: 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e  backslash option
71b0: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
71c0: 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72  ine SHFLG_Preser
71d0: 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30 30  veRowid  0x00000
71e0: 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65  008 /* .dump pre
71f0: 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c  serves rowid val
7200: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ues */.#define S
7210: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20  HFLG_Newlines   
7220: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 2f      0x00000010 /
7230: 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e  * .dump --newlin
7240: 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e  e flag */.#defin
7250: 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  e SHFLG_CountCha
7260: 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30 32  nges   0x0000002
7270: 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65  0 /* .changes se
7280: 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65  tting */.#define
7290: 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20   SHFLG_Echo     
72a0: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30        0x00000040
72b0: 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65   /* .echo or --e
72c0: 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a  cho setting */..
72d0: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72  /*.** Macros for
72e0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74   testing and set
72f0: 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a  ting shellFlgs.*
7300: 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48  /.#define ShellH
7310: 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  asFlag(P,X)    (
7320: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  ((P)->shellFlgs 
7330: 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69  & (X))!=0).#defi
7340: 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28  ne ShellSetFlag(
7350: 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68  P,X)    ((P)->sh
7360: 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64  ellFlgs|=(X)).#d
7370: 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72  efine ShellClear
7380: 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d  Flag(P,X)  ((P)-
7390: 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58  >shellFlgs&=(~(X
73a0: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  )))../*.** These
73b0: 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64   are the allowed
73c0: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
73d0: 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20  ne MODE_Line    
73e0: 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d   0  /* One colum
73f0: 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61  n per line.  Bla
7400: 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20  nk line between 
7410: 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69  records */.#defi
7420: 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20  ne MODE_Column  
7430: 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72   1  /* One recor
7440: 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65  d per line in ne
7450: 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64  at columns */.#d
7460: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20  efine MODE_List 
7470: 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65      2  /* One re
7480: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69  cord per line wi
7490: 74 68 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a  th a separator *
74a0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53  /.#define MODE_S
74b0: 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61  emi     3  /* Sa
74c0: 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20  me as MODE_List 
74d0: 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74  but append ";" t
74e0: 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23  o each line */.#
74f0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c  define MODE_Html
7500: 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72       4  /* Gener
7510: 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62  ate an XHTML tab
7520: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  le */.#define MO
7530: 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f  DE_Insert   5  /
7540: 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22  * Generate SQL "
7550: 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e  insert" statemen
7560: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
7570: 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f  DE_Quote    6  /
7580: 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61  * Quote values a
7590: 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65  s for SQL */.#de
75a0: 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20  fine MODE_Tcl   
75b0: 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74     7  /* Generat
75c0: 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20  e ANSI-C or TCL 
75d0: 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20  quoted elements 
75e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
75f0: 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51  Csv      8  /* Q
7600: 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75  uote strings, nu
7610: 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20  mbers are plain 
7620: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7630: 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c  Explain  9  /* L
7640: 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c  ike MODE_Column,
7650: 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e   but do not trun
7660: 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65  cate data */.#de
7670: 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20  fine MODE_Ascii 
7680: 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43    10  /* Use ASC
7690: 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f  II unit and reco
76a0: 72 64 20 73 65 70 61 72 61 74 6f 72 73 20 28 30  rd separators (0
76b0: 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65  x1F/0x1E) */.#de
76c0: 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79  fine MODE_Pretty
76d0: 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d    11  /* Pretty-
76e0: 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f  print schemas */
76f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
7700: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
7710: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
7720: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
7730: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
7740: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
7750: 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a  rt",.  "quote",.
7760: 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22    "tcl",.  "csv"
7770: 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20  ,.  "explain",. 
7780: 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65   "ascii",.  "pre
7790: 74 74 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f  ttyprint",.};../
77a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
77b0: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
77c0: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
77d0: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
77e0: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
77f0: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
7800: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
7810: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
7820: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
7830: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
7840: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
7850: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
7860: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
7870: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
7880: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
7890: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
78a0: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
78b0: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
78c0: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
78d0: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 4e   "\x1E"../*.** N
78e0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
78f0: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f  s in an array.*/
7900: 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69  .#define ArraySi
7910: 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a  ze(X)  (int)(siz
7920: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
7930: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  0]))../*.** A ca
7940: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
7950: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
7960: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
7970: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
7980: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
7990: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
79a0: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
79b0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
79c0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
79d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
79e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
79f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
7a00: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
7a10: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
7a20: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
7a30: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  og);.}../*.** Ou
7a40: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
7a50: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
7a60: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
7a70: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
7a80: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
7a90: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
7aa0: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
7ab0: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
7ac0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
7ad0: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
7ae0: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
7af0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
7b00: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
7b10: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
7b20: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
7b30: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
7b40: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
7b50: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
7b60: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
7b70: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
7b80: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
7b90: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
7ba0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
7bb0: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
7bc0: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
7bd0: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
7be0: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
7bf0: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
7c00: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
7c10: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
7c20: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
7c30: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
7c40: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
7c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
7c60: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
7c70: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c90: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
7ca0: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
7cb0: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
7cc0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
7cd0: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
7ce0: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
7cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
7d20: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
7d30: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
7d40: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
7d50: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
7d60: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
7d70: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
7d80: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
7d90: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
7da0: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
7db0: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
7dc0: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
7dd0: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
7de0: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
7df0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
7e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
7e10: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
7e20: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
7e30: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
7e40: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
7e50: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
7e60: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
7e70: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
7e80: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
7e90: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
7ea0: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
7eb0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
7ec0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
7ed0: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
7ee0: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
7ef0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
7f00: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
7f10: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
7f20: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
7f30: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
7f40: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
7f50: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
7f60: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
7f70: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
7f80: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
7f90: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
7fa0: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
7fb0: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
7fc0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
7fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
7fe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
7ff0: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
8000: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
8010: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
8020: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
8030: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8040: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
8050: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
8060: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
8070: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
8080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8090: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
80a0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
80b0: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
80c0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
80d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
80e0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
80f0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
8100: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
8110: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
8120: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
8130: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
8140: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
8150: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
8160: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
8170: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
8180: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
8190: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
81a0: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
81b0: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
81c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
81d0: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
81e0: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
81f0: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
8200: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
8210: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
8220: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
8230: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
8240: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
8250: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
8260: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
8270: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
8280: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
8290: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
82a0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
82b0: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
82c0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
82d0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
82e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
82f0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
8300: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
8310: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8320: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
8330: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
8340: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
8350: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
8360: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
8370: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
8380: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
8390: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
83a0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
83b0: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
83c0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
83d0: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
83e0: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
83f0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8400: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
8410: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
8420: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
8430: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
8440: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
8450: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
8460: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
8470: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
8480: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
8490: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
84a0: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
84b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
84c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
84d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
84e0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
84f0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
8500: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
8510: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
8520: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
8530: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
8540: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
8550: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
8560: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
8570: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
8580: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
8590: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
85a0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
85b0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
85c0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
85d0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
85e0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
85f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8600: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
8610: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
8620: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
8630: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
8640: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
8650: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8660: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
8670: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
8680: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
8690: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
86a0: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
86b0: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
86c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
86d0: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
86e0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
86f0: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
8700: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
8710: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
8720: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
8730: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
8740: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
8750: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
8760: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
8770: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
8780: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
8790: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
87a0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
87b0: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
87c0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
87d0: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
87e0: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
87f0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
8800: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
8810: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
8820: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
8830: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
8840: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
8850: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8860: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
8870: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
8880: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
8890: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
88a0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
88b0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
88c0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
88d0: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
88e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
88f0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
8900: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
8910: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
8920: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
8930: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
8940: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
8950: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
8960: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
8970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8980: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
8990: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
89a0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
89b0: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
89c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
89d0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
89e0: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
89f0: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
8a00: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
8a10: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
8a20: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
8a30: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
8a40: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
8a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
8a60: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
8a70: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
8a80: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
8a90: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
8aa0: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
8ab0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
8ac0: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
8ad0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
8ae0: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
8af0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
8b10: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
8b20: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
8b30: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
8b40: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
8b50: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
8b60: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
8b70: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
8b80: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
8b90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
8ba0: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
8bb0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
8bc0: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
8bd0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
8be0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8bf0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
8c00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8c10: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
8c20: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8c30: 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
8c40: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
8c50: 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \"' ){.      raw
8c60: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  _printf(out,"&qu
8c70: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
8c80: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
8c90: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8ca0: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
8cb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8cd0: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
8ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
8cf0: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
8d00: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
8d10: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
8d20: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
8d30: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
8d40: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
8d50: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
8d60: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
8d70: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
8d80: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
8d90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8da0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8db0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8dc0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8dd0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8de0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8df0: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
8e00: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
8e10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8e20: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8e30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8e40: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8e50: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8e60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8e70: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8e80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
8e90: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
8ea0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
8eb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8ec0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
8ed0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
8ee0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8ef0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8f00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8f10: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8f20: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
8f30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8f40: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8f50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8f60: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8f70: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8f80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8f90: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8fa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8fb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8fc0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8fd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8fe0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8ff0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
9000: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9010: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
9020: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
9030: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
9040: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
9050: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9060: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
9070: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
9080: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9090: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
90a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
90b0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
90c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
90d0: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
90e0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
90f0: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
9100: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
9110: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
9120: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
9130: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
9140: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
9150: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
9160: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
9170: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
9180: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
9190: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
91a0: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
91b0: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
91c0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
91d0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
91e0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
91f0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
9200: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
9210: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
9220: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
9230: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9240: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
9250: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
9260: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
9270: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
9280: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9290: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
92a0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
92b0: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
92c0: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
92d0: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
92e0: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
92f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
9300: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
9310: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
9320: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
9330: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
9340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
9350: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
9360: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9370: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
9380: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75  .      char *zQu
9390: 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oted = sqlite3_m
93a0: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
93b0: 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   z);.      utf8_
93c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
93d0: 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  , zQuoted);.    
93e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
93f0: 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c  Quoted);.    }el
9400: 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
9410: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
9420: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
9430: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
9440: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
9450: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
9460: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  lSeparator);.  }
9470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9480: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
9490: 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65   the user presse
94a0: 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74  s Ctrl-C.*/.stat
94b0: 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70  ic void interrup
94c0: 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f  t_handler(int No
94d0: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
94e0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
94f0: 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed);.  seenInter
9500: 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65  rupt++;.  if( se
9510: 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20  enInterrupt>2 ) 
9520: 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67  exit(1);.  if( g
9530: 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65  lobalDb ) sqlite
9540: 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62  3_interrupt(glob
9550: 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64  alDb);.}..#if (d
9560: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
9570: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
9580: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
9590: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20  IN32_WCE)./*.** 
95a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
95b0: 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76  s for console ev
95c0: 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d  ents (e.g. Ctrl-
95d0: 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73  C) on Win32.*/.s
95e0: 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50  tatic BOOL WINAP
95f0: 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  I ConsoleCtrlHan
9600: 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77  dler(.  DWORD dw
9610: 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20  CtrlType /* One 
9620: 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56  of the CTRL_*_EV
9630: 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ENT constants */
9640: 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c  .){.  if( dwCtrl
9650: 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45  Type==CTRL_C_EVE
9660: 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72  NT ){.    interr
9670: 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a  upt_handler(0);.
9680: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
9690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
96a0: 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  LSE;.}.#endif..#
96b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
96c0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
96d0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
96e0: 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65  ".auth ON" is se
96f0: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
9700: 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
9710: 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  back is.** invok
9720: 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  ed.  It always r
9730: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
9740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9750: 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69  shellAuth(.  voi
9760: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a  d *pClientData,.
9770: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
9780: 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63  t char *zA1,.  c
9790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a  onst char *zA2,.
97a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
97b0: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
97c0: 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  *zA4.){.  ShellS
97d0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
97e0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
97f0: 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ta;.  static con
9800: 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f  st char *azActio
9810: 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20  n[] = { 0,.     
9820: 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20  "CREATE_INDEX", 
9830: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
9840: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
9850: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  "CREATE_TEMP_IND
9860: 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EX",.     "CREAT
9870: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  E_TEMP_TABLE",  
9880: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
9890: 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54  RIGGER",  "CREAT
98a0: 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  E_TEMP_VIEW",.  
98b0: 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47     "CREATE_TRIGG
98c0: 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41  ER",       "CREA
98d0: 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  TE_VIEW",       
98e0: 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20     "DELETE",.   
98f0: 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20    "DROP_INDEX", 
9900: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
9910: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
9920: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44    "DROP_TEMP_IND
9930: 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EX",.     "DROP_
9940: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
9950: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49    "DROP_TEMP_TRI
9960: 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f  GGER",    "DROP_
9970: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
9980: 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c   "DROP_TRIGGER",
9990: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56           "DROP_V
99a0: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  IEW",           
99b0: 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20   "INSERT",.     
99c0: 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20  "PRAGMA",       
99d0: 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20          "READ", 
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22  "SELECT",.     "
9a00: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20  TRANSACTION",   
9a10: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c         "UPDATE",
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9a30: 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44  ATTACH",.     "D
9a40: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20  ETACH",         
9a50: 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42        "ALTER_TAB
9a60: 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52  LE",          "R
9a70: 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41  EINDEX",.     "A
9a80: 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20  NALYZE",        
9a90: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54        "CREATE_VT
9aa0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44  ABLE",        "D
9ab0: 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20  ROP_VTABLE",.   
9ac0: 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20    "FUNCTION",   
9ad0: 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50            "SAVEP
9ae0: 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  OINT",          
9af0: 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20    "RECURSIVE".  
9b00: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  };.  int i;.  co
9b10: 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b  nst char *az[4];
9b20: 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a  .  az[0] = zA1;.
9b30: 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20    az[1] = zA2;. 
9b40: 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20   az[2] = zA3;.  
9b50: 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75  az[3] = zA4;.  u
9b60: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
9b70: 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20  t, "authorizer: 
9b80: 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70  %s", azAction[op
9b90: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
9ba0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61  <4; i++){.    ra
9bb0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
9bc0: 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61   " ");.    if( a
9bd0: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75  z[i] ){.      ou
9be0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
9bf0: 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  >out, az[i]);.  
9c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9c10: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
9c20: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  , "NULL");.    }
9c30: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
9c40: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
9c50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9c60: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
9c70: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68  *.** Print a sch
9c80: 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ema statement.  
9c90: 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d  Part of MODE_Sem
9ca0: 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74  i and MODE_Prett
9cb0: 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  y output..**.** 
9cc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
9cd0: 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54  verts some CREAT
9ce0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9cf0: 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61  ts for shadow ta
9d00: 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f  bles.** in FTS3/
9d10: 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20  4/5 into CREATE 
9d20: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
9d30: 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  STS statements..
9d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9d50: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46  rintSchemaLine(F
9d60: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
9d70: 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63  char *z, const c
9d80: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69  har *zTail){.  i
9d90: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
9da0: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
9db0: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
9dc0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9dd0: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
9de0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
9df0: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
9e00: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
9e10: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
9e20: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
9e30: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
9e40: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
9e50: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
9e60: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
9e70: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
9e80: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
9e90: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
9ea0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
9eb0: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
9ec0: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
9ed0: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
9ee0: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
9ef0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61  back routine tha
9f00: 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69  t the shell.** i
9f10: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
9f20: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
9f30: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
9f40: 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62   int shell_callb
9f50: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72  ack(.  void *pAr
9f60: 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  g,.  int nArg,  
9f70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9f80: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
9f90: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  s */.  char **az
9fa0: 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20  Arg,    /* Text 
9fb0: 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74 20 63  of each result c
9fc0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
9fd0: 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  **azCol,    /* C
9fe0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
9ff0: 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20 20 20   int *aiType    
a000: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65    /* Column type
a010: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
a020: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
a030: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
a040: 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a 41  pArg;..  if( azA
a050: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
a060: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 63  ;.  switch( p->c
a070: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Mode ){.    case
a080: 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20   MODE_Line: {.  
a090: 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20      int w = 5;. 
a0a0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
a0b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
a0c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
a0d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a0e0: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
a0f0: 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  30(azCol[i] ? az
a100: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
a110: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20        if( len>w 
a120: 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ) w = len;.     
a130: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
a140: 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f 70  cnt++>0 ) utf8_p
a150: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
a160: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
a170: 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tor);.      for(
a180: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
a190: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
a1a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a1b0: 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c 20 61  *s = %s%s", w, a
a1c0: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
a1d0: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
a1e0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
a1f0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e  ->nullValue, p->
a200: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
a210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a230: 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a  se MODE_Explain:
a240: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
a250: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 73  olumn: {.      s
a260: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
a270: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 5b 5d  aExplainWidths[]
a280: 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34 2c   = {4, 13, 4, 4,
a290: 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b 0a   4, 13, 2, 13};.
a2a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
a2b0: 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  *colWidth;.     
a2c0: 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20 20   int showHdr;.  
a2d0: 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53 65 70      char *rowSep
a2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
a2f0: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d  Mode==MODE_Colum
a300: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c  n ){.        col
a310: 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57 69  Width = p->colWi
a320: 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73 68 6f  dth;.        sho
a330: 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  wHdr = p->showHe
a340: 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 72 6f  ader;.        ro
a350: 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70  wSep = p->rowSep
a360: 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d 65  arator;.      }e
a370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c  lse{.        col
a380: 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61 69 6e  Width = aExplain
a390: 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20 20 20  Widths;.        
a3a0: 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20 20  showHdr = 1;.   
a3b0: 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 53 45       rowSep = SE
a3c0: 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20  P_Row;.      }. 
a3d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
a3e0: 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  +==0 ){.        
a3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a400: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a410: 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20   int w, n;.     
a420: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
a430: 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
a440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a450: 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69 5d   w = colWidth[i]
a460: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a470: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  e{.            w
a480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a490: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
a4a0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
a4b0: 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68      w = strlenCh
a4c0: 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  ar(azCol[i] ? az
a4d0: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
a4e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
a4f0: 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20 20 20  10 ) w = 10;.   
a500: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72           n = str
a510: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20 26 26  lenChar(azArg &&
a520: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
a530: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
a540: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
a550: 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20    if( w<n ) w = 
a560: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
a570: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
a580: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
a590: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
a5a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61          p->actua
a5b0: 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20  lWidth[i] = w;. 
a5c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a5d0: 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72       if( showHdr
a5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a5f0: 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74  utf8_width_print
a600: 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f  (p->out, w, azCo
a610: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[i]);.         
a620: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
a630: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d  ->out, "%s", i==
a640: 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20  nArg-1 ? rowSep 
a650: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
a660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a670: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48         if( showH
a680: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
a690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a6a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a6b0: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
a6c0: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
a6d0: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
a6e0: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a6f0: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
a700: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
a720: 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a  ( w<0 ) w = -w;.
a730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
a740: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
a750: 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    w = 10;.      
a760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a770: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a780: 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73  p->out,"%-*.*s%s
a790: 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20  ",w,w,.         
a7a0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d            "-----
a7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7e0: 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20  -----".         
a7f0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d            "-----
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a830: 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20  -----",.        
a840: 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e              i==n
a850: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
a860: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
a870: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a880: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a890: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
a8a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a8b0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
a8c0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
a8d0: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
a8e0: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
a8f0: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a900: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
a910: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
a920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a930: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
a940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a950: 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  f( p->cMode==MOD
a960: 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41  E_Explain && azA
a970: 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 43  rg[i] && strlenC
a980: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20  har(azArg[i])>w 
a990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 20 3d  ){.          w =
a9a0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
a9b0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
a9c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
a9d0: 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74  1 && p->aiIndent
a9e0: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
a9f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
aa00: 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64  >iIndent<p->nInd
aa10: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
aa20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
aa30: 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20 70  ->out, "%*.s", p
aa40: 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69 49  ->aiIndent[p->iI
aa50: 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20 20  ndent], "");.   
aa60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aa70: 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b     p->iIndent++;
aa80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa90: 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72     utf8_width_pr
aaa0: 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61  int(p->out, w, a
aab0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
aac0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
aad0: 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  e);.        utf8
aae0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
aaf0: 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  "%s", i==nArg-1 
ab00: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
ab10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ab20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ab30: 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a   case MODE_Semi:
ab40: 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20   {   /* .schema 
ab50: 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  and .fullschema 
ab60: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
ab70: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
ab80: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30 5d  p->out, azArg[0]
ab90: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
aba0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
abb0: 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65 74 74   case MODE_Prett
abc0: 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d 61  y: {  /* .schema
abd0: 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61   and .fullschema
abe0: 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20 2a   with --indent *
abf0: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  /.      char *z;
ac00: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
ac10: 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d      int nParen =
ac20: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
ac30: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  End = 0;.      c
ac40: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  har c;.      int
ac50: 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20   nLine = 0;.    
ac60: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
ac70: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  1 );.      if( a
ac80: 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72 65  zArg[0]==0 ) bre
ac90: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ak;.      if( sq
aca0: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
acb0: 52 45 41 54 45 20 56 49 45 57 25 22 2c 20 61 7a  REATE VIEW%", az
acc0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
acd0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
ace0: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
acf0: 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b 30 5d  TRIG%", azArg[0]
ad00: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  , 0)==0.      ){
ad10: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
ad20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ad30: 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  ;\n", azArg[0]);
ad40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ad50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20        }.      z 
ad60: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
ad70: 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d  f("%s", azArg[0]
ad80: 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  );.      j = 0;.
ad90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 49        for(i=0; I
ada0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sSpace(z[i]); i+
adb0: 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b  +){}.      for(;
adc0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
add0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
ade0: 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
adf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
ae00: 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a  j-1]=='\r' ) z[j
ae10: 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  -1] = '\n';.    
ae20: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
ae30: 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a  e(z[j-1]) || z[j
ae40: 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69  -1]=='(' ) conti
ae50: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nue;.        }el
ae60: 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27 20 7c  se if( (c=='(' |
ae70: 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30  | c==')') && j>0
ae80: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
ae90: 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1]) ){.         
aea0: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j--;.        }.
aeb0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
aec0: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
aed0: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
aee0: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
aef0: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
af00: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[j] = 0;.      
af10: 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e  if( strlen30(z)>
af20: 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20 20 66  =79 ){.        f
af30: 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a  or(i=j=0; (c = z
af40: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
af50: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
af60: 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cEnd ){.        
af70: 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20      cEnd = 0;.  
af80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
af90: 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27  ( c=='"' || c=='
afa0: 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b  \'' || c=='`' ){
afb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
afc0: 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  d = c;.         
afd0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
afe0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
aff0: 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20   cEnd = ']';.   
b000: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b010: 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20   c=='(' ){.     
b020: 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b         nParen++;
b030: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b040: 20 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20   if( c==')' ){. 
b050: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
b060: 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n--;.           
b070: 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20   if( nLine>0 && 
b080: 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30  nParen==0 && j>0
b090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b0a0: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
b0b0: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
b0c0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20   "\n");.        
b0d0: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
b0e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b100: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20   z[j++] = c;.   
b110: 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65         if( nPare
b120: 6e 3d 3d 31 20 26 26 20 28 63 3d 3d 27 28 27 20  n==1 && (c=='(' 
b130: 7c 7c 20 63 3d 3d 27 2c 27 20 7c 7c 20 63 3d 3d  || c==',' || c==
b140: 27 5c 6e 27 29 20 29 7b 0a 20 20 20 20 20 20 20  '\n') ){.       
b150: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
b160: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
b170: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
b180: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
b190: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
b1a0: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
b1b0: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
b1c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
b1d0: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
b1e0: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
b1f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
b210: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
b220: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
b230: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
b240: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
b250: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
b260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b270: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
b280: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
b290: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
b2a0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
b2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b2c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
b2e0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b2f0: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
b300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b310: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
b320: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
b330: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b340: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b350: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b360: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b370: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b380: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b390: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
b3a0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
b3b0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
b3c0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
b3d0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b3e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b3f0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
b400: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
b410: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b420: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b430: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b440: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b450: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
b460: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b470: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
b480: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
b490: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b4b0: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
b4c0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b4d0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
b4e0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
b4f0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b500: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
b510: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b520: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b530: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
b540: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
b550: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
b560: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
b570: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
b580: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
b590: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b5a0: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
b5b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
b5c0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b5d0: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
b5e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
b5f0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
b600: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b610: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
b620: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b630: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b640: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b650: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
b660: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
b670: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
b680: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
b690: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
b6a0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
b6b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b6c0: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
b6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
b6e0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
b6f0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
b700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b710: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
b720: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b730: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
b740: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
b750: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b760: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
b770: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
b780: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
b790: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
b7a0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
b7b0: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
b7c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b7d0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
b7e0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
b7f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
b800: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b810: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
b820: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
b830: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
b840: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b850: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b860: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b870: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
b880: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
b890: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
b8a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
b8b0: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
b8c0: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
b8d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
b8e0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
b8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
b900: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b910: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
b920: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
b930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b940: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
b950: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
b960: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
b970: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
b980: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
b990: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
b9a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b9b0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
b9c0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
b9d0: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
b9e0: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
b9f0: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
ba00: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
ba10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
ba20: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
ba30: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
ba40: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
ba50: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
ba60: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ba70: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
ba80: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
ba90: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
baa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bab0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bac0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
bad0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
bae0: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
baf0: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
bb00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bb10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
bb20: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
bb30: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
bb40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
bb50: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb60: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
bb70: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
bb80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
bb90: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
bba0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
bbb0: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
bbc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bbd0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bbe0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
bbf0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc00: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
bc10: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
bc20: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
bc40: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
bc50: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
bc60: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
bc70: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
bc80: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bc90: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
bca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
bcb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
bcc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
bcd0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bce0: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
bcf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bd00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bd10: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bd20: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
bd30: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
bd40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bd50: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bd60: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
bd70: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
bd80: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
bd90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
bda0: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
bdb0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
bdc0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
bdd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
bde0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bdf0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
be00: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
be10: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
be20: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
be30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
be40: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
be50: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
be60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
be70: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
be80: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
be90: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
bea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
beb0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
bec0: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
bed0: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
bee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bef0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bf00: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
bf10: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
bf20: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
bf30: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bf40: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
bf50: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
bf60: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
bf70: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
bf80: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
bf90: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
bfa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
bfb0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
bfc0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
bfd0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
bfe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
bff0: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
c000: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
c010: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
c020: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
c030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c040: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c050: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
c060: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
c070: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
c080: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
c090: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
c0a0: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
c0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
c0c0: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
c0d0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
c0e0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
c0f0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
c100: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
c110: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
c120: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
c130: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
c140: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
c150: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c160: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
c170: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
c180: 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46  se if( ShellHasF
c190: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
c1a0: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
c1b0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
c1c0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c1d0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c1e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1f0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
c200: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
c210: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
c220: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
c230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
c240: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c250: 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  );\n");.      br
c260: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c270: 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20  ase MODE_Quote: 
c280: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
c290: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
c2a0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d      if( p->cnt==
c2b0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
c2c0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
c2d0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c2e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
c2f0: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
c300: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
c310: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
c320: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c330: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
c340: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c350: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
c360: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
c370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c380: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
c390: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c3a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
c3b0: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
c3c0: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
c3d0: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
c3e0: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
c3f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c400: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
c410: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
c420: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c430: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
c440: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
c450: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
c460: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
c470: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
c480: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
c490: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
c4a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c4b0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c4c0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
c4d0: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
c4e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c4f0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
c500: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
c510: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
c520: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
c530: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
c540: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
c550: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
c560: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
c570: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
c580: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
c5a0: 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21  nprintf(50,z,"%!
c5b0: 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20  .20g", r);.     
c5c0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c5d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
c5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c5f0: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
c600: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
c610: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
c620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
c630: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
c640: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c650: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
c660: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
c670: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
c680: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
c690: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c6a0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
c6b0: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
c6c0: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
c6d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c6e0: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
c6f0: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
c700: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c710: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
c720: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
c730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c740: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
c750: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
c760: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
c770: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
c780: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c790: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  t,"\n");.      b
c7a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c7b0: 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a  case MODE_Ascii:
c7c0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
c7d0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
c7e0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
c7f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c800: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c810: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
c820: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c830: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
c840: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c850: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c860: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
c870: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
c880: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
c890: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
c8a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c8b0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
c8c0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
c8d0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
c8e0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
c8f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c900: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c910: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
c920: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c930: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
c940: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74  tor);.        ut
c950: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c960: 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f  ,"%s",azArg[i] ?
c970: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
c980: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
c990: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c9a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c9b0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
c9c0: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
c9d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c9e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c9f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
ca00: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
ca10: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  at the SQLite li
ca20: 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73  brary.** invokes
ca30: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
ca40: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
ca50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
ca60: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
ca70: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
ca80: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
ca90: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20   **azCol){.  /* 
caa0: 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68  since we don't h
cab0: 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63  ave type info, c
cac0: 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61  all the shell_ca
cad0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55  llback with a NU
cae0: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65  LL value */.  re
caf0: 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62  turn shell_callb
cb00: 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20  ack(pArg, nArg, 
cb10: 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55  azArg, azCol, NU
cb20: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LL);.}../*.** Th
cb30: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
cb40: 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  ck routine from 
cb50: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74  sqlite3_exec() t
cb60: 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a  hat appends all.
cb70: 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74  ** output onto t
cb80: 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c  he end of a Shel
cb90: 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lText object..*/
cba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74  .static int capt
cbb0: 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
cbc0: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
cbd0: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
cbe0: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29  zArg, char **az)
cbf0: 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70  {.  ShellText *p
cc00: 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70   = (ShellText*)p
cc10: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
cc20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cc30: 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72  (az);.  if( azAr
cc40: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
cc50: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70  .  if( p->n ) ap
cc60: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c  pendText(p, "|",
cc70: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
cc80: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
cc90: 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64    if( i ) append
cca0: 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b  Text(p, ",", 0);
ccb0: 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69  .    if( azArg[i
ccc0: 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  ] ) appendText(p
ccd0: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  , azArg[i], 0);.
cce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ccf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
cd00: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
cd10: 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
cd20: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
cd30: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
cd40: 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74  void createSelft
cd50: 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74  estTable(ShellSt
cd60: 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ate *p){.  char 
cd70: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
cd80: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
cd90: 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49  db,.    "SAVEPOI
cda0: 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  NT selftest_init
cdb0: 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45  ;\n".    "CREATE
cdc0: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
cdd0: 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e  ISTS selftest(\n
cde0: 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54  ".    "  tno INT
cdf0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ce00: 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e  ,\n"   /* Test n
ce10: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20  umber */.    "  
ce20: 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  op TEXT,\n"     
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce40: 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f   Operator:  memo
ce50: 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63   run */.    "  c
ce60: 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  md TEXT,\n"     
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce80: 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a  Command text */.
ce90: 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c      "  ans TEXT\
cea0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
ceb0: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
cec0: 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29  answer */.    ")
ced0: 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  ;".    "CREATE T
cee0: 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c  EMP TABLE [_shel
cef0: 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61  l$self](op,cmd,a
cf00: 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ns);\n".    "INS
cf10: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
cf20: 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c  $self](rowid,op,
cf30: 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56  cmd)\n".    "  V
cf40: 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28  ALUES(coalesce((
cf50: 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29  SELECT (max(tno)
cf60: 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65  +100)/10 FROM se
cf70: 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a  lftest),10),\n".
cf80: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d      "         'm
cf90: 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65  emo','Tests gene
cfa0: 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27  rated by --init'
cfb0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
cfc0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
cfd0: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
cfe0: 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a  ELECT 'run',\n".
cff0: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
d000: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
d010: 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ''SELECT type,na
d020: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
d030: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
d060: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
d070: 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  2'',224))',\n". 
d080: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
d090: 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74  _query('SELECT t
d0a0: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
d0b0: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
d0e0: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
d0f0: 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20  ',224));\n".    
d100: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
d110: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
d120: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
d130: 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  ',".    "    'SE
d140: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
d150: 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46  ery(''SELECT * F
d160: 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20  ROM \"' ||".    
d170: 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  "        printf(
d180: 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c  '%w',name) || '\
d190: 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c  " NOT INDEXED'',
d1a0: 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
d1b0: 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
d1c0: 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43  ry(printf('SELEC
d1d0: 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
d1e0: 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d  NOT INDEXED',nam
d1f0: 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20  e),224))\n".    
d200: 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  "  FROM (\n".   
d210: 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d   "    SELECT nam
d220: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
d230: 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ster\n".    "   
d240: 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61    WHERE type='ta
d250: 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  ble'\n".    "   
d260: 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73      AND name<>'s
d270: 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20  elftest'\n".    
d280: 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c  "       AND coal
d290: 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
d2a0: 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e  >0\n".    "  )\n
d2b0: 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
d2c0: 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49   name;\n".    "I
d2d0: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
d2e0: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
d2f0: 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c  "  VALUES('run',
d300: 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
d310: 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c  y_check','ok');\
d320: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
d330: 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f  NTO selftest(tno
d340: 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20  ,op,cmd,ans)".  
d350: 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69    "  SELECT rowi
d360: 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20  d*10,op,cmd,ans 
d370: 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  FROM [_shell$sel
d380: 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50  f];\n".    "DROP
d390: 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73   TABLE [_shell$s
d3a0: 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c  elf];".    ,0,0,
d3b0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
d3c0: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
d3d0: 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
d3e0: 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e  rr, "SELFTEST in
d3f0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
d400: 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  lure: %s\n", zEr
d410: 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
d420: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
d430: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d440: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
d450: 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e  EASE selftest_in
d460: 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a  it",0,0,0);.}...
d470: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
d480: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
d490: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
d4a0: 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
d4b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
d4c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
d4d0: 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
d4e0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
d4f0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
d500: 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
d510: 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
d520: 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
d530: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
d540: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
d550: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  , n;.  char cQuo
d560: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
d570: 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
d580: 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
d590: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
d5a0: 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
d5b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
d5c0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
d5d0: 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71  rn;.  cQuote = q
d5e0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
d5f0: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
d600: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51  zName);.  if( cQ
d610: 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b  uote ) n += n+2;
d620: 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
d630: 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
d640: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
d650: 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
d660: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
d670: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
d680: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
d690: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20  ;.  }.  n = 0;. 
d6a0: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
d6b0: 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
d6c0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
d6d0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b  i]; i++){.    z[
d6e0: 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b  n++] = zName[i];
d6f0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69  .    if( zName[i
d700: 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  ]==cQuote ) z[n+
d710: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d  +] = cQuote;.  }
d720: 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
d730: 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
d740: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
d750: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
d760: 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74   query statement
d770: 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72   that will gener
d780: 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20  ate SQL output. 
d790: 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65   Print.** the re
d7a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f  sult columns, co
d7b0: 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f  mma-separated, o
d7c0: 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65  n a line and the
d7d0: 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63  n add a.** semic
d7e0: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20  olon terminator 
d7f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
d800: 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  at line..**.** I
d810: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d820: 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64  columns is 1 and
d830: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e   that column con
d840: 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a  tains text "--".
d850: 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
d860: 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61  e semicolon on a
d870: 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20   separate line. 
d880: 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a   That way, if a.
d890: 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20  ** "--" comment 
d8a0: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e  occurs at the en
d8b0: 64 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  d of the stateme
d8c0: 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  nt, the comment.
d8d0: 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65  ** won't consume
d8e0: 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74   the semicolon t
d8f0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
d900: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62  atic int run_tab
d910: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  le_dump_query(. 
d920: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
d930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
d940: 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ry context */.  
d950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
d960: 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45  ect,     /* SELE
d970: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
d980: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
d990: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
d9a0: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a  *zFirstRow    /*
d9b0: 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69   Print before fi
d9c0: 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20  rst row, if not 
d9d0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
d9e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
d9f0: 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ct;.  int rc;.  
da00: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69  int nResult;.  i
da10: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
da20: 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71  ar *z;.  rc = sq
da30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
da40: 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c  (p->db, zSelect,
da50: 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30   -1, &pSelect, 0
da60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
da70: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65  ITE_OK || !pSele
da80: 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ct ){.    utf8_p
da90: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
daa0: 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
dab0: 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
dac0: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
dad0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
dae0: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
daf0: 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
db00: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
db10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
db20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
db30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
db40: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65  (pSelect);.  nRe
db50: 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  sult = sqlite3_c
db60: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c  olumn_count(pSel
db70: 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ect);.  while( r
db80: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
db90: 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52  .    if( zFirstR
dba0: 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  ow ){.      utf8
dbb0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
dbc0: 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29  "%s", zFirstRow)
dbd0: 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f  ;.      zFirstRo
dbe0: 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  w = 0;.    }.   
dbf0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72   z = (const char
dc00: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
dc10: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30  _text(pSelect, 0
dc20: 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
dc30: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dc40: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   z);.    for(i=1
dc50: 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
dc60: 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
dc70: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25  intf(p->out, ",%
dc80: 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s", sqlite3_colu
dc90: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
dca0: 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i));.    }.    
dcb0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
dcc0: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  ";.    while( z[
dcd0: 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27  0] && (z[0]!='-'
dce0: 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29   || z[1]!='-') )
dcf0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
dd00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  0] ){.      raw_
dd10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
dd20: 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c  \n;\n");.    }el
dd30: 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
dd40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
dd50: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n");.    }.    r
dd60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
dd70: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (pSelect);.  }. 
dd80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
dd90: 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b  nalize(pSelect);
dda0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ddb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38  E_OK ){.    utf8
ddc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ddd0: 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
dde0: 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
ddf0: 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
de00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
de10: 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
de20: 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
de30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
de40: 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a   p->nErr++;.  }.
de50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
de60: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
de70: 70 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66  pace and save of
de80: 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20  f current error 
de90: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
dea0: 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72  c char *save_err
deb0: 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20  _msg(.  sqlite3 
dec0: 2a 64 62 20 20 20 20 20 20 20 20 20 20 20 20 2f  *db            /
ded0: 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
dee0: 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ery */.){.  int 
def0: 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c  nErrMsg = 1+strl
df00: 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72  en30(sqlite3_err
df10: 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72  msg(db));.  char
df20: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69   *zErrMsg = sqli
df30: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72  te3_malloc64(nEr
df40: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72  rMsg);.  if( zEr
df50: 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63  rMsg ){.    memc
df60: 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  py(zErrMsg, sqli
df70: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
df80: 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  nErrMsg);.  }.  
df90: 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a  return zErrMsg;.
dfa0: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75  }..#ifdef __linu
dfb0: 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  x__./*.** Attemp
dfc0: 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f  t to display I/O
dfd0: 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20   stats on Linux 
dfe0: 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f  using /proc/PID/
dff0: 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  io.*/.static voi
e000: 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f  d displayLinuxIo
e010: 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29  Stats(FILE *out)
e020: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
e030: 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73  char z[200];.  s
e040: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e050: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f  sizeof(z), z, "/
e060: 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74  proc/%d/io", get
e070: 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66  pid());.  in = f
e080: 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20  open(z, "rb");. 
e090: 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
e0a0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  urn;.  while( fg
e0b0: 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29  ets(z, sizeof(z)
e0c0: 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  , in)!=0 ){.    
e0d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
e0e0: 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  uct {.      cons
e0f0: 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
e100: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
e110: 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d  ar *zDesc;.    }
e120: 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20   aTrans[] = {.  
e130: 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c      { "rchar: ",
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 22 42 79 74 65 73 20 72 65 63 65 69 76 65    "Bytes receive
e160: 64 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c  d by read():" },
e170: 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a  .      { "wchar:
e180: 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
e190: 20 20 20 20 20 22 42 79 74 65 73 20 73 65 6e 74       "Bytes sent
e1a0: 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20   to write():"   
e1b0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73   },.      { "sys
e1c0: 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  cr: ",          
e1d0: 20 20 20 20 20 20 20 20 22 52 65 61 64 28 29 20          "Read() 
e1e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
e1f0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e200: 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20  syscw: ",       
e210: 20 20 20 20 20 20 20 20 20 20 20 22 57 72 69 74             "Writ
e220: 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  e() system calls
e230: 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  :"     },.      
e240: 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22  { "read_bytes: "
e250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ,             "B
e260: 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73  ytes read from s
e270: 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20  torage:"  },.   
e280: 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65     { "write_byte
e290: 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
e2a0: 20 22 42 79 74 65 73 20 77 72 69 74 74 65 6e 20   "Bytes written 
e2b0: 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a  to storage:" },.
e2c0: 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c        { "cancell
e2d0: 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20  ed_write_bytes: 
e2e0: 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77  ",  "Cancelled w
e2f0: 72 69 74 65 20 62 79 74 65 73 3a 22 20 20 20 20  rite bytes:"    
e300: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
e310: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e320: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
e330: 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  rans); i++){.   
e340: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
e350: 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  n30(aTrans[i].zP
e360: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69  attern);.      i
e370: 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e  f( strncmp(aTran
e380: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a  s[i].zPattern, z
e390: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
e3a0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
e3b0: 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20  ut, "%-36s %s", 
e3c0: 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c  aTrans[i].zDesc,
e3d0: 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20   &z[n]);.       
e3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e3f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
e400: 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66  se(in);.}.#endif
e410: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
e420: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
e430: 20 73 74 61 74 75 73 20 75 73 69 6e 67 20 36 34   status using 64
e440: 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  -bit values..*/.
e450: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
e460: 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53  layStatLine(.  S
e470: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20  hellState *p,   
e480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e490: 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f  shell context */
e4a0: 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  .  char *zLabel,
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e4c0: 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f  Label for this o
e4d0: 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61  ne line */.  cha
e4e0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20  r *zFormat,     
e4f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74         /* Format
e500: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
e510: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73  */.  int iStatus
e520: 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Ctrl,          /
e530: 2a 20 57 68 69 63 68 20 73 74 61 74 75 73 20 74  * Which status t
e540: 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69  o display */.  i
e550: 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
e560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e570: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
e580: 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ats */.){.  sqli
e590: 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d  te3_int64 iCur =
e5a0: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   -1;.  sqlite3_i
e5b0: 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31  nt64 iHiwtr = -1
e5c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63  ;.  int i, nPerc
e5d0: 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  ent;.  char zLin
e5e0: 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  e[200];.  sqlite
e5f0: 33 5f 73 74 61 74 75 73 36 34 28 69 53 74 61 74  3_status64(iStat
e600: 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26  usCtrl, &iCur, &
e610: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
e620: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72  .  for(i=0, nPer
e630: 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b  cent=0; zFormat[
e640: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
e650: 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25  ( zFormat[i]=='%
e660: 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a  ' ) nPercent++;.
e670: 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65    }.  if( nPerce
e680: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>1 ){.    sqli
e690: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
e6a0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e  eof(zLine), zLin
e6b0: 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72  e, zFormat, iCur
e6c0: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c  , iHiwtr);.  }el
e6d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
e6e0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e6f0: 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
e700: 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b  Format, iHiwtr);
e710: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
e720: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73  f(p->out, "%-36s
e730: 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20   %s\n", zLabel, 
e740: 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zLine);.}../*.**
e750: 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   Display memory 
e760: 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stats..*/.static
e770: 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61   int display_sta
e780: 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
e790: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
e7a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
e7b0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
e7c0: 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20  lState *pArg,   
e7d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
e7e0: 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
e7f0: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
e820: 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
e830: 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  ){.  int iCur;. 
e840: 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20   int iHiwtr;..  
e850: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
e860: 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69 73  ->out ){.    dis
e870: 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
e880: 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a  g, "Memory Used:
e890: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
e8a0: 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
e8b0: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
e8c0: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52  _MEMORY_USED, bR
e8d0: 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c  eset);.    displ
e8e0: 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
e8f0: 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73   "Number of Outs
e900: 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69  tanding Allocati
e910: 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ons:",.       "%
e920: 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
e930: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
e940: 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
e950: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 41  set);.    if( pA
e960: 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
e970: 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
e980: 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  ){.      display
e990: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
e9a0: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
e9b0: 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20   Pages Used:",. 
e9c0: 20 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d          "%lld (m
e9d0: 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c  ax %lld) pages",
e9e0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
e9f0: 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62  AGECACHE_USED, b
ea00: 52 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Reset);.    }.  
ea10: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
ea20: 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
ea30: 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
ea40: 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20  ow Bytes:",.    
ea50: 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
ea60: 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
ea70: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
ea80: 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52  CHE_OVERFLOW, bR
ea90: 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c  eset);.    displ
eaa0: 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
eab0: 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
eac0: 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22  tion:",.       "
ead0: 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
eae0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
eaf0: 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
eb00: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
eb10: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
eb20: 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
eb30: 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20  ation:",.       
eb40: 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
eb50: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
eb60: 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73  CACHE_SIZE, bRes
eb70: 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  et);.#ifdef YYTR
eb80: 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
eb90: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
eba0: 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70  Line(pArg, "Deep
ebb0: 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b  est Parser Stack
ebc0: 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
ebd0: 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51   (max %lld)", SQ
ebe0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53  LITE_STATUS_PARS
ebf0: 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74  ER_STACK, bReset
ec00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
ec10: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
ec20: 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b 0a  g->out && db ){.
ec30: 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
ec40: 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
ec50: 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20  Lookaside ){.   
ec60: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
ec70: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
ec80: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
ec90: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
eca0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
ecb0: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
ecc0: 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
ecd0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
ece0: 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
ecf0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
ed10: 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
ed20: 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
ed30: 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
ed40: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
ed50: 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
ed60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
ed70: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
ed80: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
ed90: 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20  KASIDE_HIT,.    
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
edc0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
edd0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
ede0: 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73  rg->out, "Succes
edf0: 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61  sful lookaside a
ee00: 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25  ttempts:       %
ee10: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
ee20: 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
ee30: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
ee40: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
ee50: 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
ee60: 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20  DE_MISS_SIZE,.  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
ee90: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
eea0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
eeb0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
eec0: 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
eed0: 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
eee0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
eef0: 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
ef00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
ef10: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
ef20: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
ef30: 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a  SIDE_MISS_FULL,.
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
ef60: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
ef70: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
ef80: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
ef90: 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
efa0: 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20   due to OOM:    
efb0: 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
efc0: 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
efd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
efe0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
eff0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
f000: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
f010: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
f020: 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
f030: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
f040: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
f050: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
f060: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
f080: 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
f090: 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
f0a0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f0b0: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f0c0: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f0d0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f0e0: 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72  CACHE_HIT, &iCur
f0f0: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
f100: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f110: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
f120: 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
f140: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
f150: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f160: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f170: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f180: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
f190: 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
f1a0: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
f1b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f1c0: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
f1d0: 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
f1f0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
f200: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f210: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f220: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f230: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
f240: 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
f250: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
f260: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f270: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
f280: 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f2b0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f2c0: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f2d0: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f2e0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f2f0: 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
f300: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
f310: 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
f320: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f330: 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
f340: 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
f350: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
f360: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
f370: 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
f380: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
f390: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
f3a0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
f3b0: 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
f3c0: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
f3d0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
f3e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
f3f0: 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
f400: 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
f410: 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
f420: 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
f430: 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
f440: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
f450: 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26  Arg->out && db &
f460: 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b  & pArg->pStmt ){
f470: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
f480: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
f490: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
f4a0: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
f4b0: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20  ULLSCAN_STEP,.  
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65               bRe
f4e0: 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
f4f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f500: 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f530: 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
f540: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
f550: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
f560: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f570: 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
f580: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
f590: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74  pArg->out, "Sort
f5a0: 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20   Operations:    
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
f5d0: 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
f5e0: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
f5f0: 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
f600: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
f610: 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a  OINDEX,bReset);.
f620: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f630: 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69  Arg->out, "Autoi
f640: 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20  ndex Inserts:   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f670: 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
f680: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
f690: 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
f6a0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
f6b0: 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  TEP, bReset);.  
f6c0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
f6d0: 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c  g->out, "Virtual
f6e0: 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20   Machine Steps: 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
f700: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a  \n", iCur);.  }.
f710: 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
f720: 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78  _.  displayLinux
f730: 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75  IoStats(pArg->ou
f740: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  t);.#endif..  /*
f750: 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74   Do not remove t
f760: 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64  his machine read
f770: 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78  able comment: ex
f780: 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74  tra-stats-output
f790: 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75  -here */..  retu
f7a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
f7b0: 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74  isplay scan stat
f7c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
f7d0: 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74  d display_scanst
f7e0: 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ats(.  sqlite3 *
f7f0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
f800: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
f810: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
f820: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
f830: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
f840: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
f850: 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a  hellState */.){.
f860: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
f870: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
f880: 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50  TATUS.  UNUSED_P
f890: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
f8a0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f8b0: 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20  (pArg);.#else.  
f8c0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b  int i, k, n, mx;
f8d0: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
f8e0: 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
f8f0: 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d  -- scanstats ---
f900: 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20  -----\n");.  mx 
f910: 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  = 0;.  for(k=0; 
f920: 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20  k<=mx; k++){.   
f930: 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70   double rEstLoop
f940: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28   = 1.0;.    for(
f950: 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a  i=n=0; 1; i++){.
f960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
f970: 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53  mt *p = pArg->pS
f980: 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tmt;.      sqlit
f990: 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20  e3_int64 nLoop, 
f9a0: 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f  nVisit;.      do
f9b0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20  uble rEst;.     
f9c0: 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20   int iSid;.     
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
f9e0: 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28  plain;.      if(
f9f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
fa00: 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
fa10: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
fa20: 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c  LOOP, (void*)&nL
fa30: 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oop) ){.        
fa40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
fa50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
fa60: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
fa70: 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
fa80: 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f  AT_SELECTID, (vo
fa90: 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20  id*)&iSid);.    
faa0: 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20    if( iSid>mx ) 
fab0: 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20  mx = iSid;.     
fac0: 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63   if( iSid!=k ) c
fad0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
fae0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
faf0: 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64     rEstLoop = (d
fb00: 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20  ouble)nLoop;.   
fb10: 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72       if( k>0 ) r
fb20: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
fb30: 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73  out, "-------- s
fb40: 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  ubquery %d -----
fb50: 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20  --\n", k);.     
fb60: 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
fb70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
fb80: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
fb90: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
fba0: 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a  T_NVISIT, (void*
fbb0: 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20  )&nVisit);.     
fbc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
fbd0: 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
fbe0: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
fbf0: 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74  ST, (void*)&rEst
fc00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fc10: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fc20: 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43  (p, i, SQLITE_SC
fc30: 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20  ANSTAT_EXPLAIN, 
fc40: 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e  (void*)&zExplain
fc50: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
fc60: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
fc70: 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22  "Loop %2d: %s\n"
fc80: 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a  , n, zExplain);.
fc90: 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a        rEstLoop *
fca0: 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61  = rEst;.      ra
fcb0: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
fcc0: 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20  ut,.          " 
fcd0: 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d          nLoop=%-
fce0: 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64  8lld nRow=%-8lld
fcf0: 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65   estRow=%-8lld e
fd00: 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c  stRow/Loop=%-8g\
fd10: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c  n",.          nL
fd20: 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71  oop, nVisit, (sq
fd30: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73  lite3_int64)(rEs
fd40: 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74  tLoop+0.5), rEst
fd50: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
fd60: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
fd70: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd90: 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65  --------\n");.#e
fda0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ndif.}../*.** Pa
fdb0: 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20  rameter azArray 
fdc0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f  points to a zero
fdd0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61  -terminated arra
fde0: 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53  y of strings. zS
fdf0: 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  tr.** points to 
fe00: 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72  a single nul-ter
fe10: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
fe20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fe30: 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71  if zStr.** is eq
fe40: 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ual, according t
fe50: 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61  o strcmp(), to a
fe60: 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ny of the string
fe70: 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a  s in the array..
fe80: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
fe90: 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
fea0: 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f  atic int str_in_
feb0: 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72  array(const char
fec0: 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
fed0: 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20  ar **azArray){. 
fee0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
fef0: 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69  0; azArray[i]; i
ff00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
ff10: 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41  strcmp(zStr, azA
ff20: 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72  rray[i]) ) retur
ff30: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
ff40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
ff50: 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d   compiled statem
ff60: 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73  ent pSql appears
ff70: 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49   to be an EXPLAI
ff80: 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c  N statement, all
ff90: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70  ocate.** and pop
ffa0: 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53  ulate the ShellS
ffb0: 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20  tate.aiIndent[] 
ffc0: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e  array with the n
ffd0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63  umber of.** spac
ffe0: 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73  es each opcode s
fff0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
10000 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f  d before it is o
10010 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utput..**.** The
10020 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73   indenting rules
10030 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
10040 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74  * For each "Next
10050 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78  ", "Prev", "VNex
10060 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e  t" or "VPrev" in
10070 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e  struction, inden
10080 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f  t.**       all o
10090 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75  pcodes that occu
100a0 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32  r between the p2
100b0 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
100c0 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  n and the opcode
100d0 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66  .**       itself
100e0 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a   by 2 spaces..**
100f0 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61  .**     * For ea
10100 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68  ch "Goto", if th
10110 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  e jump destinati
10120 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e  on is earlier in
10130 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20   the program.** 
10140 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f        and ends o
10150 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20  n one of:.**    
10160 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65        Yield  See
10170 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77  kGt  SeekLt  Row
10180 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a  SetRead  Rewind.
10190 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74  **       or if t
101a0 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20  he P1 parameter 
101b0 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f  is one instead o
101c0 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20  f zero,.**      
101d0 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c   then indent all
101e0 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e   opcodes between
101f0 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73   the earlier ins
10200 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  truction.**     
10210 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20    and "Goto" by 
10220 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  2 spaces..*/.sta
10230 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
10240 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68  _data_prepare(Sh
10250 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c  ellState *p, sql
10260 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29  ite3_stmt *pSql)
10270 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
10280 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
10290 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
102a0 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
102b0 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
102c0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
102d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
102e0 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
102f0 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
10300 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65   */.  int *abYie
10310 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
10320 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10330 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65   op is an OP_Yie
10340 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ld */.  int nAll
10350 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
10360 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
10370 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e  ated size of p->
10380 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69  aiIndent[], abYi
10390 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70  eld */.  int iOp
103a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
103b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
103c0 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69  x of operation i
103d0 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20  n p->aiIndent[] 
103e0 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
103f0 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22   *azNext[] = { "
10400 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22  Next", "Prev", "
10410 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c  VPrev", "VNext",
10420 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20   "SorterNext",. 
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 22 4e 65 78 74 49            "NextI
10450 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f  fOpen", "PrevIfO
10460 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  pen", 0 };.  con
10470 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
10480 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
10490 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
104a0 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
104b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
104d0 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
104e0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
104f0 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
10500 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
10510 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
10520 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
10530 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
10540 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
10550 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
10560 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
10570 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
10580 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
10590 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
105a0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
105b0 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
105c0 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
105d0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
105e0 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
105f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
10600 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
10610 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
10620 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
10630 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
10640 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
10650 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
10660 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
10670 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
10680 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
10690 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
106a0 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
106b0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
106c0 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
106d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
106e0 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
106f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
10700 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
10710 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
10720 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10730 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10740 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
10750 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
10760 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
10770 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
10780 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
10790 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
107a0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
107b0 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
107c0 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
107d0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
107e0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
107f0 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
10800 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
10810 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
10820 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
10830 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
10840 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
10850 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
10860 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
10870 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
10880 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
10890 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
108a0 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
108b0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
108c0 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
108d0 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
108e0 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
108f0 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
10900 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
10910 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
10920 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
10930 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
10940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
10950 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
10960 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
10970 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
10980 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
10990 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
109a0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
109b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
109c0 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
109d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
109e0 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
109f0 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
10a00 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
10a10 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
10a20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
10a30 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
10a40 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
10a50 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
10a60 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
10a70 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
10a80 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
10a90 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
10aa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
10ab0 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
10ac0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
10ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
10ae0 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
10af0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10b20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
10b30 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
10b40 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
10b50 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
10b60 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
10b70 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
10b80 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69      abYield = (i
10b90 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
10ba0 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e  loc64(abYield, n
10bb0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
10bc0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ));.    }.    ab
10bd0 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
10be0 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
10bf0 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
10c00 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
10c10 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
10c20 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
10c30 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
10c40 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
10c50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
10c60 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
10c70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
10c80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
10c90 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
10ca0 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
10cb0 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
10cc0 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
10cd0 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
10ce0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
10cf0 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
10d00 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
10d10 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
10d20 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
10d30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
10d40 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
10d50 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
10d60 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
10d70 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
10d80 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
10d90 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
10da0 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
10db0 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
10dc0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
10dd0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
10de0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
10df0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
10e00 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
10e10 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
10e20 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
10e30 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
10e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
10e50 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
10e60 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
10e70 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
10e80 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
10e90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
10ea0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
10eb0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
10ec0 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
10ed0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
10ee0 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
10ef0 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
10f00 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
10f10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
10f20 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
10f30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
10f40 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
10f50 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
10f60 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
10f70 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
10f80 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
10f90 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
10fa0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
10fb0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
10fc0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
10fd0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
10fe0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
10ff0 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
11000 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
11010 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
11020 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11030 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
11040 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
11050 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
11060 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
11070 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
11080 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
11090 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
110a0 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
110b0 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
110c0 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
110d0 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
110e0 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
110f0 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
11100 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11110 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
11120 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
11130 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
11140 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
11150 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
11160 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
11170 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11180 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
11190 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
111a0 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
111b0 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
111c0 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
111d0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  dif.}../*.** Run
111e0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
111f0 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ement.*/.static 
11200 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72  void exec_prepar
11210 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c  ed_stmt(.  Shell
11220 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11250 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
11260 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
11270 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20  3_stmt *pStmt,  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
112a0 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  atment to run */
112b0 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
112c0 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
112d0 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a  ar**,char**,int*
112e0 29 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  )   /* Callback 
112f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
11300 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70   int rc;..  /* p
11310 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
11320 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
11330 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
11340 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75    ** have a resu
11350 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e  lt set or not an
11360 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73  d how wide it is
11370 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
11380 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
11390 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61  );.  /* if we ha
113a0 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
113b0 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .. */.  if( SQLI
113c0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
113d0 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76      /* if we hav
113e0 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  e a callback... 
113f0 2a 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c 6c  */.    if( xCall
11400 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  back ){.      /*
11410 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
11420 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72  for col name ptr
11430 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64  , value ptr, and
11440 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 69   type */.      i
11450 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65  nt nCol = sqlite
11460 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
11470 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f 69  Stmt);.      voi
11480 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74  d *pData = sqlit
11490 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43  e3_malloc64(3*nC
114a0 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20  ol*sizeof(const 
114b0 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20  char*) + 1);.   
114c0 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b     if( !pData ){
114d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
114e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
114f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11500 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d   char **azCols =
11510 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b   (char **)pData;
11520 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f        /* Names o
11530 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11540 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
11550 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43   **azVals = &azC
11560 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20  ols[nCol];      
11570 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
11580 20 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79         int *aiTy
11590 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a  pes = (int *)&az
115a0 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52  Vals[nCol]; /* R
115b0 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20  esult types */. 
115c0 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b         int i, x;
115d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
115e0 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73  sizeof(int) <= s
115f0 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a  izeof(char *));.
11600 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20          /* save 
11610 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75  off ptrs to colu
11620 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
11630 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11640 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11650 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d       azCols[i] =
11660 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
11670 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
11680 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
11690 7d 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  }.        do{.  
116a0 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61          /* extra
116b0 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20  ct the data and 
116c0 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20  data types */.  
116d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
116e0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
116f0 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79 70             aiTyp
11700 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69  es[i] = x = sqli
11710 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
11720 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
11730 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51         if( x==SQ
11740 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72  LITE_BLOB && pAr
11750 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65  g && pArg->cMode
11760 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b  ==MODE_Insert ){
11770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
11780 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20  zVals[i] = "";. 
11790 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
117a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
117b0 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azVals[i] = (cha
117c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
117d0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
117e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
117f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11800 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61  !azVals[i] && (a
11810 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54  iTypes[i]!=SQLIT
11820 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
11830 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11840 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11850 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11860 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a   /* from for */.
11870 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11880 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
11890 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20   for */..       
118a0 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e     /* if data an
118b0 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65  d types extracte
118c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e  d successfully..
118d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
118e0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
118f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
11900 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73     /* call the s
11910 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b  upplied callback
11920 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
11930 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20   row data */.   
11940 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61           if( xCa
11950 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
11960 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
11970 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
11990 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
119a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
119b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
119c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
119d0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
119e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
119f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 77     }.        } w
11a00 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
11a10 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
11a20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11a30 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
11a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11a50 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  do{.        rc =
11a60 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
11a70 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77 68  tmt);.      } wh
11a80 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54  ile( rc == SQLIT
11a90 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a 20  E_ROW );.    }. 
11aa0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
11ab0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11ac0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53  led to process S
11ad0 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  QL if the previo
11ae0 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64  us shell command
11af0 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74  .** was ".expert
11b00 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68 65  ". It passes the
11b10 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f   SQL in the seco
11b20 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65  nd argument dire
11b30 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73  ctly to.** the s
11b40 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a  qlite3expert obj
11b50 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ect..**.** If su
11b60 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
11b70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11b80 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
11b90 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
11ba0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
11bb0 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
11bc0 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
11bd0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
11be0 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
11bf0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
11c00 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
11c10 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
11c20 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
11c30 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
11c40 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
11c50 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
11c60 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
11c70 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
11c80 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65  HandleSQL(.  She
11c90 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
11ca0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
11cb0 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a  zSql, .  char **
11cc0 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72  pzErr.){.  asser
11cd0 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  t( pState->exper
11ce0 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61  t.pExpert );.  a
11cf0 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20  ssert( pzErr==0 
11d00 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
11d10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11d20 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61  _expert_sql(pSta
11d30 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
11d40 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29  rt, zSql, pzErr)
11d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11d60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11d70 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c  ed either to sil
11d80 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74  ently clean up t
11d90 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65  he object.** cre
11da0 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65 78  ated by the ".ex
11db0 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69  pert" command (i
11dc0 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f  f bCancel==1), o
11dd0 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  r to generate a 
11de0 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20  .** report from 
11df0 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61  it and then clea
11e00 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61 6e  n it up (if bCan
11e10 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  cel==0)..**.** I
11e20 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
11e30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11e40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
11e50 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
11e60 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
11e70 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
11e80 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
11e90 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
11ea0 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
11eb0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
11ec0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
11ed0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
11ee0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11ef0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
11f00 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
11f10 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
11f20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
11f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
11f40 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68  pertFinish(.  Sh
11f50 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
11f60 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c  ,.  int bCancel,
11f70 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
11f80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11f90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
11fa0 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53  e3expert *p = pS
11fb0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
11fc0 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  pert;.  assert( 
11fd0 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  p );.  assert( b
11fe0 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d  Cancel || pzErr=
11ff0 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20  =0 || *pzErr==0 
12000 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c  );.  if( bCancel
12010 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
12020 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
12030 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72  ut;.    int bVer
12040 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65  bose = pState->e
12050 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a  xpert.bVerbose;.
12060 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12070 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65  3_expert_analyze
12080 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20  (p, pzErr);.    
12090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
120a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
120b0 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
120c0 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b  expert_count(p);
120d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
120e0 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
120f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  e ){.        con
12100 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d  st char *zCand =
12110 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
12120 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52  report(p,0,EXPER
12130 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41  T_REPORT_CANDIDA
12140 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61  TES);.        ra
12150 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
12160 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d  - Candidates ---
12170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a  ----------\n");.
12190 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
121a0 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
121b0 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a  zCand);.      }.
121c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
121d0 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20  <nQuery; i++){. 
121e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
121f0 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
12200 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
12210 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
12220 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20  ORT_SQL);.      
12230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
12240 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  dx = sqlite3_exp
12250 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
12260 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49   EXPERT_REPORT_I
12270 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20  NDEXES);.       
12280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
12290 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  P = sqlite3_expe
122a0 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
122b0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c  EXPERT_REPORT_PL
122c0 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  AN);.        if(
122d0 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20   zIdx==0 ) zIdx 
122e0 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78  = "(no new index
122f0 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20  es)\n";.        
12300 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
12310 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
12320 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75  intf(out, "-- Qu
12330 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ery %d ---------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12350 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b  -------\n",i+1);
12360 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
12370 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
12380 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
12390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
123a0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
123b0 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20  s\n", zIdx);.   
123c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
123d0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51  out, "%s\n", zEQ
123e0 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  P);.      }.    
123f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
12400 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70  expert_destroy(p
12410 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70  );.  pState->exp
12420 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b  ert.pExpert = 0;
12430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12440 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
12450 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
12460 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
12470 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20  .  Print.** any 
12480 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
12490 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
124a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
124b0 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65  e.** set via the
124c0 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
124d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
124e0 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74  s very similar t
124f0 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  o SQLite's built
12500 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63  -in sqlite3_exec
12510 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ().** function e
12520 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
12530 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
12540 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ent callback.** 
12550 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74  and callback dat
12560 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  a argument..*/.s
12570 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
12580 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20  exec(.  sqlite3 
12590 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
125c0 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
125d0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
12600 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
12610 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
12620 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
12630 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c  **,char**,int*),
12640 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
12650 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74         /* (not t
12690 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
126a0 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53 68  e3_exec) */.  Sh
126b0 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
126e0 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
126f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
12700 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
12730 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
12740 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12750 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  pStmt = NULL;   
12760 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
12770 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
12780 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12790 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
127a0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
127b0 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63  /.  int rc2;.  c
127c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
127d0 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  over;          /
127e0 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63  * Tail of unproc
127f0 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20  essed SQL */..  
12800 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
12810 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
12820 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NULL;.  }..  if(
12830 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45   pArg->expert.pE
12840 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  xpert ){.    rc 
12850 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  = expertHandleSQ
12860 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a  L(pArg, zSql, pz
12870 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
12880 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68  urn expertFinish
12890 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49  (pArg, (rc!=SQLI
128a0 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67  TE_OK), pzErrMsg
128b0 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
128c0 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c   zSql[0] && (SQL
128d0 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b  ITE_OK == rc) ){
128e0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
128f0 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c  t char *zStmtSql
12900 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12910 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
12920 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
12930 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b  mt, &zLeftover);
12940 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12950 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20  OK != rc ){.    
12960 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
12970 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
12980 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d  Msg = save_err_m
12990 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  sg(db);.      }.
129a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
129b0 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20   if( !pStmt ){. 
129c0 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20 68         /* this h
129d0 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d  appens for a com
129e0 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73 70  ment or white-sp
129f0 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ace */.        z
12a00 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
12a10 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
12a20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
12a30 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
12a40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12a50 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74     }.      zStmt
12a60 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
12a70 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
12a80 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20  if( zStmtSql==0 
12a90 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b  ) zStmtSql = "";
12aa0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
12ab0 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30  Space(zStmtSql[0
12ac0 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b  ]) ) zStmtSql++;
12ad0 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20  ..      /* save 
12ae0 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65 64  off the prepared
12af0 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65   statment handle
12b00 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20 63   and reset row c
12b10 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  ount */.      if
12b20 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
12b30 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
12b40 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 70  pStmt;.        p
12b50 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20  Arg->cnt = 0;.  
12b60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
12b70 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74 61  echo the sql sta
12b80 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20 6f  tement if echo o
12b90 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
12ba0 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73 46  Arg && ShellHasF
12bb0 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47 5f  lag(pArg, SHFLG_
12bc0 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Echo) ){.       
12bd0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
12be0 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  g->out, "%s\n", 
12bf0 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74  zStmtSql ? zStmt
12c00 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20  Sql : zSql);.   
12c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
12c20 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e 20  how the EXPLAIN 
12c30 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e 65  QUERY PLAN if .e
12c40 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20  qp is on */.    
12c50 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
12c60 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20 73  rg->autoEQP && s
12c70 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
12c80 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74 6d 74 53  EXPLAIN%",zStmtS
12c90 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  ql,0)!=0 ){.    
12ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12cb0 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20   *pExplain;.    
12cc0 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a      char *zEQP;.
12cd0 20 20 20 20 20 20 20 20 69 6e 74 20 74 72 69 67          int trig
12ce0 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20 20 20  gerEQP = 0;.    
12cf0 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65 62 75      disable_debu
12d00 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b  g_trace_modes();
12d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12d20 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
12d30 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
12d40 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31 2c 20  RIGGER_EQP, -1, 
12d50 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a 20 20  &triggerEQP);.  
12d60 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
12d70 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50  autoEQP>=AUTOEQP
12d80 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  _trigger ){.    
12d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12da0 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
12db0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
12dc0 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29 3b 0a  GER_EQP, 1, 0);.
12dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12de0 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33    zEQP = sqlite3
12df0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
12e00 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
12e10 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
12e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e30 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
12e40 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
12e50 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
12e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12e80 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
12e90 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d  step(pExplain)==
12ea0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
12eb0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
12ec0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22  intf(pArg->out,"
12ed0 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c 73 71 6c  --EQP-- %d,",sql
12ee0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
12ef0 70 45 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a 20  pExplain, 0));. 
12f00 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
12f10 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12f20 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63  "%d,", sqlite3_c
12f30 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
12f40 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20  in, 1));.       
12f50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12f60 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c  pArg->out,"%d,",
12f70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12f80 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29  int(pExplain, 2)
12f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
12fa0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  tf8_printf(pArg-
12fb0 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73 71 6c  >out,"%s\n", sql
12fc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
12fd0 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 29 3b 0a  (pExplain, 3));.
12fe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
13000 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13010 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
13020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13030 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
13040 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
13050 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b  =AUTOEQP_full ){
13060 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
13070 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e  so do an EXPLAIN
13080 20 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22   for ".eqp full"
13090 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   mode */.       
130a0 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65     zEQP = sqlite
130b0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
130c0 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c  IN %s", zStmtSql
130d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
130e0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
130f0 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
13100 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
13110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13130 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72  .            pAr
13140 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
13150 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
13160 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
13170 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20  a_prepare(pArg, 
13180 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
13190 20 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70         exec_prep
131a0 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
131b0 70 45 78 70 6c 61 69 6e 2c 20 78 43 61 6c 6c 62  pExplain, xCallb
131c0 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ack);.          
131d0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
131e0 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20  elete(pArg);.   
131f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13200 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
13210 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
13220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13230 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
13240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
13250 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
13260 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
13270 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
13280 2c 20 74 72 69 67 67 65 72 45 51 50 2c 20 30 29  , triggerEQP, 0)
13290 3b 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f 72  ;.        restor
132a0 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
132b0 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  des();.      }..
132c0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
132d0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
132e0 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f  cMode = pArg->mo
132f0 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
13300 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69  pArg->autoExplai
13310 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  n.         && sq
13320 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
13330 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20  nt(pStmt)==8.   
13340 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
13350 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
13360 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29  N%", zStmtSql,0)
13370 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
13380 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
13390 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
133a0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ain;.        }..
133b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
133c0 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
133d0 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
133e0 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
133f0 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
13400 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
13410 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
13420 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
13430 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
13440 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
13450 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
13460 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
13470 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
13480 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
13490 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
134a0 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
134b0 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
134c0 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  , xCallback);.  
134d0 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
134e0 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a  _delete(pArg);..
134f0 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
13500 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
13510 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
13520 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
13530 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
13540 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
13550 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
13560 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13570 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
13580 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
13590 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
135a0 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
135b0 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
135c0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
135d0 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
135e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
135f0 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13600 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
13610 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
13620 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
13630 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
13640 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
13650 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
13660 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
13670 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
13680 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
13690 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
136a0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
136b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
136c0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
136d0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
136e0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
136f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
13710 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
13720 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
13730 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
13740 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
13750 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
13760 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
13770 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
13780 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
13790 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
137a0 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
137b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
137c0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
137d0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
137e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
137f0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
13800 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
13810 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13820 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
13830 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
13840 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
13850 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
13860 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
13870 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
13880 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
13890 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
138a0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
138b0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
138c0 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
138d0 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
138e0 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
138f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
13900 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
13910 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
13920 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
13930 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
13940 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
13950 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
13960 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
13970 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
13980 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
13990 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
139a0 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
139b0 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
139c0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
139d0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
139e0 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
139f0 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
13a00 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
13a10 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
13a20 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
13a30 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
13a40 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
13a50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
13a60 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
13a70 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
13a80 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
13a90 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
13aa0 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
13ab0 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
13ac0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
13ad0 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
13ae0 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
13af0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
13b00 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
13b10 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
13b20 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
13b30 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
13b40 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
13b50 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
13b60 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
13b70 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
13b80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
13b90 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
13ba0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
13bb0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
13bc0 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
13bd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
13be0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
13bf0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
13c00 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
13c10 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
13c20 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
13c30 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
13c40 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
13c50 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
13c60 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
13c70 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
13c80 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
13c90 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13ca0 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
13cb0 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
13cc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13cd0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
13ce0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
13cf0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
13d00 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
13d10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13d20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
13d30 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
13d40 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
13d50 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
13d60 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
13d70 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
13d80 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
13d90 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
13da0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
13db0 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
13dc0 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
13dd0 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
13de0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
13df0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
13e00 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
13e10 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
13e20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
13e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  }.    }.    azCo
13e40 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
13e50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
13e60 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
13e70 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
13e80 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13e90 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
13ea0 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  mt, 5) ){.      
13eb0 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nPK++;.      if(
13ec0 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26   nPK==1.       &
13ed0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
13ee0 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
13ef0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
13f00 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20  xt(pStmt,2),.   
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22         "INTEGER"
13f30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
13f40 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b        isIPK = 1;
13f50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13f60 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b        isIPK = 0;
13f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13f80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
13f90 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
13fa0 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
13fb0 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c  eturn 0;.  azCol
13fc0 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c  [0] = 0;.  azCol
13fd0 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20  [nCol+1] = 0;.. 
13fe0 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e   /* The decision
13ff0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
14000 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c  ot a rowid reall
14010 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  y needs to be pr
14020 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20  eserved.  ** is 
14030 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65  tricky.  We neve
14040 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72  r need to preser
14050 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61  ve a rowid for a
14060 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
14070 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74  able.  ** or a t
14080 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54  able with an INT
14090 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
140a0 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65  .  We are unable
140b0 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a   to preserve.  *
140c0 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c  * rowids on tabl
140d0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  es where the row
140e0 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  id is inaccessib
140f0 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  le because there
14100 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   are other.  ** 
14110 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
14120 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69  able named "rowi
14130 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61  d", "_rowid_", a
14140 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20  nd "oid"..  */. 
14150 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
14160 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20  id && isIPK ){. 
14170 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c     /* If a singl
14180 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
14190 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49  lumn with type I
141a0 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c  NTEGER was seen,
141b0 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
141c0 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73  might be an alis
141d0 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  e for the ROWID.
141e0 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61    But it might a
141f0 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54  lso be a WITHOUT
14200 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61   ROWID.    ** ta
14210 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52  ble or a INTEGER
14220 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53   PRIMARY KEY DES
14230 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65  C column, neithe
14240 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20  r of which are. 
14250 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61     ** ROWID alia
14260 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67  ses.  To disting
14270 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73  uish these cases
14280 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
14290 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
142a0 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69  s a "pk" entry i
142b0 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  n "PRAGMA index_
142c0 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69  list".  There wi
142d0 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20  ll be.    ** no 
142e0 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68  "pk" index if th
142f0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65  e PRIMARY KEY re
14300 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73  ally is an alias
14310 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a   for the ROWID..
14320 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
14330 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
14340 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  f("SELECT 1 FROM
14350 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69   pragma_index_li
14360 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20  st(%Q)".        
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69     " WHERE origi
14390 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a  n='pk'", zTab);.
143a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
143b0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
143c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
143d0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
143e0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
143f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
14400 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c       freeColumnL
14410 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
14420 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14430 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14440 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
14450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
14460 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
14470 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
14480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b   rc==SQLITE_ROW;
14490 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65  .  }.  if( prese
144a0 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  rveRowid ){.    
144b0 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65  /* Only preserve
144c0 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65   the rowid if we
144d0 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65   can find a name
144e0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a   to use for the.
144f0 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a      ** rowid */.
14500 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
14510 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22  *azRowid[] = { "
14520 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
14530 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20  ", "oid" };.    
14540 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
14550 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
14560 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
14570 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a   i<=nCol; i++){.
14580 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14590 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f  te3_stricmp(azRo
145a0 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29  wid[j],azCol[i])
145b0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
145c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
145d0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
145e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
145f0 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
14600 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f  azRowid[j] is no
14610 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  t the name of an
14620 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64  y.        ** ord
14630 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  inary column in 
14640 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69  the table.  Veri
14650 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  fy that azRowid[
14660 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20  j] is a valid.  
14670 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f        ** name fo
14680 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f  r the rowid befo
14690 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20  re adding it to 
146a0 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f  azCol[0].  WITHO
146b0 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT ROWID.       
146c0 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20   ** tables will 
146d0 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63  fail this last c
146e0 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
146f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
14700 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
14710 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c  ta(p->db,0,zTab,
14720 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30  azRowid[j],0,0,0
14730 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ,0,0);.        i
14740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14750 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a   ) azCol[0] = az
14760 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20  Rowid[j];.      
14770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14790 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a  urn azCol;.}../*
147a0 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72  .** Toggle the r
147b0 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
147c0 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67  _selects setting
147d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
147e0 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
147f0 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
14800 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14810 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
14820 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a  t iSetting = 0;.
14830 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30    char zStmt[100
14840 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  ];.  sqlite3_pre
14850 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
14860 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
14870 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20  dered_selects", 
14880 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
14890 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
148a0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
148b0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65  E_ROW ){.    iSe
148c0 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tting = sqlite3_
148d0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
148e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
148f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
14900 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt);.  sqlite3_s
14910 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14920 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20  Stmt), zStmt,.  
14930 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76       "PRAGMA rev
14940 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
14950 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53  elects(%d)", !iS
14960 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  etting);.  sqlit
14970 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d  e3_exec(db, zStm
14980 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  t, 0, 0, 0);.}..
14990 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
149a0 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
149b0 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  ck routine used 
149c0 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20  for dumping the 
149d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63  database..** Eac
149e0 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62  h row received b
149f0 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  y this callback 
14a00 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61  consists of a ta
14a10 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  ble name,.** the
14a20 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e   table type ("in
14a30 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29  dex" or "table")
14a40 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61   and SQL to crea
14a50 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  te the table..**
14a60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
14a70 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20  ould print text 
14a80 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65  sufficient to re
14a90 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
14aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14ab0 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f  dump_callback(vo
14ac0 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
14ad0 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
14ae0 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73  , char **azNotUs
14af0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
14b00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
14b10 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
14b20 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
14b30 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
14b40 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
14b50 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41  (ShellState *)pA
14b60 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg;..  UNUSED_PA
14b70 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65  RAMETER(azNotUse
14b80 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  d);.  if( nArg!=
14b90 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20  3 || azArg==0 ) 
14ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62  return 0;.  zTab
14bb0 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
14bc0 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31   zType = azArg[1
14bd0 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72  ];.  zSql = azAr
14be0 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72  g[2];..  if( str
14bf0 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
14c00 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
14c10 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
14c20 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c  ntf(p->out, "DEL
14c30 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
14c40 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20  sequence;\n");. 
14c50 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
14c60 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
14c70 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
14c80 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  e)==0 ){.    raw
14c90 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
14ca0 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
14cb0 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
14cc0 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
14cd0 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
14ce0 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
14cf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14d00 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
14d10 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
14d20 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
14d30 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
14d40 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21  *zIns;.    if( !
14d50 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
14d60 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
14d70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
14d80 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
14d90 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20  chema=ON;\n");. 
14da0 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
14db0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
14dc0 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c  }.    zIns = sql
14dd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
14de0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
14df0 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28  O sqlite_master(
14e00 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
14e10 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29  me,rootpage,sql)
14e20 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53  ".       "VALUES
14e30 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25  ('table','%q','%
14e40 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20  q',0,'%q');",.  
14e50 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61       zTable, zTa
14e60 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ble, zSql);.    
14e70 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
14e80 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
14e90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14ea0 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
14eb0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14ec0 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d  {.    printSchem
14ed0 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53  aLine(p->out, zS
14ee0 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a  ql, ";\n");.  }.
14ef0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
14f00 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
14f10 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
14f20 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
14f30 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b  hellText sTable;
14f40 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
14f50 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  l;.    int i;.  
14f60 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73    char *savedDes
14f70 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  tTable;.    int 
14f80 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20  savedMode;..    
14f90 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c  azCol = tableCol
14fa0 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c  umnList(p, zTabl
14fb0 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  e);.    if( azCo
14fc0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
14fd0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
14fe0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
14ff0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
15000 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
15010 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
15020 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
15030 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
15040 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
15050 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
15060 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
15070 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69  " ... */.    ini
15080 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  tText(&sTable);.
15090 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
150a0 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  sTable, zTable, 
150b0 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
150c0 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72  ));.    /* If pr
150d0 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77  eserving the row
150e0 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e  id, add a column
150f0 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20   list after the 
15100 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20  table name..    
15110 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
15120 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  s:  "INSERT INTO
15130 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63   tab(rowid,a,b,c
15140 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e  ,...) VALUES(...
15150 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61  )".    ** instea
15160 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22  d of the usual "
15170 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20  INSERT INTO tab 
15180 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20  VALUES(...)"..  
15190 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43    */.    if( azC
151a0 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
151b0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
151c0 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20  e, "(", 0);.    
151d0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
151e0 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  able, azCol[0], 
151f0 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
15200 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
15210 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
15220 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
15230 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
15240 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
15250 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  le, azCol[i], qu
15260 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
15270 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15280 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
15290 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20  able, ")", 0);. 
152a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69     }..    /* Bui
152b0 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ld an appropriat
152c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
152d0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  nt */.    initTe
152e0 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
152f0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
15300 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22  elect, "SELECT "
15310 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
15320 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
15330 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
15340 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ect, azCol[0], 0
15350 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
15360 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
15370 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
15380 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
15390 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
153a0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
153b0 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ect, azCol[i], q
153c0 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
153d0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
153e0 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  zCol[i+1] ){.   
153f0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
15400 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
15410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15420 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  .    freeColumnL
15430 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
15440 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
15450 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30  ect, " FROM ", 0
15460 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
15470 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62  t(&sSelect, zTab
15480 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
15490 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76  able));..    sav
154a0 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d  edDestTable = p-
154b0 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  >zDestTable;.   
154c0 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e   savedMode = p->
154d0 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  mode;.    p->zDe
154e0 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65  stTable = sTable
154f0 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  .z;.    p->mode 
15500 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  = p->cMode = MOD
15510 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  E_Insert;.    rc
15520 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d   = shell_exec(p-
15530 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  >db, sSelect.z, 
15540 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
15550 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  p, 0);.    if( (
15560 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
15570 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
15580 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
15590 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
155a0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
155b0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
155c0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
155d0 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
155e0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
155f0 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  >db, sSelect.z, 
15600 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
15610 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 67  p, 0);.      tog
15620 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70  gleSelectOrder(p
15630 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->db);.    }.   
15640 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
15650 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b   savedDestTable;
15660 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73  .    p->mode = s
15670 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72  avedMode;.    fr
15680 65 65 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b  eeText(&sTable);
15690 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
156a0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
156b0 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b   rc ) p->nErr++;
156c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
156d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51  .}../*.** Run zQ
156e0 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f  uery.  Use dump_
156f0 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68  callback() as th
15700 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
15710 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ne so that.** th
15720 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15730 65 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70  e query are outp
15740 75 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d  ut as SQL statem
15750 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  ents..**.** If w
15760 65 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43  e get a SQLITE_C
15770 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65  ORRUPT error, re
15780 72 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66  run the query af
15790 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a  ter appending.**
157a0 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
157b0 20 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e   DESC" to the en
157c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
157d0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
157e0 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53  _query(.  ShellS
157f0 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74  tate *p,.  const
15800 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b   char *zQuery.){
15810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15820 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72  r *zErr = 0;.  r
15830 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
15840 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
15850 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
15860 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  , &zErr);.  if( 
15870 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
15880 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  PT ){.    char *
15890 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  zQ2;.    int len
158a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65   = strlen30(zQue
158b0 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  ry);.    raw_pri
158c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
158d0 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
158e0 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
158f0 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  ");.    if( zErr
15900 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
15910 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
15920 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a  ****** %s ******
15930 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
15940 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15950 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45 72  zErr);.      zEr
15960 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  r = 0;.    }.   
15970 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c   zQ2 = malloc( l
15980 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69 66  en+100 );.    if
15990 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75 72  ( zQ2==0 ) retur
159a0 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  n rc;.    sqlite
159b0 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31  3_snprintf(len+1
159c0 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44  00, zQ2, "%s ORD
159d0 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
159e0 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ", zQuery);.    
159f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
15a00 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75  c(p->db, zQ2, du
15a10 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  mp_callback, p, 
15a20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
15a30 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rc ){.      utf8
15a40 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
15a50 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  "/****** ERROR: 
15a60 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
15a70 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Err);.    }else{
15a80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15a90 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
15aa0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
15ab0 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66 72  ee(zErr);.    fr
15ac0 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72  ee(zQ2);.  }.  r
15ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15ae0 2a 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c  ** Text of a hel
15af0 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61  p message.*/.sta
15b00 74 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d  tic char zHelp[]
15b10 20 3d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   =.#ifndef SQLIT
15b20 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
15b30 54 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e  TION.  ".auth ON
15b40 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 53  |OFF           S
15b50 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63  how authorizer c
15b60 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64  allbacks\n".#end
15b70 69 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44  if.  ".backup ?D
15b80 42 3f 20 46 49 4c 45 20 20 20 20 20 20 42 61 63  B? FILE      Bac
15b90 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20  kup DB (default 
15ba0 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c  \"main\") to FIL
15bb0 45 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e  E\n".  ".bail on
15bc0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 53  |off           S
15bd0 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
15be0 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66  g an error.  Def
15bf0 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e  ault OFF\n".  ".
15c00 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20  binary on|off   
15c10 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72        Turn binar
15c20 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f  y output on or o
15c30 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  ff.  Default OFF
15c40 5c 6e 22 0a 20 20 22 2e 63 64 20 44 49 52 45 43  \n".  ".cd DIREC
15c50 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 43 68  TORY          Ch
15c60 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67  ange the working
15c70 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49   directory to DI
15c80 52 45 43 54 4f 52 59 5c 6e 22 0a 20 20 22 2e 63  RECTORY\n".  ".c
15c90 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20  hanges on|off   
15ca0 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72       Show number
15cb0 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64   of rows changed
15cc0 20 62 79 20 53 51 4c 5c 6e 22 0a 20 20 22 2e 63   by SQL\n".  ".c
15cd0 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20  heck GLOB       
15ce0 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74       Fail if out
15cf0 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63  put since .testc
15d00 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ase does not mat
15d10 63 68 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20  ch\n".  ".clone 
15d20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20 20  NEWDB           
15d30 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20  Clone data into 
15d40 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65  NEWDB from the e
15d50 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
15d60 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65  \n".  ".database
15d70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69  s             Li
15d80 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c  st names and fil
15d90 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  es of attached d
15da0 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e  atabases\n".  ".
15db0 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20  dbinfo ?DB?     
15dc0 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75        Show statu
15dd0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  s information ab
15de0 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
15df0 5c 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41  \n".  ".dump ?TA
15e00 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75  BLE? ...      Du
15e10 6d 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  mp the database 
15e20 69 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20 66  in an SQL text f
15e30 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20 20  ormat\n".  "    
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70       If TABLE sp
15e60 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75  ecified, only du
15e70 6d 70 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  mp tables matchi
15e80 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ng\n".  "       
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54    LIKE pattern T
15eb0 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68  ABLE.\n".  ".ech
15ec0 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  o on|off        
15ed0 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20     Turn command 
15ee0 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  echo on or off\n
15ef0 22 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66  ".  ".eqp on|off
15f00 7c 66 75 6c 6c 20 20 20 20 20 20 20 45 6e 61 62  |full       Enab
15f10 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75  le or disable au
15f20 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
15f30 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20  QUERY PLAN\n".  
15f40 22 2e 65 78 69 74 20 20 20 20 20 20 20 20 20 20  ".exit          
15f50 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69          Exit thi
15f60 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22  s program\n".  "
15f70 2e 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20  .expert         
15f80 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e         EXPERIMEN
15f90 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64  TAL. Suggest ind
15fa0 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69  exes for specifi
15fb0 65 64 20 71 75 65 72 69 65 73 5c 6e 22 0a 2f 2a  ed queries\n"./*
15fc0 20 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e   Because explain
15fd0 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61   mode comes on a
15fe0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77  utomatically now
15ff0 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  , the ".explain"
16000 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f   mode.** is remo
16010 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c  ved from the hel
16020 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73  p screen.  It is
16030 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64   still supported
16040 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77   for legacy, how
16050 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c  ever */./*".expl
16060 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f  ain ?on|off|auto
16070 3f 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f  ? Turn EXPLAIN o
16080 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72  utput mode on or
16090 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d   off or to autom
160a0 61 74 69 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75  atic\n"*/.  ".fu
160b0 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65  llschema ?--inde
160c0 6e 74 3f 20 53 68 6f 77 20 73 63 68 65 6d 61 20  nt? Show schema 
160d0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
160e0 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74  of sqlite_stat t
160f0 61 62 6c 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61  ables\n".  ".hea
16100 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  ders on|off     
16110 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
16120 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
16130 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70   off\n".  ".help
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73    Show this mess
16160 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72  age\n".  ".impor
16170 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20  t FILE TABLE    
16180 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f   Import data fro
16190 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c  m FILE into TABL
161a0 45 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c  E\n".#ifndef SQL
161b0 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f  ITE_OMIT_TEST_CO
161c0 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74  NTROL.  ".impost
161d0 65 72 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20  er INDEX TABLE  
161e0 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  Create imposter 
161f0 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69  table TABLE on i
16200 6e 64 65 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65  ndex INDEX\n".#e
16210 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73  ndif.  ".indexes
16220 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53   ?TABLE?       S
16230 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  how names of all
16240 20 69 6e 64 65 78 65 73 5c 6e 22 0a 20 20 22 20   indexes\n".  " 
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45          If TABLE
16270 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
16280 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f   show indexes fo
16290 72 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20  r tables\n".  " 
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67          matching
162c0 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
162d0 42 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53  BLE.\n".#ifdef S
162e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
162f0 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65  RACE.  ".iotrace
16300 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 45   FILE          E
16310 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f  nable I/O diagno
16320 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20  stic logging to 
16330 46 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  FILE\n".#endif. 
16340 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f   ".limit ?LIMIT?
16350 20 3f 56 41 4c 3f 20 20 20 44 69 73 70 6c 61 79   ?VAL?   Display
16360 20 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 76   or change the v
16370 61 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54  alue of an SQLIT
16380 45 5f 4c 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c  E_LIMIT\n".  ".l
16390 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20  int OPTIONS     
163a0 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65       Report pote
163b0 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73  ntial schema iss
163c0 75 65 73 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22  ues. Options:\n"
163d0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6b 65               fke
163f0 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20 46 69  y-indexes     Fi
16400 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69  nd missing forei
16410 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e  gn key indexes\n
16420 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
16430 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
16440 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49  SION.  ".load FI
16450 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c  LE ?ENTRY?     L
16460 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e  oad an extension
16470 20 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64   library\n".#end
16480 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c  if.  ".log FILE|
16490 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72  off          Tur
164a0 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20  n logging on or 
164b0 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62  off.  FILE can b
164c0 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 5c  e stderr/stdout\
164d0 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45  n".  ".mode MODE
164e0 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74   ?TABLE?     Set
164f0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65   output mode whe
16500 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f  re MODE is one o
16510 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  f:\n".  "       
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d    ascii    Colum
16540 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65  ns/rows delimite
16550 64 20 62 79 20 30 78 31 46 20 61 6e 64 20 30 78  d by 0x1F and 0x
16560 31 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  1E\n".  "       
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61    csv      Comma
16590 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
165a0 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61   column   Left-a
165d0 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20  ligned columns. 
165e0 20 28 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22   (See .width)\n"
165f0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 68 74 6d               htm
16610 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c  l     HTML <tabl
16620 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20  e> code\n".  "  
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 20 20 20 20 69 6e 73 65 72 74 20 20 20         insert   
16650 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65  SQL insert state
16660 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c  ments for TABLE\
16670 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
16690 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75  ine     One valu
166a0 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20  e per line\n".  
166b0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
166c0 20 20 20 20 20 20 20 20 20 20 6c 69 73 74 20 20            list  
166d0 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69     Values delimi
166e0 74 65 64 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a  ted by \"|\"\n".
166f0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
16700 20 20 20 20 20 20 20 20 20 20 20 20 71 75 6f 74              quot
16710 65 20 20 20 20 45 73 63 61 70 65 20 61 6e 73 77  e    Escape answ
16720 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e  ers as for SQL\n
16730 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61                ta
16750 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72  bs     Tab-separ
16760 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20  ated values\n". 
16770 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16780 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 20 20             tcl  
16790 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65      TCL list ele
167a0 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c  ments\n".  ".nul
167b0 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20  lvalue STRING   
167c0 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e     Use STRING in
167d0 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
167e0 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63  alues\n".  ".onc
167f0 65 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  e FILENAME      
16800 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74 68     Output for th
16810 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61  e next SQL comma
16820 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 4e  nd only to FILEN
16830 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20  AME\n".  ".open 
16840 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f  ?OPTIONS? ?FILE?
16850 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67 20   Close existing 
16860 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6f  database and reo
16870 70 65 6e 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20  pen FILE\n".  " 
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 20 54 68 65 20 2d 2d 6e 65          The --ne
168a0 77 20 6f 70 74 69 6f 6e 20 73 74 61 72 74 73 20  w option starts 
168b0 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 66 69  with an empty fi
168c0 6c 65 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74  le\n".  ".output
168d0 20 3f 46 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20   ?FILENAME?     
168e0 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46  Send output to F
168f0 49 4c 45 4e 41 4d 45 20 6f 72 20 73 74 64 6f 75  ILENAME or stdou
16900 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53  t\n".  ".print S
16910 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50  TRING...       P
16920 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52  rint literal STR
16930 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70  ING\n".  ".promp
16940 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20  t MAIN CONTINUE 
16950 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
16960 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22  ndard prompts\n"
16970 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20  .  ".quit       
16980 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
16990 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a  this program\n".
169a0 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d    ".read FILENAM
169b0 45 20 20 20 20 20 20 20 20 20 45 78 65 63 75 74  E         Execut
169c0 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d  e SQL in FILENAM
169d0 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65  E\n".  ".restore
169e0 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52   ?DB? FILE     R
169f0 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f  estore content o
16a00 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  f DB (default \"
16a10 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c  main\") from FIL
16a20 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49  E\n".  ".save FI
16a30 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 57  LE             W
16a40 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  rite in-memory d
16a50 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c  atabase into FIL
16a60 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61  E\n".  ".scansta
16a70 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54  ts on|off      T
16a80 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  urn sqlite3_stmt
16a90 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65  _scanstatus() me
16aa0 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  trics on or off\
16ab0 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50  n".  ".schema ?P
16ac0 41 54 54 45 52 4e 3f 20 20 20 20 20 20 53 68 6f  ATTERN?      Sho
16ad0 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
16ae0 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67  tements matching
16af0 20 50 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20   PATTERN\n".  " 
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 20 20 20 20 20 20 20 20 41 64 64 20 2d 2d 69           Add --i
16b20 6e 64 65 6e 74 20 66 6f 72 20 70 72 65 74 74 79  ndent for pretty
16b30 2d 70 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22  -printing\n".  "
16b40 2e 73 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69  .selftest ?--ini
16b50 74 3f 20 20 20 20 20 52 75 6e 20 74 65 73 74 73  t?     Run tests
16b60 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
16b70 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 5c 6e  SELFTEST table\n
16b80 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20  ".  ".separator 
16b90 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e  COL ?ROW?   Chan
16ba0 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  ge the column se
16bb0 70 61 72 61 74 6f 72 20 61 6e 64 20 6f 70 74 69  parator and opti
16bc0 6f 6e 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e  onally the row\n
16bd0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
16bf0 70 61 72 61 74 6f 72 20 66 6f 72 20 62 6f 74 68  parator for both
16c00 20 74 68 65 20 6f 75 74 70 75 74 20 6d 6f 64 65   the output mode
16c10 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a   and .import\n".
16c20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16c30 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
16c40 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 43  N).  ".session C
16c50 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 43 72 65  MD ...       Cre
16c60 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73  ate or control s
16c70 65 73 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69  essions\n".#endi
16c80 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f  f.  ".sha3sum ?O
16c90 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70  PTIONS...?  Comp
16ca0 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68 20  ute a SHA3 hash 
16cb0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
16cc0 65 6e 74 5c 6e 22 0a 20 20 22 2e 73 68 65 6c 6c  ent\n".  ".shell
16cd0 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
16ce0 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e   Run CMD ARGS...
16cf0 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65   in a system she
16d00 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20  ll\n".  ".show  
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  Show the current
16d30 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69   values for vari
16d40 6f 75 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a  ous settings\n".
16d50 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66    ".stats ?on|of
16d60 66 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 73  f?        Show s
16d70 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61  tats or turn sta
16d80 74 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  ts on or off\n".
16d90 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41    ".system CMD A
16da0 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e 20 43 4d  RGS...    Run CM
16db0 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73  D ARGS... in a s
16dc0 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20  ystem shell\n". 
16dd0 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45   ".tables ?TABLE
16de0 3f 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61  ?        List na
16df0 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22  mes of tables\n"
16e00 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
16e20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
16e30 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65   only list table
16e40 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20  s matching\n".  
16e50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
16e60 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70            LIKE p
16e70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22  attern TABLE.\n"
16e80 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41  .  ".testcase NA
16e90 4d 45 20 20 20 20 20 20 20 20 20 42 65 67 69 6e  ME         Begin
16ea0 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74   redirecting out
16eb0 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73 65  put to 'testcase
16ec0 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22  -out.txt'\n".  "
16ed0 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
16ee0 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
16ef0 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
16f00 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
16f10 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65  onds\n".  ".time
16f20 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
16f30 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72    Turn SQL timer
16f40 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
16f50 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66  ".trace FILE|off
16f60 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 65          Output e
16f70 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
16f80 74 20 61 73 20 69 74 20 69 73 20 72 75 6e 5c 6e  t as it is run\n
16f90 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  ".  ".vfsinfo ?A
16fa0 55 58 3f 20 20 20 20 20 20 20 20 20 49 6e 66 6f  UX?         Info
16fb0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
16fc0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c  e top-level VFS\
16fd0 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20  n".  ".vfslist  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
16ff0 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  t all available 
17000 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73  VFSes\n".  ".vfs
17010 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20  name ?AUX?      
17020 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
17030 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
17040 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20  ck\n".  ".width 
17050 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
17060 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
17070 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
17080 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   mode\n".  "    
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
170b0 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
170c0 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66  fy\n".;..#if def
170d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
170e0 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
170f0 2a 20 50 72 69 6e 74 20 68 65 6c 70 20 69 6e 66  * Print help inf
17100 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
17110 20 22 2e 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d   ".sessions" com
17120 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73  mand.*/.void ses
17130 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53  sion_help(ShellS
17140 74 61 74 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f  tate *p){.  raw_
17150 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20  printf(p->out,. 
17160 20 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41     ".session ?NA
17170 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f  ME? SUBCOMMAND ?
17180 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20  ARGS...?\n".    
17190 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d  "If ?NAME? is om
171a0 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74  itted, the first
171b0 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e   defined session
171c0 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20   is used.\n".   
171d0 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e   "Subcommands:\n
171e0 22 0a 20 20 20 20 22 20 20 20 61 74 74 61 63 68  ".    "   attach
171f0 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20   TABLE          
17200 20 20 20 41 74 74 61 63 68 20 54 41 42 4c 45 5c     Attach TABLE\
17210 6e 22 0a 20 20 20 20 22 20 20 20 63 68 61 6e 67  n".    "   chang
17220 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  eset FILE       
17230 20 20 20 20 57 72 69 74 65 20 61 20 63 68 61 6e      Write a chan
17240 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c  geset into FILE\
17250 6e 22 0a 20 20 20 20 22 20 20 20 63 6c 6f 73 65  n".    "   close
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65      Close one se
17280 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20  ssion\n".    "  
17290 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
172a0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
172b0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
172c0 65 20 62 69 74 5c 6e 22 0a 20 20 20 20 22 20 20  e bit\n".    "  
172d0 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20   filter GLOB... 
172e0 20 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74            Reject
172f0 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
17300 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20   GLOBs\n".    " 
17310 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c    indirect ?BOOL
17320 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20  EAN?       Mark 
17330 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e 64  or query the ind
17340 69 72 65 63 74 20 73 74 61 74 75 73 5c 6e 22 0a  irect status\n".
17350 20 20 20 20 22 20 20 20 69 73 65 6d 70 74 79 20      "   isempty 
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74   Query whether t
17380 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
17390 70 74 79 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c  pty\n".    "   l
173a0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
173b0 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72          List cur
173c0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
173d0 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20  ion names\n".   
173e0 20 22 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d   "   open DB NAM
173f0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70  E             Op
17400 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
17410 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20 20 22 20   on DB\n".    " 
17420 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20    patchset FILE 
17430 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
17440 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f   a patchset into
17450 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a   FILE\n".  );.}.
17460 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77  #endif.../* Forw
17470 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
17480 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
17490 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
174a0 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
174b0 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  n);../*.** Read 
174c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
174d0 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
174e0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
174f0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
17500 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
17510 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
17520 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
17530 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
17540 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
17550 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
17560 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
17570 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
17580 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
17590 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
175a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
175b0 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
175c0 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
175d0 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
175e0 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
175f0 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
17600 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
17610 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
17620 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
17630 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
17640 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
17650 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
17660 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
17670 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
17680 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
17690 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
176a0 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
176b0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
176c0 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
176d0 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
176e0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
176f0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
17700 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
17710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
17720 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
17730 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
17740 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
17750 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
17760 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
17770 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
17780 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
17790 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
177a0 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
177b0 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
177c0 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
177d0 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
177e0 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
177f0 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
17800 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
17810 65 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66  ead = fread(pBuf
17820 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20  , nIn, 1, in);. 
17830 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
17840 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20  f( nRead!=1 ){. 
17850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17860 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
17870 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
17880 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
17890 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
178a0 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
178b0 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65   pBuf;.}..#if de
178c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
178d0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
178e0 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c  ** Close a singl
178f0 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  e OpenSession ob
17900 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65  ject and release
17910 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f   all of its asso
17920 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72  ciated.** resour
17930 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
17940 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  oid session_clos
17950 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70  e(OpenSession *p
17960 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20  Session){.  int 
17970 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73  i;.  sqlite3sess
17980 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73  ion_delete(pSess
17990 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74  ion->p);.  sqlit
179a0 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
179b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ->zName);.  for(
179c0 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
179d0 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
179e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
179f0 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
17a00 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  ter[i]);.  }.  s
17a10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
17a20 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
17a30 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69  .  memset(pSessi
17a40 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70  on, 0, sizeof(Op
17a50 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23  enSession));.}.#
17a60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
17a70 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69  se all OpenSessi
17a80 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72  on objects and r
17a90 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63  elease all assoc
17aa0 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
17ab0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
17ac0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
17ad0 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f  SSION).static vo
17ae0 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
17af0 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  _all(ShellState 
17b00 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
17b10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
17b20 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
17b30 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
17b40 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29  &p->aSession[i])
17b50 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73  ;.  }.  p->nSess
17b60 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  ion = 0;.}.#else
17b70 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f  .# define sessio
17b80 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23  n_close_all(X).#
17b90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
17ba0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
17bb0 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74  he xFilter funct
17bc0 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20  ion for an open 
17bd0 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a  session.  Omit.*
17be0 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d  * any tables nam
17bf0 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20  ed by ".session 
17c00 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20  filter" but let 
17c10 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20  all other table 
17c20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20  through..*/.#if 
17c30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
17c40 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
17c50 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
17c60 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70  n_filter(void *p
17c70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
17c80 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65  *zTab){.  OpenSe
17c90 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
17ca0 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29  = (OpenSession*)
17cb0 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCtx;.  int i;. 
17cc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
17cd0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
17ce0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
17cf0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65  ite3_strglob(pSe
17d00 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
17d10 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72  i], zTab)==0 ) r
17d20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
17d30 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
17d40 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
17d50 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
17d60 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20  is open.  If it 
17d70 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65  is not, then ope
17d80 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  n it.  If.** the
17d90 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20   database fails 
17da0 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61  to open, print a
17db0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
17dc0 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61  and exit..*/.sta
17dd0 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62  tic void open_db
17de0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
17df0 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a  int keepAlive){.
17e00 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
17e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
17e20 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
17e30 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
17e40 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
17e50 3e 64 62 29 3b 0a 20 20 20 20 67 6c 6f 62 61 6c  >db);.    global
17e60 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  Db = p->db;.    
17e70 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  if( p->db==0 || 
17e80 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17e90 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
17ea0 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
17eb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
17ec0 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20  rror: unable to 
17ed0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22  open database \"
17ee0 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  %s\": %s\n",.   
17ef0 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c         p->zDbFil
17f00 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  ename, sqlite3_e
17f10 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
17f20 20 20 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69       if( keepAli
17f30 76 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ve ) return;.   
17f40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
17f50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f60 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
17f70 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33  SION.    sqlite3
17f80 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
17f90 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29  ension(p->db, 1)
17fa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
17fb0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
17fc0 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
17fd0 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68     sqlite3_shath
17fe0 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ree_init(p->db, 
17ff0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
18000 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e  e3_completion_in
18010 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
18020 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18030 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
18040 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
18050 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
18060 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
18070 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
18080 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
18090 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
180a0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
180b0 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
180c0 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
180d0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
18100 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
18110 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
18120 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
18130 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
18140 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
18150 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18170 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
18180 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
18190 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f    }.}..#if HAVE_
181a0 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45  READLINE || HAVE
181b0 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20  _EDITLINE./*.** 
181c0 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74  Readline complet
181d0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f  ion callbacks.*/
181e0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
181f0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
18200 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73  n_generator(cons
18210 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e  t char *text, in
18220 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74  t state){.  stat
18230 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
18240 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
18250 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20  ar *zRet;.  if( 
18260 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  state==0 ){.    
18270 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
18280 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
18290 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
182a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
182b0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
182c0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
182d0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
18300 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29  M completion(%Q)
18310 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65   ORDER BY 1", te
18320 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
18330 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62  _prepare_v2(glob
18340 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  alDb, zSql, -1, 
18350 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
18360 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
18370 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
18380 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18390 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
183a0 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64  .    zRet = strd
183b0 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  up((const char*)
183c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
183d0 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
183e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
183f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
18400 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
18410 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  = 0;.    zRet = 
18420 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
18430 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  zRet;.}.static c
18440 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63  har **readline_c
18450 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
18460 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
18470 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
18480 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74  d){.  rl_attempt
18490 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76  ed_completion_ov
184a0 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  er = 1;.  return
184b0 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d   rl_completion_m
184c0 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65  atches(zText, re
184d0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
184e0 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a  n_generator);.}.
184f0 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45  .#elif HAVE_LINE
18500 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65  NOISE./*.** Line
18510 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  noise completion
18520 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
18530 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69  tic void linenoi
18540 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  se_completion(co
18550 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  nst char *zLine,
18560 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65   linenoiseComple
18570 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e  tions *lc){.  in
18580 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e  t nLine = strlen
18590 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74  30(zLine);.  int
185a0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71   i, iStart;.  sq
185b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
185c0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
185d0 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
185e0 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e  [1000];..  if( n
185f0 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66  Line>sizeof(zBuf
18600 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )-30 ) return;. 
18610 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
18620 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  .' ) return;.  f
18630 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e  or(i=nLine-1; i>
18640 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a  =0 && (isalnum(z
18650 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e  Line[i]) || zLin
18660 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29  e[i]=='_'); i--)
18670 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e  {}.  if( i==nLin
18680 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  e-1 ) return;.  
18690 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
186a0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
186b0 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a  ne, iStart);.  z
186c0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
186d0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
186e0 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
186f0 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
18700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18710 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
18720 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c  M completion(%Q,
18730 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
18740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18750 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65            &zLine
18760 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29  [iStart], zLine)
18770 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
18780 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
18790 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
187a0 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
187b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73  _free(zSql);.  s
187c0 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
187d0 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61  alDb, "PRAGMA pa
187e0 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c  ge_count", 0, 0,
187f0 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65   0); /* Load the
18800 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69   schema */.  whi
18810 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
18820 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
18830 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
18840 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69   char *zCompleti
18850 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  on = (const char
18860 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
18870 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
18880 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65  .    int nComple
18890 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  tion = sqlite3_c
188a0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
188b0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  t, 0);.    if( i
188c0 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f  Start+nCompletio
188d0 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  n < sizeof(zBuf)
188e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -1 ){.      memc
188f0 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20  py(zBuf+iStart, 
18900 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f  zCompletion, nCo
18910 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20  mpletion+1);.   
18920 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43     linenoiseAddC
18930 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42  ompletion(lc, zB
18940 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
18950 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
18960 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64  e(pStmt);.}.#end
18970 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  if../*.** Do C-l
18980 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
18990 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
189a0 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d    \a    -> alarm
189b0 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20  .**    \b    -> 
189c0 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20  backspace.**    
189d0 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20  \t    -> tab.** 
189e0 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c     \n    -> newl
189f0 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20  ine.**    \v    
18a00 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a  -> vertical tab.
18a10 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66  **    \f    -> f
18a20 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c  orm feed.**    \
18a30 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65  r    -> carriage
18a40 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73   return.**    \s
18a50 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20      -> space.** 
18a60 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a     \"    -> ".**
18a70 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a      \'    -> '.*
18a80 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61  *    \\    -> ba
18a90 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e  ckslash.**    \N
18aa0 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61  NN  -> ascii cha
18ab0 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63  racter NNN in oc
18ac0 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  tal.*/.static vo
18ad0 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
18ae0 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
18af0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
18b00 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20  har c;.  while( 
18b10 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29  *z && *z!='\\' )
18b20 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d   z++;.  for(i=j=
18b30 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
18b40 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
18b50 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20   if( c=='\\' && 
18b60 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  z[i+1]!=0 ){.   
18b70 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
18b80 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20       if( c=='a' 
18b90 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
18ba0 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \a';.      }else
18bb0 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20   if( c=='b' ){. 
18bc0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b         c = '\b';
18bd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18be0 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20   c=='t' ){.     
18bf0 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20     c = '\t';.   
18c00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
18c10 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'n' ){.        c
18c20 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d   = '\n';.      }
18c30 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20  else if( c=='v' 
18c40 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
18c50 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \v';.      }else
18c60 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
18c70 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b         c = '\f';
18c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18c90 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
18ca0 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
18cb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
18cc0 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '"' ){.        c
18cd0 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65   = '"';.      }e
18ce0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
18cf0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
18d00 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \'';.      }else
18d10 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
18d20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27          c = '\\'
18d30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
18d40 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
18d50 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  7' ){.        c 
18d60 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20  -= '0';.        
18d70 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
18d80 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
18d90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  {.          i++;
18da0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28  .          c = (
18db0 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
18dc0 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0';.          if
18dd0 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
18de0 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
18df0 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
18e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
18e10 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
18e20 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
18e30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
18e40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
18e50 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  j] = c;.  }.  if
18e60 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30  ( j<i ) z[j] = 0
18e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18e80 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
18e90 20 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67   hexadecimal dig
18ea0 69 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  it.  Return -1 i
18eb0 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69  f the input.** i
18ec0 73 20 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69  s not a hex digi
18ed0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
18ee0 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 63   hexDigitValue(c
18ef0 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e  har c){.  if( c>
18f00 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
18f10 20 72 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b   return c - '0';
18f20 0a 20 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26  .  if( c>='a' &&
18f30 20 63 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e   c<='f' ) return
18f40 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
18f50 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63   if( c>='A' && c
18f60 3c 3d 27 46 27 20 29 20 72 65 74 75 72 6e 20 63  <='F' ) return c
18f70 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72   - 'A' + 10;.  r
18f80 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
18f90 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72  ** Interpret zAr
18fa0 67 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20  g as an integer 
18fb0 76 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20  value, possibly 
18fc0 77 69 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a  with suffixes..*
18fd0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
18fe0 5f 69 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61  _int64 integerVa
18ff0 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
19000 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  zArg){.  sqlite3
19010 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20  _int64 v = 0;.  
19020 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
19030 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66  uct { char *zSuf
19040 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20  fix; int iMult; 
19050 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20  } aMult[] = {.  
19060 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20    { "KiB", 1024 
19070 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20  },.    { "MiB", 
19080 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20  1024*1024 },.   
19090 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31   { "GiB", 1024*1
190a0 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
190b0 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c  { "KB",  1000 },
190c0 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30  .    { "MB",  10
190d0 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
190e0 47 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30  GB",  1000000000
190f0 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20   },.    { "K",  
19100 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22   1000 },.    { "
19110 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c  M",   1000000 },
19120 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30  .    { "G",   10
19130 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
19140 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
19150 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28  isNeg = 0;.  if(
19160 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b   zArg[0]=='-' ){
19170 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a  .    isNeg = 1;.
19180 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65      zArg++;.  }e
19190 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  lse if( zArg[0]=
191a0 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67  ='+' ){.    zArg
191b0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41  ++;.  }.  if( zA
191c0 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
191d0 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
191e0 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72    int x;.    zAr
191f0 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c  g += 2;.    whil
19200 65 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74  e( (x = hexDigit
19210 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e  Value(zArg[0]))>
19220 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
19230 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20  (v<<4) + x;.    
19240 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a    zArg++;.    }.
19250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
19260 6c 65 28 20 49 73 44 69 67 69 74 28 7a 41 72 67  le( IsDigit(zArg
19270 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20  [0]) ){.      v 
19280 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d  = v*10 + zArg[0]
19290 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41   - '0';.      zA
192a0 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rg++;.    }.  }.
192b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
192c0 61 79 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69  aySize(aMult); i
192d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
192e0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75  ite3_stricmp(aMu
192f0 6c 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a  lt[i].zSuffix, z
19300 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Arg)==0 ){.     
19310 20 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69   v *= aMult[i].i
19320 4d 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61  Mult;.      brea
19330 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
19340 65 74 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20  eturn isNeg? -v 
19350 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  : v;.}../*.** In
19360 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
19370 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
19380 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76  r or a boolean v
19390 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20  alue.  Return 1 
193a0 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45  or 0.** for TRUE
193b0 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74   and FALSE.  Ret
193c0 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  urn the integer 
193d0 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72  value if appropr
193e0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
193f0 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
19400 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
19410 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
19420 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
19430 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
19440 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
19450 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
19460 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b  rg[i])>=0; i++){
19470 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
19480 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e  or(i=0; zArg[i]>
19490 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c  ='0' && zArg[i]<
194a0 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  ='9'; i++){}.  }
194b0 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41  .  if( i>0 && zA
194c0 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  rg[i]==0 ) retur
194d0 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56  n (int)(integerV
194e0 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66  alue(zArg) & 0xf
194f0 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20  fffffff);.  if( 
19500 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
19510 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c  zArg, "on")==0 |
19520 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
19530 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30  p(zArg,"yes")==0
19540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
19550 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19560 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
19570 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73  , "off")==0 || s
19580 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
19590 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a  Arg,"no")==0 ){.
195a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
195b0 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  }.  utf8_printf(
195c0 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
195d0 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  Not a boolean va
195e0 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73  lue: \"%s\". Ass
195f0 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22  uming \"no\".\n"
19600 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  ,.          zArg
19610 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
19620 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
19630 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61  lear a shell fla
19640 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  g according to a
19650 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
19660 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
19670 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68  etOrClearFlag(Sh
19680 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73  ellState *p, uns
19690 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e  igned mFlag, con
196a0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
196b0 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
196c0 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  ue(zArg) ){.    
196d0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
196e0 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  mFlag);.  }else{
196f0 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46  .    ShellClearF
19700 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20  lag(p, mFlag);. 
19710 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
19720 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  e an output file
19730 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73  , assuming it is
19740 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73   not stderr or s
19750 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  tdout.*/.static 
19760 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65  void output_file
19770 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b  _close(FILE *f){
19780 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73  .  if( f && f!=s
19790 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65  tdout && f!=stde
197a0 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a  rr ) fclose(f);.
197b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
197c0 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66  open an output f
197d0 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73  ile.   The names
197e0 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73   "stdout" and "s
197f0 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65  tderr" are.** re
19800 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20  cognized and do 
19810 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e  the right thing.
19820 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
19830 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
19840 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  .** filename is 
19850 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  "off"..*/.static
19860 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69   FILE *output_fi
19870 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  le_open(const ch
19880 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 46 49  ar *zFile){.  FI
19890 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
198a0 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
198b0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
198c0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
198d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
198e0 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
198f0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
19900 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
19910 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
19920 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
19930 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19940 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
19950 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69  le, "wb");.    i
19960 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
19970 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
19980 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
19990 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
199a0 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
199b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
199c0 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
199d0 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  d(SQLITE_UNTESTA
199e0 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e 65  BLE).#if !define
199f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
19a00 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
19a10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
19a20 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a  ATING_POINT)./*.
19a30 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
19a40 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
19a50 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
19a60 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
19a70 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63   int sql_trace_c
19a80 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67  allback(.  unsig
19a90 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69  ned mType,.  voi
19aa0 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64 20  d *pArg,.  void 
19ab0 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a  *pP,.  void *pX.
19ac0 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28  ){.  FILE *f = (
19ad0 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e  FILE*)pArg;.  UN
19ae0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
19af0 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Type);.  UNUSED_
19b00 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b 0a 20  PARAMETER(pP);. 
19b10 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20 63 6f   if( f ){.    co
19b20 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
19b30 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20  onst char*)pX;. 
19b40 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72 6c 65     int i = strle
19b50 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c  n30(z);.    whil
19b60 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d  e( i>0 && z[i-1]
19b70 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a  ==';' ){ i--; }.
19b80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19b90 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c  f, "%.*s;\n", i,
19ba0 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   z);.  }.  retur
19bb0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65  n 0;.}.#endif.#e
19bc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
19bd0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
19be0 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
19bf0 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
19c00 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
19c10 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
19c20 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
19c30 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
19c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19c50 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
19c60 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
19c70 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
19c80 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
19c90 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
19ca0 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
19cb0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
19cc0 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
19cd0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
19ce0 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
19cf0 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
19d00 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
19d10 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
19d20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
19d30 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
19d40 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
19d50 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
19d60 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
19d70 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
19d80 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
19d90 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
19da0 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
19db0 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19dd0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19de0 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
19df0 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
19e00 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
19e10 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
19e20 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
19e30 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
19e40 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
19e50 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
19e60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
19e70 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
19e80 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
19e90 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
19ea0 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
19eb0 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
19ec0 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
19ed0 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
19ee0 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
19ef0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
19f00 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
19f10 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
19f20 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
19f30 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
19f40 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
19f50 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
19f60 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
19f70 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
19f80 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
19f90 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
19fa0 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
19fb0 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
19fc0 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
19fd0 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
19fe0 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
19ff0 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1a000 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1a010 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1a020 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1a030 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1a040 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
1a050 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1a060 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
1a070 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  y\n");.      exi
1a080 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
1a090 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d    p->z[p->n++] =
1a0a0 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20   (char)c;.}../* 
1a0b0 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
1a0c0 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e  eld of CSV text.
1a0d0 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74    Compatible wit
1a0e0 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78  h rfc4180 and ex
1a0f0 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74  tended.** with t
1a100 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76  he option of hav
1a110 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20  ing a separator 
1a120 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a  other than ","..
1a130 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1a140 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1a150 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1a160 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1a170 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1a180 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1a190 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1a1a0 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1a1b0 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1a1c0 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1a1d0 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1a1e0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1a1f0 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a  fault is ","..**
1a200 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65     +  Use p->rSe
1a210 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70  p as the row sep
1a220 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1a230 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a  ault is "\n"..**
1a240 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b     +  Keep track
1a250 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
1a260 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1a270 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1a280 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1a290 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1a2a0 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1a2b0 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1a2c0 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1a2d0 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1a2e0 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1a2f0 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1a300 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1a310 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72  LITE_CDECL csv_r
1a320 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d  ead_one_field(Im
1a330 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69  portCtx *p){.  i
1a340 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70  nt c;.  int cSep
1a350 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20   = p->cColSep;. 
1a360 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63   int rSep = p->c
1a370 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d  RowSep;.  p->n =
1a380 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28   0;.  c = fgetc(
1a390 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d  p->in);.  if( c=
1a3a0 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65  =EOF || seenInte
1a3b0 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rrupt ){.    p->
1a3c0 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20  cTerm = EOF;.   
1a3d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1a3e0 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
1a3f0 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a     int pc, ppc;.
1a400 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e      int startLin
1a410 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20  e = p->nLine;.  
1a420 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63    int cQuote = c
1a430 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d  ;.    pc = ppc =
1a440 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   0;.    while( 1
1a450 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67   ){.      c = fg
1a460 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1a470 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20    if( c==rSep ) 
1a480 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1a490 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20    if( c==cQuote 
1a4a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a4b0 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1a4c0 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20         pc = 0;. 
1a4d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1a4e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1a4f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1a500 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63  c==cSep && pc==c
1a510 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1a520 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d   (c==rSep && pc=
1a530 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1a540 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
1a550 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d  c=='\r' && ppc==
1a560 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1a570 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d  | (c==EOF && pc=
1a580 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29  =cQuote).      )
1a590 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d  {.        do{ p-
1a5a0 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d  >n--; }while( p-
1a5b0 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65  >z[p->n]!=cQuote
1a5c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63   );.        p->c
1a5d0 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20  Term = c;.      
1a5e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a5f0 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63  .      if( pc==c
1a600 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27  Quote && c!='\r'
1a610 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1a620 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1a630 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65  "%s:%d: unescape
1a640 64 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e  d %c character\n
1a650 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a660 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e     p->zFile, p->
1a670 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a  nLine, cQuote);.
1a680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a690 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  ( c==EOF ){.    
1a6a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1a6b0 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
1a6c0 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d  unterminated %c-
1a6d0 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c  quoted field\n",
1a6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6f0 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74   p->zFile, start
1a700 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
1a710 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
1a720 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
1a730 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1a740 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1a750 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1a760 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20    ppc = pc;.    
1a770 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a    pc = c;.    }.
1a780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1a790 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1a7a0 69 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67  irst field being
1a7b0 20 70 61 72 73 65 64 20 61 6e 64 20 69 74 20 62   parsed and it b
1a7c0 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20  egins with the. 
1a7d0 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20     ** UTF-8 BOM 
1a7e0 20 28 30 78 45 46 20 42 42 20 42 46 29 20 74 68   (0xEF BB BF) th
1a7f0 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20  en skip the BOM 
1a800 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30 78  */.    if( (c&0x
1a810 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e  ff)==0xef && p->
1a820 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a  bNotFirst==0 ){.
1a830 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1a840 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1a850 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
1a860 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  p->in);.      if
1a870 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62  ( (c&0xff)==0xbb
1a880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f   ){.        impo
1a890 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1a8a0 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20  , c);.        c 
1a8b0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1a8c0 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30          if( (c&0
1a8d0 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20  xff)==0xbf ){.  
1a8e0 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46          p->bNotF
1a8f0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1a900 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20      p->n = 0;.  
1a910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
1a920 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1a930 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  d(p);.        }.
1a940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a950 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
1a960 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21  && c!=cSep && c!
1a970 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69  =rSep ){.      i
1a980 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1a990 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
1a9a0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1a9b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1a9c0 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ==rSep ){.      
1a9d0 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1a9e0 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20    if( p->n>0 && 
1a9f0 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c  p->z[p->n-1]=='\
1aa00 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20  r' ) p->n--;.   
1aa10 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20   }.    p->cTerm 
1aa20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = c;.  }.  if( p
1aa30 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1aa40 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46   = 0;.  p->bNotF
1aa50 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  irst = 1;.  retu
1aa60 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52  rn p->z;.}../* R
1aa70 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
1aa80 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69  ld of ASCII deli
1aa90 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a  mited text..**.*
1aaa0 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
1aab0 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
1aac0 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
1aad0 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
1aae0 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
1aaf0 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
1ab00 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
1ab10 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1ab20 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  oc64()..**   +  
1ab30 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74  Use p->cSep as t
1ab40 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  he column separa
1ab50 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1ab60 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20  t is "\x1F"..** 
1ab70 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
1ab80 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
1ab90 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1aba0 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a  ult is "\x1E"..*
1abb0 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
1abc0 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d  k of the row num
1abd0 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1abe0 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1abf0 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1ac00 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1ac10 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1ac20 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1ac30 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1ac40 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1ac50 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1ac60 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1ac70 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1ac80 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69  LITE_CDECL ascii
1ac90 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1aca0 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
1acb0 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
1acc0 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
1acd0 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
1ace0 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
1acf0 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
1ad00 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
1ad10 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
1ad20 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
1ad30 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
1ad40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ad50 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46  .  while( c!=EOF
1ad60 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63   && c!=cSep && c
1ad70 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d  !=rSep ){.    im
1ad80 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1ad90 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20  (p, c);.    c = 
1ada0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1adb0 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20  }.  if( c==rSep 
1adc0 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  ){.    p->nLine+
1add0 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72  +;.  }.  p->cTer
1ade0 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e  m = c;.  if( p->
1adf0 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  z ) p->z[p->n] =
1ae00 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
1ae10 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  z;.}../*.** Try 
1ae20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74 61  to transfer data
1ae30 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c   for table zTabl
1ae40 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  e.  If an error 
1ae50 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a  is seen while.**
1ae60 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c   moving forward,
1ae70 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77   try to go backw
1ae80 61 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77  ards.  The backw
1ae90 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f  ards movement wo
1aea0 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20  n't.** work for 
1aeb0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1aec0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1aed0 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44  void tryToCloneD
1aee0 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ata(.  ShellStat
1aef0 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
1af00 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
1af10 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a  char *zTable.){.
1af20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1af30 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71  pQuery = 0;.  sq
1af40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
1af50 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ert = 0;.  char 
1af60 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63  *zQuery = 0;.  c
1af70 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30  har *zInsert = 0
1af80 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1af90 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74  t i, j, n;.  int
1afa0 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e   nTable = strlen
1afb0 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  30(zTable);.  in
1afc0 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
1afd0 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
1afe0 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
1aff0 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
1b000 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1b010 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1b020 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
1b030 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b040 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1b050 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1b060 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1b070 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1b080 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1b090 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
1b0a0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1b0b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1b0c0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1b0d0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1b0e0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1b0f0 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1b100 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1b110 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
1b120 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
1b130 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
1b140 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
1b150 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1b160 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
1b170 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
1b180 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
1b190 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1b1a0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
1b1b0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
1b1c0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1b1d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1b1e0 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1b1f0 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1b200 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1b210 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1b220 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1b230 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1b240 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73   = strlen30(zIns
1b250 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b  ert);.  for(j=1;
1b260 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
1b270 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1b280 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20  , ",?", 2);.    
1b290 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65  i += 2;.  }.  me
1b2a0 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
1b2b0 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d  ");", 3);.  rc =
1b2c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1b2d0 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65  _v2(newDb, zInse
1b2e0 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74  rt, -1, &pInsert
1b2f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1b300 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1b310 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1b320 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1b330 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b340 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1b350 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
1b360 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1b370 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20  newDb),.        
1b380 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1b390 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1b3a0 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b  fer;.  }.  for(k
1b3b0 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20  =0; k<2; k++){. 
1b3c0 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
1b3d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
1b3e0 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
1b3f0 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  W ){.      for(i
1b400 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1b410 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
1b420 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1b430 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b  pe(pQuery, i) ){
1b440 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1b450 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
1b460 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b470 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
1b480 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  sert, i+1);.    
1b490 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b4a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b4b0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1b4c0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1b4d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b4e0 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65  bind_int64(pInse
1b4f0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1b500 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51  _column_int64(pQ
1b510 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1b520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b540 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b550 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
1b560 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b570 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c  _double(pInsert,
1b580 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1b590 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65  lumn_double(pQue
1b5a0 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
1b5b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b5d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1b5e0 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
1b5f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1b600 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  xt(pInsert, i+1,
1b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1b630 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1b640 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1b650 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54         -1, SQLIT
1b680 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1b690 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b6a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b6b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b6c0 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
1b6d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b6e0 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69  _blob(pInsert, i
1b6f0 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
1b700 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69  mn_blob(pQuery,i
1b710 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b740 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1b750 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  tes(pQuery,i),. 
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1b790 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1b7a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b7b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b7c0 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45    }.      } /* E
1b7d0 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  nd for */.      
1b7e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1b7f0 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1b800 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b810 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1b820 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c  E_ROW && rc!=SQL
1b830 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1b840 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1b850 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
1b860 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  d: %s\n", sqlite
1b870 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1b880 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  de(newDb),.     
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1b8b0 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20  g(newDb));.     
1b8c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b8d0 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
1b8e0 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
1b8f0 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70 69      if( (cnt%spi
1b900 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20  nRate)==0 ){.   
1b910 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c       printf("%c\
1b920 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74  b", "|/-\\"[(cnt
1b930 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a  /spinRate)%4]);.
1b940 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
1b950 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  tdout);.      }.
1b960 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69      } /* End whi
1b970 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  le */.    if( rc
1b980 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1b990 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
1b9a0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1b9b0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1b9c0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1b9d0 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1b9e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1b9f0 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1ba00 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  " ORDER BY rowid
1ba10 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20   DESC;",.       
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20        zTable);. 
1ba40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1ba50 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1ba60 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
1ba70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69  Query, 0);.    i
1ba80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
1ba90 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1baa0 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e  r, "Warning: can
1bab0 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20  not step \"%s\" 
1bac0 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62  backwards", zTab
1bad0 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1bae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  ;.    }.  } /* E
1baf0 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a  nd for(k=0...) *
1bb00 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  /..end_data_xfer
1bb10 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
1bb20 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1bb30 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1bb40 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c  (pInsert);.  sql
1bb50 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1bb60 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1bb70 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a  e(zInsert);.}...
1bb80 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1bb90 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f  nsfer all rows o
1bba0 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68 61  f the schema tha
1bbb0 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20  t match zWhere. 
1bbc0 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77   For.** each row
1bbd0 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63  , invoke xForEac
1bbe0 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63  h() on the objec
1bbf0 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 61  t defined by tha
1bc00 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20  t row..** If an 
1bc10 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1bc20 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e  ered while movin
1bc30 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67  g forward throug
1bc40 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  h the.** sqlite_
1bc50 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72  master table, tr
1bc60 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62  y again moving b
1bc70 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61  ackwards..*/.sta
1bc80 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1bc90 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65  oneSchema(.  She
1bca0 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1bcb0 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1bcc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
1bcd0 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f  re,.  void (*xFo
1bce0 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74  rEach)(ShellStat
1bcf0 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73  e*,sqlite3*,cons
1bd00 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71  t char*).){.  sq
1bd10 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65  lite3_stmt *pQue
1bd20 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
1bd30 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e  zQuery = 0;.  in
1bd40 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  t rc;.  const un
1bd50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61  signed char *zNa
1bd60 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  me;.  const unsi
1bd70 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b  gned char *zSql;
1bd80 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1bd90 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20   = 0;..  zQuery 
1bda0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1bdb0 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  f("SELECT name, 
1bdc0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
1bdd0 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c 20     " WHERE %s", 
1be00 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20  zWhere);.  rc = 
1be10 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1be20 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1be30 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1be40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1be50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1be60 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
1be70 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
1be80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1be90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1bea0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1beb0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1bec0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20     zQuery);.    
1bef0 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
1bf00 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  xfer;.  }.  whil
1bf10 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1bf20 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1bf30 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1bf40 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1bf50 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1bf60 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53  uery, 0);.    zS
1bf70 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ql = sqlite3_col
1bf80 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1bf90 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
1bfa0 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
1bfb0 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
1bfc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1bfd0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1bfe0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1bff0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1c000 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
1c010 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1c020 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1c030 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
1c040 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
1c050 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
1c060 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1c070 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20  ;.      zErrMsg 
1c080 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1c090 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20  f( xForEach ){. 
1c0a0 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
1c0b0 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
1c0c0 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
1c0d0 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64   }.    printf("d
1c0e0 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  one\n");.  }.  i
1c0f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
1c100 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
1c110 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
1c120 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  y);.    sqlite3_
1c130 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
1c140 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1c150 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1c160 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1c170 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1c180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1c1a0 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42  WHERE %s ORDER B
1c1b0 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
1c1c0 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d  Where);.    rc =
1c1d0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c1e0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1c1f0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1c200 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1c210 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1c220 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1c230 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
1c240 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1c260 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1c270 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
1c280 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1c290 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1c2b0 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ry);.      goto 
1c2c0 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b  end_schema_xfer;
1c2d0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1c2e0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
1c2f0 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
1c300 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1c310 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1c320 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c330 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
1c340 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1c350 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1c360 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72  ry, 1);.      pr
1c370 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
1c380 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
1c390 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dout);.      sql
1c3a0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1c3b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
1c3c0 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
1c3d0 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  sg);.      if( z
1c3e0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1c3f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1c400 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1c410 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  \nSQL: [%s]\n", 
1c420 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrMsg, zSql);.
1c430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c440 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
1c450 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d         zErrMsg =
1c460 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c470 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1c480 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45 61  {.        xForEa
1c490 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
1c4a0 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
1c4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c4c0 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
1c4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f  ;.    }.  }.end_
1c4e0 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73  schema_xfer:.  s
1c4f0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1c500 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
1c510 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1c520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1c530 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
1c540 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62  le named "zNewDb
1c550 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76  ".  Try to recov
1c560 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72  er as much infor
1c570 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73  mation.** as pos
1c580 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65  sible out of the
1c590 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 28   main database (
1c5a0 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 63  which might be c
1c5b0 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69 74  orrupt) and writ
1c5c0 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65  e it.** into zNe
1c5d0 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wDb..*/.static v
1c5e0 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53  oid tryToClone(S
1c5f0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
1c600 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62  nst char *zNewDb
1c610 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1c620 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20  qlite3 *newDb = 
1c630 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  0;.  if( access(
1c640 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a  zNewDb,0)==0 ){.
1c650 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1c660 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22  stderr, "File \"
1c670 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69  %s\" already exi
1c680 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29  sts.\n", zNewDb)
1c690 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1c6a0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1c6b0 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e  _open(zNewDb, &n
1c6c0 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20  ewDb);.  if( rc 
1c6d0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1c6e0 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
1c6f0 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75 74  ot create output
1c700 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
1c710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
1c720 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
1c730 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db));.  }else{. 
1c740 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1c750 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
1c760 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
1c770 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  N;", 0, 0, 0);. 
1c780 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1c790 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58  newDb, "BEGIN EX
1c7a0 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c  CLUSIVE;", 0, 0,
1c7b0 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c   0);.    tryToCl
1c7c0 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1c7d0 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65  Db, "type='table
1c7e0 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  '", tryToCloneDa
1c7f0 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c  ta);.    tryToCl
1c800 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1c810 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c  Db, "type!='tabl
1c820 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e'", 0);.    sql
1c830 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1c840 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30   "COMMIT;", 0, 0
1c850 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1c860 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
1c870 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
1c880 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
1c890 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
1c8a0 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44 62  ite3_close(newDb
1c8b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
1c8c0 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
1c8d0 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
1c8e0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
1c8f0 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68   output_reset(Sh
1c900 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
1c910 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30  if( p->outfile[0
1c920 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65  ]=='|' ){.#ifnde
1c930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
1c940 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70  PEN.    pclose(p
1c950 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20  ->out);.#endif. 
1c960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70   }else{.    outp
1c970 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
1c980 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >out);.  }.  p->
1c990 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a  outfile[0] = 0;.
1c9a0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
1c9b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
1c9c0 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61  an SQL command a
1c9d0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  nd return the si
1c9e0 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73  ngle integer res
1c9f0 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
1ca00 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53  nt db_int(ShellS
1ca10 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
1ca20 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71  har *zSql){.  sq
1ca30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ca40 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  t;.  int res = 0
1ca50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1ca60 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
1ca70 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
1ca80 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  0);.  if( pStmt 
1ca90 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
1caa0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1cab0 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  OW ){.    res = 
1cac0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1cad0 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d  nt(pStmt,0);.  }
1cae0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1caf0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
1cb00 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1cb10 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62  ** Convert a 2-b
1cb20 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69  yte or 4-byte bi
1cb30 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1cb40 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69   into a native i
1cb50 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
1cb60 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
1cb70 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t2byteInt(unsign
1cb80 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
1cb90 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20  eturn (a[0]<<8) 
1cba0 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63  + a[1];.}.static
1cbb0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
1cbc0 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t4byteInt(unsign
1cbd0 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
1cbe0 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29  eturn (a[0]<<24)
1cbf0 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20   + (a[1]<<16) + 
1cc00 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d  (a[2]<<8) + a[3]
1cc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1cc20 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1cc30 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64   ".info" command
1cc40 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
1cc50 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
1cc60 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
1cc70 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1cc80 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66   int shell_dbinf
1cc90 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53  o_command(ShellS
1cca0 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72  tate *p, int nAr
1ccb0 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29  g, char **azArg)
1ccc0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1ccd0 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1cce0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74  char *zName; int
1ccf0 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b   ofst; } aField[
1cd00 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69  ] = {.     { "fi
1cd10 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
1cd20 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20  r:",  24  },.   
1cd30 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61    { "database pa
1cd40 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20  ge count:",  28 
1cd50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65   },.     { "free
1cd60 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a  list page count:
1cd70 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20  ",  36  },.     
1cd80 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  { "schema cookie
1cd90 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d  :",        40  }
1cda0 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
1cdb0 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20   format:",      
1cdc0 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    44  },.     { 
1cdd0 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73  "default cache s
1cde0 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a  ize:",   48  },.
1cdf0 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75       { "autovacu
1ce00 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20  um top root:",  
1ce10 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69  52  },.     { "i
1ce20 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1ce30 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20  m:",   64  },.  
1ce40 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64     { "text encod
1ce50 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36  ing:",        56
1ce60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65    },.     { "use
1ce70 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20  r version:",    
1ce80 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20       60  },.    
1ce90 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20   { "application 
1cea0 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20  id:",       68  
1ceb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77  },.     { "softw
1cec0 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20  are version:",  
1ced0 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20     96  },.  };. 
1cee0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1cef0 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
1cf00 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20  r *zName; const 
1cf10 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51  char *zSql; } aQ
1cf20 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  uery[] = {.     
1cf30 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  { "number of tab
1cf40 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  les:",.       "S
1cf50 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1cf60 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1cf70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20  e='table'" },.  
1cf80 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1cf90 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20  indexes:",.     
1cfa0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
1cfb0 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
1cfc0 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d   type='index'" }
1cfd0 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
1cfe0 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a   of triggers:",.
1cff0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
1d000 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
1d010 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67  WHERE type='trig
1d020 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ger'" },.     { 
1d030 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73  "number of views
1d040 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1d050 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1d060 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1d070 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b  view'" },.     {
1d080 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c   "schema size:",
1d090 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1d0a0 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c  total(length(sql
1d0b0 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20  )) FROM %s" },. 
1d0c0 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   };.  int i;.  c
1d0d0 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b  har *zSchemaTab;
1d0e0 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e  .  char *zDb = n
1d0f0 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
1d100 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71  ] : "main";.  sq
1d110 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d120 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  t = 0;.  unsigne
1d130 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
1d140 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30  ;.  open_db(p, 0
1d150 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  );.  if( p->db==
1d160 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1d170 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1d180 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54  v2(p->db,"SELECT
1d190 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
1d1a0 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45  e_dbpage(?1) WHE
1d1b0 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20  RE pgno=1",.    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1d1e0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1d1f0 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
1d200 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  Db, -1, SQLITE_S
1d210 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71  TATIC);.  if( sq
1d220 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1d230 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
1d240 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   && sqlite3_colu
1d250 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30  mn_bytes(pStmt,0
1d260 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d  )>100.  ){.    m
1d270 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69  emcpy(aHdr, sqli
1d280 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1d290 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a  pStmt,0), 100);.
1d2a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1d2b0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
1d2c0 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
1d2d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
1d2e0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74  able to read dat
1d2f0 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29  abase header\n")
1d300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1d310 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1d320 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1d330 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 49  .  i = get2byteI
1d340 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69  nt(aHdr+16);.  i
1d350 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35  f( i==1 ) i = 65
1d360 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  536;.  utf8_prin
1d370 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1d380 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61  s %d\n", "databa
1d390 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20  se page size:", 
1d3a0 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  i);.  utf8_print
1d3b0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1d3c0 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66   %d\n", "write f
1d3d0 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38  ormat:", aHdr[18
1d3e0 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
1d3f0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1d400 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f   %d\n", "read fo
1d410 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d  rmat:", aHdr[19]
1d420 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
1d430 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1d440 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64  %d\n", "reserved
1d450 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32   bytes:", aHdr[2
1d460 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
1d470 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69 65  i<ArraySize(aFie
1d480 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ld); i++){.    i
1d490 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64  nt ofst = aField
1d4a0 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e  [i].ofst;.    un
1d4b0 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d  signed int val =
1d4c0 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48 64   get4byteInt(aHd
1d4d0 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75  r + ofst);.    u
1d4e0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
1d4f0 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61  t, "%-20s %u", a
1d500 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Field[i].zName, 
1d510 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68  val);.    switch
1d520 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20  ( ofst ){.      
1d530 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20  case 56: {.     
1d540 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20     if( val==1 ) 
1d550 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
1d560 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20  t, " (utf8)");. 
1d570 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
1d580 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  2 ) raw_printf(p
1d590 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c  ->out, " (utf16l
1d5a0 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e)");.        if
1d5b0 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70  ( val==3 ) raw_p
1d5c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
1d5d0 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20  (utf16be)");.   
1d5e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1d5f0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
1d600 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  , "\n");.  }.  i
1d610 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
1d620 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
1d630 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
1d640 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
1d650 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  r");.  }else if(
1d660 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d   strcmp(zDb,"tem
1d670 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  p")==0 ){.    zS
1d680 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
1d690 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1d6a0 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
1d6b0 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  ster");.  }else{
1d6c0 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
1d6d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1d6e0 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  f("\"%w\".sqlite
1d6f0 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a  _master", zDb);.
1d700 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1d710 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65 72  <ArraySize(aQuer
1d720 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  y); i++){.    ch
1d730 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
1d740 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72  e3_mprintf(aQuer
1d750 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65  y[i].zSql, zSche
1d760 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20  maTab);.    int 
1d770 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20  val = db_int(p, 
1d780 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSql);.    sqlit
1d790 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1d7a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
1d7b0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1d7c0 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a  \n", aQuery[i].z
1d7d0 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a  Name, val);.  }.
1d7e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d7f0 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 72 65  SchemaTab);.  re
1d800 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1d810 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72 65   Print the curre
1d820 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nt sqlite3_errms
1d830 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64  g() value to std
1d840 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31  err and return 1
1d850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d860 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
1d870 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  or(sqlite3 *db){
1d880 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d890 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
1d8a0 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38  rmsg(db);.  utf8
1d8b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d8c0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
1d8d0 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Err);.  return 1
1d8e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1d8f0 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
1d900 79 20 6d 65 73 73 61 67 65 20 74 6f 20 73 74 64  y message to std
1d910 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31  err and return 1
1d920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d930 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28  shellNomemError(
1d940 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69  void){.  raw_pri
1d950 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d960 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
1d970 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  y\n");.  return 
1d980 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1d990 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e 20  are the pattern 
1d9a0 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e  in zGlob[] again
1d9b0 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a  st the text in z
1d9c0 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  [].  Return TRUE
1d9d0 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63  .** if they matc
1d9e0 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20  h and FALSE (0) 
1d9f0 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  if they do not m
1da00 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  atch..**.** Glob
1da10 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
1da20 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
1da30 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
1da40 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
1da50 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
1da60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
1da70 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
1da80 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
1da90 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
1daa0 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
1dab0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
1dac0 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
1dad0 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
1daf0 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
1db00 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
1db10 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
1db20 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
1db30 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
1db40 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20 20  .**      '#'    
1db50 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
1db60 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f  equence of one o
1db70 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69  r more digits wi
1db80 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  th an.**        
1db90 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c          optional
1dba0 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20   + or - sign in 
1dbb0 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  front.**.**     
1dbc0 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20 73   ' '       Any s
1dbd0 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63  pan of whitespac
1dbe0 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74  e matches any ot
1dbf0 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20  her span of.**  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1dc10 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  itespace..**.** 
1dc20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63 65  Extra whitespace
1dc30 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a   at the end of z
1dc40 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  [] is ignored..*
1dc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1dc60 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74  tcase_glob(const
1dc70 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f   char *zGlob, co
1dc80 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
1dc90 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74  int c, c2;.  int
1dca0 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
1dcb0 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  een;..  while( (
1dcc0 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29  c = (*(zGlob++))
1dcd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
1dce0 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
1dcf0 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63 65      if( !IsSpace
1dd00 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
1dd10 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
1dd20 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20  Space(*zGlob) ) 
1dd30 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77  zGlob++;.      w
1dd40 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
1dd50 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c  ) ) z++;.    }el
1dd60 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b  se if( c=='*' ){
1dd70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
1dd80 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d  =(*(zGlob++))) =
1dd90 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  = '*' || c=='?' 
1dda0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
1ddb0 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29  =='?' && (*(z++)
1ddc0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1ddd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1dde0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1ddf0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1de00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1de10 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '[' ){.        w
1de20 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74  hile( *z && test
1de30 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d  case_glob(zGlob-
1de40 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1,z)==0 ){.     
1de50 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1de60 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1de70 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20  rn (*z)!=0;.    
1de80 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
1de90 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29   (c2 = (*(z++)))
1dea0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  !=0 ){.        w
1deb0 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20  hile( c2!=c ){. 
1dec0 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
1ded0 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  z++);.          
1dee0 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
1def0 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
1df00 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
1df10 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c  case_glob(zGlob,
1df20 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  z) ) return 1;. 
1df30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1df40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1df50 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20   if( c=='?' ){. 
1df60 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29       if( (*(z++)
1df70 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1df80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
1df90 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69  =='[' ){.      i
1dfa0 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  nt prior_c = 0;.
1dfb0 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a        seen = 0;.
1dfc0 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
1dfd0 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b  ;.      c = *(z+
1dfe0 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +);.      if( c=
1dff0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e000 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
1e010 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  b++);.      if( 
1e020 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20  c2=='^' ){.     
1e030 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
1e040 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
1e050 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
1e060 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d        if( c2==']
1e070 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
1e080 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
1e090 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
1e0a0 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1e0b0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
1e0c0 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20  ( c2 && c2!=']' 
1e0d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
1e0e0 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b  2=='-' && zGlob[
1e0f0 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62  0]!=']' && zGlob
1e100 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [0]!=0 && prior_
1e110 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
1e120 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
1e130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e140 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c  c>=prior_c && c<
1e150 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  =c2 ) seen = 1;.
1e160 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
1e170 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1e180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e190 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
1e1a0 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
1e1b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
1e1c0 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
1e1d0 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d   = c2;.        }
1e1e0 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
1e1f0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1e200 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
1e210 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76  0 || (seen ^ inv
1e220 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ert)==0 ) return
1e230 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1e240 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20  ( c=='#' ){.    
1e250 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27    if( (z[0]=='-'
1e260 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26   || z[0]=='+') &
1e270 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20  & IsDigit(z[1]) 
1e280 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
1e290 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20   !IsDigit(z[0]) 
1e2a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e2b0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69    z++;.      whi
1e2c0 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d  le( IsDigit(z[0]
1e2d0 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
1e2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1e2f0 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72   c!=(*(z++)) ) r
1e300 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e310 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70   }.  while( IsSp
1e320 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  ace(*z) ){ z++; 
1e330 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
1e340 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
1e350 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20 61  are the string a
1e360 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  s a command-line
1e370 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74   option with eit
1e380 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a  her one or two.*
1e390 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68  * initial "-" ch
1e3a0 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
1e3b0 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61  tic int optionMa
1e3c0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1e3d0 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
1e3e0 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a   *zOpt){.  if( z
1e3f0 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65  Str[0]!='-' ) re
1e400 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b  turn 0;.  zStr++
1e410 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d  ;.  if( zStr[0]=
1e420 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20  ='-' ) zStr++;. 
1e430 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a   return strcmp(z
1e440 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d  Str, zOpt)==0;.}
1e450 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1e460 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68   file..*/.int sh
1e470 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f  ellDeleteFile(co
1e480 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e490 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame){.  int rc;.
1e4a0 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
1e4b0 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
1e4c0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
1e4d0 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
1e4e0 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77  name);.  rc = _w
1e4f0 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c  unlink(z);.  sql
1e500 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
1e510 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e  lse.  rc = unlin
1e520 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  k(zFilename);.#e
1e530 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
1e540 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1e550 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1e560 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
1e570 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
1e580 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
1e590 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
1e5a0 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
1e5b0 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
1e5c0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
1e5d0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
1e5e0 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
1e5f0 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
1e600 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
1e610 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
1e620 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
1e630 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
1e640 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
1e650 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
1e660 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
1e670 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
1e680 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
1e690 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
1e6a0 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
1e6b0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
1e6c0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
1e6d0 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
1e6e0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
1e6f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
1e700 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
1e710 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
1e720 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
1e730 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
1e740 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
1e750 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
1e760 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
1e770 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
1e780 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
1e790 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
1e7a0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
1e7b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
1e7c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
1e7d0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1e7e0 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
1e7f0 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
1e800 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
1e810 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
1e820 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
1e830 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
1e840 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1e850 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
1e860 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
1e870 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
1e880 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
1e890 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1e8a0 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
1e8b0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1e8c0 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
1e8d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
1e8e0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
1e8f0 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
1e900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1e910 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
1e920 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
1e930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1e940 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
1e950 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
1e960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
1e970 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
1e980 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
1e990 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
1e9a0 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
1e9b0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
1e9c0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
1e9d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1e9e0 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
1e9f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1ea00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1ea10 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
1ea20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
1ea30 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1ea40 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1ea50 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
1ea60 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1ea70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1ea80 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
1ea90 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
1eaa0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1eab0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
1eac0 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
1ead0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1eae0 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
1eaf0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
1eb00 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
1eb10 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1eb20 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
1eb30 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
1eb40 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
1eb50 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
1eb60 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1eb70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
1eb90 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1eba0 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
1ebb0 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
1ebc0 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
1ebd0 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
1ebe0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
1ebf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ec00 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
1ec10 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
1ec20 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
1ec30 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
1ec40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
1ec50 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
1ec60 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
1ec70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1ec80 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
1ec90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1eca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1ecb0 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
1ecc0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1ecd0 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
1ece0 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
1ecf0 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
1ed00 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
1ed10 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
1ed20 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
1ed30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ed40 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
1ed50 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
1ed60 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed80 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
1ed90 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
1eda0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
1edb0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1ede0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
1edf0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1ee00 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
1ee10 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
1ee20 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
1ee30 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
1ee40 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
1ee50 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
1ee60 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
1ee70 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
1ee80 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
1ee90 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
1eea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1eeb0 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
1eec0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1eed0 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
1eee0 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
1eef0 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
1ef00 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
1ef10 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
1ef40 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
1ef50 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
1ef60 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
1ef70 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
1ef80 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
1ef90 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
1efa0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1efd0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1efe0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
1eff0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
1f000 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
1f010 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
1f020 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
1f030 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
1f040 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
1f050 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
1f060 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
1f070 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
1f080 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
1f090 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
1f0a0 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
1f0b0 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
1f0c0 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
1f0d0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1f0e0 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
1f0f0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
1f100 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1f110 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
1f120 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
1f130 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
1f140 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
1f150 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
1f160 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
1f170 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
1f180 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
1f190 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
1f1a0 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
1f1b0 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
1f1c0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
1f1d0 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
1f1e0 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
1f1f0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
1f200 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
1f210 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
1f220 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
1f230 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
1f240 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
1f250 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
1f260 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
1f270 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
1f280 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
1f290 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
1f2a0 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
1f2b0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
1f2c0 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
1f2d0 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
1f2e0 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
1f2f0 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
1f300 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
1f310 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
1f320 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
1f330 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
1f340 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1f350 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
1f360 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
1f370 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
1f380 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
1f390 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
1f3a0 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
1f3b0 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
1f3c0 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
1f3d0 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
1f3e0 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
1f3f0 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
1f400 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
1f410 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1f420 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
1f430 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
1f440 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
1f450 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
1f460 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
1f470 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
1f480 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
1f490 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1f4a0 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
1f4b0 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
1f4c0 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
1f4d0 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
1f4e0 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
1f4f0 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
1f500 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
1f510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f520 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
1f530 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
1f540 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
1f550 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
1f560 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
1f570 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
1f580 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
1f590 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
1f5a0 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
1f5b0 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
1f5c0 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
1f5d0 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
1f5e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f5f0 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
1f600 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
1f610 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1f620 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
1f630 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
1f640 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
1f650 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
1f660 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
1f670 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
1f680 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
1f690 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
1f6a0 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
1f6b0 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
1f6c0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
1f6d0 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
1f6e0 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
1f6f0 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
1f700 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
1f710 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
1f720 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
1f730 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
1f740 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
1f750 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
1f760 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
1f770 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
1f780 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
1f790 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
1f7a0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
1f7b0 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
1f7c0 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
1f7d0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
1f7e0 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
1f7f0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
1f800 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
1f810 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
1f820 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
1f830 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
1f840 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
1f850 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
1f860 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
1f870 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
1f880 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
1f890 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
1f8a0 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
1f8b0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
1f8c0 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
1f8d0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
1f8e0 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
1f8f0 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
1f900 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
1f910 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
1f920 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
1f930 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
1f940 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
1f950 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
1f960 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
1f970 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
1f980 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
1f990 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
1f9a0 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
1f9b0 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
1f9c0 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
1f9d0 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
1f9e0 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
1f9f0 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
1fa00 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
1fa10 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
1fa20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
1fa30 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
1fa40 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
1fa50 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
1fa60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
1fa70 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
1fa80 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
1fa90 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1faa0 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
1fab0 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
1fac0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
1fad0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
1fae0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
1faf0 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
1fb00 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
1fb10 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
1fb20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
1fb30 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
1fb40 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
1fb50 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
1fb60 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
1fb70 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
1fb80 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
1fb90 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
1fba0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
1fbb0 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
1fbc0 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
1fbd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
1fbe0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
1fbf0 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
1fc00 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
1fc10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
1fc20 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
1fc30 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
1fc40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1fc50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
1fc60 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
1fc70 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
1fc80 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
1fc90 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
1fca0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1fcb0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
1fcc0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
1fcd0 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
1fce0 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
1fcf0 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
1fd00 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
1fd10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fd20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1fd30 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1fd40 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
1fd50 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
1fd60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fd70 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1fd80 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
1fd90 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
1fda0 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
1fdb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fdc0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
1fdd0 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
1fde0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
1fdf0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1fe00 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
1fe10 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
1fe20 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
1fe30 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
1fe40 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
1fe50 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
1fe60 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1fe70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1fe80 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
1fe90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
1fea0 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
1feb0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1fec0 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
1fed0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1fee0 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
1fef0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1ff00 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1ff10 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
1ff20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
1ff30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1ff40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1ff50 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
1ff60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1ff70 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
1ff80 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1ff90 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
1ffa0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ffb0 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
1ffc0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1ffd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
1ffe0 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
1fff0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
20000 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
20010 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
20020 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20030 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
20040 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
20050 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
20060 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
20070 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20080 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
20090 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
200a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
200b0 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
200c0 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
200d0 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
200e0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
200f0 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
20100 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
20110 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
20120 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
20130 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20140 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
20150 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
20160 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
20170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20180 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
20190 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
201a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
201b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
201c0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
201d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
201e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
201f0 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
20200 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
20210 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
20220 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
20230 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
20240 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
20250 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
20260 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
20270 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
20280 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
20290 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
202a0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
202b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
202c0 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
202d0 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
202e0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
202f0 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
20300 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
20310 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
20320 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
20330 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
20340 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
20350 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
20360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20370 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
20380 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
20390 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
203a0 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
203b0 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
203c0 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
203d0 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
203e0 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
203f0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
20400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20410 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20420 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
20430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20450 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20460 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
20470 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
20480 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
20490 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
204a0 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
204b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
204c0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
204d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
204e0 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
204f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
20500 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
20510 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
20520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
20530 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20540 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
20550 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
20560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20570 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
20580 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
20590 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
205a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
205b0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
205c0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
205d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
205e0 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
205f0 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
20600 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20620 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
20630 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
20640 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
20650 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
20680 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
20690 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
206a0 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
206b0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
206c0 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
206d0 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
206e0 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
206f0 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
20700 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
20710 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
20720 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
20730 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
20740 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
20750 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20760 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
20770 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
20780 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
20790 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
207a0 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
207b0 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
207c0 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
207d0 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
207e0 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
207f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20800 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
20810 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
20820 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
20830 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
20840 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
20850 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33  zSql, .  sqlite3
20860 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29  _stmt **ppStmt.)
20870 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  {.  *ppStmt = 0;
20880 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
20890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
208a0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
208b0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
208c0 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
208d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
208e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
208f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
20900 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72  derr, "sql error
20910 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20  : %s (%d)\n", . 
20920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20930 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c  _errmsg(db), sql
20940 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
20950 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
20960 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  *pRc = rc;.    }
20970 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
20980 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
20990 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  Printf(.  sqlite
209a0 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
209b0 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
209c0 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
209d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
209e0 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70  , .  ....){.  *p
209f0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
20a00 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
20a10 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
20a20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ap;.    char *z;
20a30 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
20a40 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d  , zFmt);.    z =
20a50 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
20a60 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  f(zFmt, ap);.   
20a70 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
20a80 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
20a90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
20aa0 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72  e{.      shellPr
20ab0 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a  epare(db, pRc, z
20ac0 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  , ppStmt);.     
20ad0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
20ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
20af0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
20b00 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20  Finalize(.  int 
20b10 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
20b20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
20b30 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
20b40 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
20b50 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
20b60 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  le(pStmt);.    i
20b70 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
20b80 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
20b90 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  .    if( *pRc==S
20ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20bb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
20bd0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20be0 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73  , "SQL error: %s
20bf0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
20c00 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
20c10 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  }.      *pRc = r
20c20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  c;.    }.  }.}..
20c30 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
20c40 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70  lReset(.  int *p
20c50 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
20c60 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
20c70 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
20c80 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
20c90 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
20ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
20cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
20cd0 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
20ce0 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
20cf0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
20d00 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
20d10 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
20d20 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
20d30 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d      }.    *pRc =
20d40 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a   rc;.  }.}../* .
20d50 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70  ** Structure rep
20d60 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67  resenting a sing
20d70 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  le ".ar" command
20d80 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
20d90 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72  uct ArCommand Ar
20da0 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20  Command;.struct 
20db0 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e  ArCommand {.  in
20dc0 74 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  t eCmd;         
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20de0 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c   An AR_CMD_* val
20df0 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ue */.  const ch
20e00 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
20e10 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
20e20 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
20e30 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
20e40 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
20e50 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
20e60 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
20e70 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
20e80 6e 74 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20  nt bVerbose;    
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ea0 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
20eb0 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 62 5a 69  ose */.  int bZi
20ec0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
20ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20ee0 20 69 66 20 2d 2d 7a 69 70 20 2a 2f 0a 20 20 69   if --zip */.  i
20ef0 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d  * Number of comm
20f20 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
20f30 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b  .  char **azArg;
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f50 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
20f60 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
20f70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
20f80 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73  int a usage mess
20f90 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
20fa0 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
20fb0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  r and return SQL
20fc0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
20fd0 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65  atic int arUsage
20fe0 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 72 61 77  (FILE *f){.  raw
20ff0 5f 70 72 69 6e 74 66 28 66 2c 0a 22 5c 6e 22 0a  _printf(f,."\n".
21000 22 55 73 61 67 65 3a 20 2e 61 72 20 5b 4f 50 54  "Usage: .ar [OPT
21010 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45 2e 2e 2e  ION...] [FILE...
21020 5d 5c 6e 22 0a 22 54 68 65 20 2e 61 72 20 63 6f  ]\n"."The .ar co
21030 6d 6d 61 6e 64 20 6d 61 6e 61 67 65 73 20 73 71  mmand manages sq
21040 6c 61 72 20 61 72 63 68 69 76 65 73 2e 5c 6e 22  lar archives.\n"
21050 0a 22 5c 6e 22 0a 22 45 78 61 6d 70 6c 65 73 3a  ."\n"."Examples:
21060 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 63 66 20 61  \n"."  .ar -cf a
21070 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20 62  rchive.sar foo b
21080 61 72 20 20 20 20 23 20 43 72 65 61 74 65 20 61  ar    # Create a
21090 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20  rchive.sar from 
210a0 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61  files foo and ba
210b0 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 74 66 20  r\n"."  .ar -tf 
210c0 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20  archive.sar     
210d0 20 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d 65         # List me
210e0 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69 76 65  mbers of archive
210f0 2e 73 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d  .sar\n"."  .ar -
21100 78 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  xvf archive.sar 
21110 20 20 20 20 20 20 20 20 20 20 23 20 56 65 72 62            # Verb
21120 6f 73 65 6c 79 20 65 78 74 72 61 63 74 20 66 69  osely extract fi
21130 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65  les from archive
21140 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a 22 45 61  .sar\n"."\n"."Ea
21150 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ch command line 
21160 6d 75 73 74 20 66 65 61 74 75 72 65 20 65 78 61  must feature exa
21170 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64  ctly one command
21180 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22 20 20 2d   option:\n"."  -
21190 63 2c 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20  c, --create     
211a0 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65            Create
211b0 20 61 20 6e 65 77 20 61 72 63 68 69 76 65 5c 6e   a new archive\n
211c0 22 0a 22 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74  "."  -u, --updat
211d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
211e0 55 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69  Update or add fi
211f0 6c 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69  les to an existi
21200 6e 67 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20  ng archive\n"." 
21210 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20 20 20 20   -t, --list     
21220 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
21230 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 63   contents of arc
21240 68 69 76 65 5c 6e 22 0a 22 20 20 2d 78 2c 20 2d  hive\n"."  -x, -
21250 2d 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20  -extract        
21260 20 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69        Extract fi
21270 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65  les from archive
21280 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64 20 7a 65  \n"."\n"."And ze
21290 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 74 69 6f  ro or more optio
212a0 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c 6e 22 0a  nal options:\n".
212b0 22 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65  "  -v, --verbose
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
212d0 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d  int each filenam
212e0 65 20 61 73 20 69 74 20 69 73 20 70 72 6f 63 65  e as it is proce
212f0 73 73 65 64 5c 6e 22 0a 22 20 20 2d 66 20 46 49  ssed\n"."  -f FI
21300 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20  LE, --file FILE 
21310 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e        Operate on
21320 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64   archive FILE (d
21330 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e  efault is curren
21340 74 20 64 62 29 5c 6e 22 0a 22 20 20 2d 43 20 44  t db)\n"."  -C D
21350 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20  IR, --directory 
21360 44 49 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f  DIR    Change to
21370 20 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 74   directory DIR t
21380 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74 20 66  o read/extract f
21390 69 6c 65 73 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65  iles\n"."\n"."Se
213a0 65 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73  e also: http://s
213b0 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74  qlite.org/cli.ht
213c0 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65  ml#sqlar_archive
213d0 5f 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22  _support\n"."\n"
213e0 0a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .);.  return SQL
213f0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
21400 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
21410 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  or message for t
21420 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74  he .ar command t
21430 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
21440 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
21450 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
21460 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 63  int arErrorMsg(c
21470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
21480 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
21490 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
214a0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
214b0 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  Fmt);.  z = sqli
214c0 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
214d0 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
214e0 28 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  (ap);.  raw_prin
214f0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
21500 72 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61 72  r: %s (try \".ar
21510 20 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20 7a   --help\")\n", z
21520 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
21530 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
21540 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
21550 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
21560 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
21570 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
21580 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
21590 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
215a0 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a  _EXTRACT      2.
215b0 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c  #define AR_CMD_L
215c0 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64  IST         3.#d
215d0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44  efine AR_CMD_UPD
215e0 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66  ATE       4.#def
215f0 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
21600 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a          5../*.**
21610 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
21620 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
21630 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
21640 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 36 0a  TCH_VERBOSE   6.
21650 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
21660 48 5f 46 49 4c 45 20 20 20 20 20 20 37 0a 23 64  H_FILE      7.#d
21670 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
21680 44 49 52 45 43 54 4f 52 59 20 38 0a 23 64 65 66  DIRECTORY 8.#def
21690 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49  ine AR_SWITCH_ZI
216a0 50 20 20 20 20 20 20 20 39 0a 0a 73 74 61 74 69  P       9..stati
216b0 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53  c int arProcessS
216c0 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20  witch(ArCommand 
216d0 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63  *pAr, int eSwitc
216e0 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
216f0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
21700 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63  eSwitch ){.    c
21710 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
21720 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
21730 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
21740 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
21750 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
21760 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61  D_UPDATE:.    ca
21770 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
21780 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
21790 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
217a0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
217b0 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61  ("multiple comma
217c0 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
217d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
217e0 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
217f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
21800 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
21810 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
21820 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
21830 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
21840 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
21850 54 43 48 5f 5a 49 50 3a 0a 20 20 20 20 20 20 70  TCH_ZIP:.      p
21860 41 72 2d 3e 62 5a 69 70 20 3d 20 31 3b 0a 20 20  Ar->bZip = 1;.  
21870 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
21880 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46  case AR_SWITCH_F
21890 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ILE:.      pAr->
218a0 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  zFile = zArg;.  
218b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
218c0 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ase AR_SWITCH_DI
218d0 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70  RECTORY:.      p
218e0 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b  Ar->zDir = zArg;
218f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21900 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
21910 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21920 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
21930 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e  d line for an ".
21940 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  ar" command. The
21950 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
21960 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72  tten into.** str
21970 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53  ucture (*pAr). S
21980 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21990 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d  rned if the comm
219a0 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73  and line is pars
219b0 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  ed.** successful
219c0 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ly, otherwise an
219d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
219e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64  s written to std
219f0 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  err and .** SQLI
21a00 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65  TE_ERROR returne
21a10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21a20 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
21a30 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
21a60 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
21a70 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
21a80 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21ab0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
21ac0 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61  g[] */.  ArComma
21ad0 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
21ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
21af0 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
21b00 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
21b10 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63  ArSwitch {.    c
21b20 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20  har cShort;.    
21b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e  const char *zLon
21b40 67 3b 0a 20 20 20 20 69 6e 74 20 65 53 77 69 74  g;.    int eSwit
21b50 63 68 3b 0a 20 20 20 20 69 6e 74 20 62 41 72 67  ch;.    int bArg
21b60 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20  ;.  } aSwitch[] 
21b70 3d 20 7b 0a 20 20 20 20 7b 20 27 63 27 2c 20 22  = {.    { 'c', "
21b80 63 72 65 61 74 65 22 2c 20 20 20 20 41 52 5f 43  create",    AR_C
21b90 4d 44 5f 43 52 45 41 54 45 2c 20 30 20 7d 2c 0a  MD_CREATE, 0 },.
21ba0 20 20 20 20 7b 20 27 78 27 2c 20 22 65 78 74 72      { 'x', "extr
21bb0 61 63 74 22 2c 20 20 20 41 52 5f 43 4d 44 5f 45  act",   AR_CMD_E
21bc0 58 54 52 41 43 54 2c 20 30 20 7d 2c 0a 20 20 20  XTRACT, 0 },.   
21bd0 20 7b 20 27 74 27 2c 20 22 6c 69 73 74 22 2c 20   { 't', "list", 
21be0 20 20 20 20 20 41 52 5f 43 4d 44 5f 4c 49 53 54       AR_CMD_LIST
21bf0 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 75 27  , 0 },.    { 'u'
21c00 2c 20 22 75 70 64 61 74 65 22 2c 20 20 20 20 41  , "update",    A
21c10 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 30 20  R_CMD_UPDATE, 0 
21c20 7d 2c 0a 20 20 20 20 7b 20 27 68 27 2c 20 22 68  },.    { 'h', "h
21c30 65 6c 70 22 2c 20 20 20 20 20 20 41 52 5f 43 4d  elp",      AR_CM
21c40 44 5f 48 45 4c 50 2c 20 30 20 7d 2c 0a 20 20 20  D_HELP, 0 },.   
21c50 20 7b 20 27 76 27 2c 20 22 76 65 72 62 6f 73 65   { 'v', "verbose
21c60 22 2c 20 20 20 41 52 5f 53 57 49 54 43 48 5f 56  ",   AR_SWITCH_V
21c70 45 52 42 4f 53 45 2c 20 30 20 7d 2c 0a 20 20 20  ERBOSE, 0 },.   
21c80 20 7b 20 27 66 27 2c 20 22 66 69 6c 65 22 2c 20   { 'f', "file", 
21c90 20 20 20 20 20 41 52 5f 53 57 49 54 43 48 5f 46       AR_SWITCH_F
21ca0 49 4c 45 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20  ILE, 1 },.    { 
21cb0 27 43 27 2c 20 22 64 69 72 65 63 74 6f 72 79 22  'C', "directory"
21cc0 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  , AR_SWITCH_DIRE
21cd0 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20  CTORY, 1 },.    
21ce0 7b 20 27 7a 27 2c 20 22 7a 69 70 22 2c 20 20 20  { 'z', "zip",   
21cf0 20 20 20 20 41 52 5f 53 57 49 54 43 48 5f 5a 49      AR_SWITCH_ZI
21d00 50 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  P, 0 }.  };.  in
21d10 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65  t nSwitch = size
21d20 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69  of(aSwitch) / si
21d30 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77  zeof(struct ArSw
21d40 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20  itch);.  struct 
21d50 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d  ArSwitch *pEnd =
21d60 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63   &aSwitch[nSwitc
21d70 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c  h];..  if( nArg<
21d80 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =1 ){.    return
21d90 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29   arUsage(stderr)
21da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
21db0 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31  har *z = azArg[1
21dc0 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 41  ];.    memset(pA
21dd0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 72 43  r, 0, sizeof(ArC
21de0 6f 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20 69  ommand));..    i
21df0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
21e00 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69        /* Traditi
21e10 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d  onal style [tar]
21e20 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
21e30 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
21e40 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a    int iArg = 2;.
21e50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
21e60 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
21e70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21e80 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
21e90 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
21ea0 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20   *pOpt;.        
21eb0 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63  for(pOpt=&aSwitc
21ec0 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b  h[0]; pOpt<pEnd;
21ed0 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20   pOpt++){.      
21ee0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
21ef0 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
21f00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
21f10 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d        if( pOpt==
21f20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
21f30 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
21f40 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Msg("unrecognize
21f50 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
21f60 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
21f70 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
21f80 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
21f90 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41      if( iArg>=nA
21fa0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
21fb0 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
21fc0 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75  Msg("option requ
21fd0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
21fe0 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20  : %c",z[i]);.   
21ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22000 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
22010 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  iArg++];.       
22020 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
22030 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
22040 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
22050 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
22060 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
22070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
22080 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
22090 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Arg;.      if( p
220a0 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20  Ar->nArg>0 ){.  
220b0 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
220c0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
220d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
220e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e  se{.      /* Non
220f0 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76  -traditional inv
22100 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
22110 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20   int iArg;.     
22120 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72   for(iArg=1; iAr
22130 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b  g<nArg; iArg++){
22140 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
22150 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72          z = azAr
22160 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
22170 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
22180 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
22190 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
221a0 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20  mand line words 
221b0 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
221c0 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ments. */.      
221d0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
221e0 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
221f0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
22200 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
22210 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22230 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
22240 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  z);..        if(
22250 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[1]!='-' ){.  
22260 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
22270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
22280 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70  or more short op
22290 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  tions */.       
222a0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b     for(i=1; i<n;
222b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
222c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
222d0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
222e0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
222f0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
22300 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
22310 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
22320 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
22330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22340 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e  if( z[i]==pOpt->
22350 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a  cShort ) break;.
22360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
22380 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
22390 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
223a0 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72   arErrorMsg("unr
223b0 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
223c0 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b 0a  : %c\n", z[i]);.
223d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
223e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
223f0 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
22400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
22410 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  (n-1) ){.       
22420 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
22430 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  &z[i+1];.       
22440 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a           i = n;.
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
22460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22470 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
22480 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
224a0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
224b0 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
224c0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 5c  an argument: %c\
224d0 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  n",z[i]);.      
224e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
224f0 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
22500 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d   = azArg[++iArg]
22510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22520 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
22530 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22540 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
22550 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74  pAr, pOpt->eSwit
22560 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
22570 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
22580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
225a0 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20  [2]=='\0' ){.   
225b0 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f         /* A -- o
225c0 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e  ption, indicatin
225d0 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69  g that all remai
225e0 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ning command lin
225f0 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20  e words.        
22600 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64    ** are command
22610 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a   arguments.  */.
22620 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61            pAr->a
22630 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
22640 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg+1];.         
22650 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
22660 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20  g-iArg-1;.      
22670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22690 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70      /* A long op
226a0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
226b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
226c0 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rg = 0;         
226d0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
226e0 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61  for option, if a
226f0 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ny */.          
22700 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
22710 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20  *pMatch = 0;    
22720 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70    /* Matching op
22730 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
22740 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
22750 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20  h *pOpt;        
22760 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
22770 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
22780 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30  (pOpt=&aSwitch[0
22790 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f  ]; pOpt<pEnd; pO
227a0 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
227b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
227c0 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f  Long = pOpt->zLo
227d0 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
227e0 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65  if( (n-2)<=strle
227f0 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d  n30(zLong) && 0=
22800 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a  =memcmp(&z[2], z
22810 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20  Long, n-2) ){.  
22820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22830 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  pMatch ){.      
22840 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22850 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61 6d 62   arErrorMsg("amb
22860 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25  iguous option: %
22870 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  s",z);.         
22880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22890 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
228a0 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20  ch = pOpt;.     
228b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
228c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
228d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
228e0 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b  if( pMatch==0 ){
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22900 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
22910 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
22920 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ion: %s", z);.  
22930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22940 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e      if( pMatch->
22950 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
22960 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
22970 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
22980 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
22990 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f  rErrorMsg("optio
229a0 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
229b0 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b  gument: %s", z);
229c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
229d0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
229e0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
229f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22a00 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
22a10 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
22a20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c  pMatch->eSwitch,
22a30 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
22a40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
22a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22a80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22a90 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
22aa0 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73  at all arguments
22ab0 20 77 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f   within the ArCo
22ac0 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a  mmand.azArg[].**
22ad0 20 61 72 72 61 79 20 72 65 66 65 72 20 74 6f 20   array refer to 
22ae0 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c  archive members,
22af0 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78   as for the --ex
22b00 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20  tract or --list 
22b10 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74  commands. .** It
22b20 20 63 68 65 63 6b 73 20 74 68 61 74 20 65 61 63   checks that eac
22b30 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72  h of them are pr
22b40 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70  esent. If any sp
22b50 65 63 69 66 69 65 64 20 66 69 6c 65 20 69 73 20  ecified file is 
22b60 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69  not.** present i
22b70 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61  n the archive, a
22b80 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74  n error is print
22b90 65 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ed to stderr and
22ba0 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   an error.** cod
22bb0 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  e returned. Othe
22bc0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70  rwise, if all sp
22bd0 65 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74  ecified argument
22be0 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
22bf0 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c  .** the archive,
22c00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22c10 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
22c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69  is function stri
22c30 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ps any trailing 
22c40 27 2f 27 20 63 68 61 72 61 63 74 65 72 73 20 66  '/' characters f
22c50 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e  rom each argumen
22c60 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  t..** This is co
22c70 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
22c80 65 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20  e way the [tar] 
22c90 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f  command seems to
22ca0 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75   work on.** Linu
22cb0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
22cc0 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
22cd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43  sqlite3 *db, ArC
22ce0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
22cf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22d00 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e  OK;.  if( pAr->n
22d10 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Arg ){.    int i
22d20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
22d30 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a  mt *pTest = 0;..
22d40 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
22d50 50 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20  Printf(db, &rc, 
22d60 26 70 54 65 73 74 2c 20 22 53 45 4c 45 43 54 20  &pTest, "SELECT 
22d70 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45  name FROM %s WHE
22d80 52 45 20 6e 61 6d 65 3d 3f 31 22 2c 20 0a 20 20  RE name=?1", .  
22d90 20 20 20 20 20 20 70 41 72 2d 3e 62 5a 69 70 20        pAr->bZip 
22da0 3f 20 22 7a 69 70 66 69 6c 65 28 3f 32 29 22 20  ? "zipfile(?2)" 
22db0 3a 20 22 73 71 6c 61 72 22 0a 20 20 20 20 29 3b  : "sqlar".    );
22dc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22dd0 49 54 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e 62  ITE_OK && pAr->b
22de0 5a 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Zip ){.      sql
22df0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
22e00 54 65 73 74 2c 20 32 2c 20 70 41 72 2d 3e 7a 46  Test, 2, pAr->zF
22e10 69 6c 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ile, -1, SQLITE_
22e20 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
22e30 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
22e40 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
22e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
22e60 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
22e70 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d   = pAr->azArg[i]
22e80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
22e90 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
22ea0 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a     int bOk = 0;.
22eb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30        while( n>0
22ec0 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
22ed0 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e  ) n--;.      z[n
22ee0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
22ef0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
22f00 74 28 70 54 65 73 74 2c 20 31 2c 20 7a 2c 20 2d  t(pTest, 1, z, -
22f10 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
22f20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
22f30 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
22f40 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a  _step(pTest) ){.
22f50 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
22f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22f70 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
22f80 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Test);.      if(
22f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22fa0 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
22fb0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
22fc0 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
22fd0 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
22fe0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
22ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
23000 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
23010 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
23020 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
23030 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
23040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d  c;.}../*.** Form
23050 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  at a WHERE claus
23060 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
23070 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22  ed against the "
23080 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a  sqlar" table to.
23090 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20  ** identify all 
230a0 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
230b0 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63  that match the c
230c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
230d0 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41   held.** in (*pA
230e0 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57  r). Leave this W
230f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28  HERE clause in (
23100 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65  *pzWhere) before
23110 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54   returning..** T
23120 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
23130 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65  ponsible for eve
23140 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20  ntually calling 
23150 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f  sqlite3_free() o
23160 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c  n.** any non-NUL
23170 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c  L (*pzWhere) val
23180 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
23190 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  id arWhereClause
231a0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
231b0 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
231c0 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65   .  char **pzWhe
231d0 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
231e0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
231f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
23200 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ){.  char *zWher
23210 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  e = 0;.  if( *pR
23220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23230 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
23240 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57  g==0 ){.      zW
23250 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
23260 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20  printf("1");.   
23270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
23280 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t i;.      const
23290 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
232a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
232b0 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b   i<pAr->nArg; i+
232c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
232d0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d  t char *z = pAr-
232e0 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
232f0 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
23300 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
23310 20 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e           "%z%s n
23320 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 6e 61  ame = '%q' OR na
23330 6d 65 20 42 45 54 57 45 45 4e 20 27 25 71 2f 27  me BETWEEN '%q/'
23340 20 41 4e 44 20 27 25 71 30 27 22 2c 20 0a 20 20   AND '%q0'", .  
23350 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
23360 2c 20 7a 53 65 70 2c 20 7a 2c 20 7a 2c 20 7a 0a  , zSep, z, z, z.
23370 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
23380 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
23390 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
233a0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
233b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
233c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
233d0 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
233e0 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
233f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
23400 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
23410 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
23420 74 20 7a 4d 6f 64 65 20 6d 75 73 74 20 70 6f 69  t zMode must poi
23430 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  nt to a buffer a
23440 74 20 6c 65 61 73 74 20 31 31 20 62 79 74 65 73  t least 11 bytes
23450 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 0a 2a   in size. This.*
23460 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  * function popul
23470 61 74 65 73 20 74 68 69 73 20 62 75 66 66 65 72  ates this buffer
23480 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
23490 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
234a0 6f 66 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 66  of.** the unix f
234b0 69 6c 65 20 6d 6f 64 65 20 70 61 73 73 65 64 20  ile mode passed 
234c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
234d0 67 75 6d 65 6e 74 20 28 65 2e 67 2e 20 22 64 72  gument (e.g. "dr
234e0 77 78 72 2d 78 72 2d 78 22 29 2e 0a 2a 2f 0a 73  wxr-xr-x")..*/.s
234f0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
23500 4d 6f 64 65 54 6f 53 74 72 69 6e 67 28 63 68 61  ModeToString(cha
23510 72 20 2a 7a 4d 6f 64 65 2c 20 69 6e 74 20 6d 6f  r *zMode, int mo
23520 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  de){.  int i;.. 
23530 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
23540 73 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 5b 6d  s copied from [m
23550 61 6e 20 32 20 73 74 61 74 5d 20 2a 2f 0a 20 20  an 2 stat] */.  
23560 69 66 28 20 6d 6f 64 65 20 26 20 30 30 34 30 30  if( mode & 00400
23570 30 30 20 29 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b  00 ){.    zMode[
23580 30 5d 20 3d 20 27 64 27 3b 0a 20 20 7d 65 6c 73  0] = 'd';.  }els
23590 65 20 69 66 28 20 28 6d 6f 64 65 20 26 20 30 31  e if( (mode & 01
235a0 32 30 30 30 30 29 3d 3d 30 31 32 30 30 30 30 20  20000)==0120000 
235b0 29 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30 5d 20  ){.    zMode[0] 
235c0 3d 20 27 6c 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 'l';.  }else{.
235d0 20 20 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20 27      zMode[0] = '
235e0 2d 27 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  -';.  }..  for(i
235f0 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20  =0; i<3; i++){. 
23600 20 20 20 69 6e 74 20 6d 20 3d 20 28 6d 6f 64 65     int m = (mode
23610 20 3e 3e 20 28 28 32 2d 69 29 2a 33 29 29 3b 0a   >> ((2-i)*3));.
23620 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26 7a      char *a = &z
23630 4d 6f 64 65 5b 31 20 2b 20 69 2a 33 5d 3b 0a 20  Mode[1 + i*3];. 
23640 20 20 20 61 5b 30 5d 20 3d 20 28 6d 20 26 20 30     a[0] = (m & 0
23650 78 34 29 20 3f 20 27 72 27 20 3a 20 27 2d 27 3b  x4) ? 'r' : '-';
23660 0a 20 20 20 20 61 5b 31 5d 20 3d 20 28 6d 20 26  .    a[1] = (m &
23670 20 30 78 32 29 20 3f 20 27 77 27 20 3a 20 27 2d   0x2) ? 'w' : '-
23680 27 3b 0a 20 20 20 20 61 5b 32 5d 20 3d 20 28 6d  ';.    a[2] = (m
23690 20 26 20 30 78 31 29 20 3f 20 27 78 27 20 3a 20   & 0x1) ? 'x' : 
236a0 27 2d 27 3b 0a 20 20 7d 0a 20 20 7a 4d 6f 64 65  '-';.  }.  zMode
236b0 5b 31 30 5d 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a  [10] = '\0';.}..
236c0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
236d0 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73  tion of .ar "lis
236e0 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  T" command. .*/.
236f0 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73  static int arLis
23700 74 43 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74  tCommand(ShellSt
23710 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20  ate *p, sqlite3 
23720 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  *db, ArCommand *
23730 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pAr){.  const ch
23740 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
23750 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48  CT %s FROM %s WH
23760 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73  ERE %s"; .  cons
23770 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 28  t char *zTbl = (
23780 70 41 72 2d 3e 62 5a 69 70 20 3f 20 22 7a 69 70  pAr->bZip ? "zip
23790 66 69 6c 65 28 3f 29 22 20 3a 20 22 73 71 6c 61  file(?)" : "sqla
237a0 72 22 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  r");.  const cha
237b0 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a  r *azCols[] = {.
237c0 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20      "name",.    
237d0 22 6d 6f 64 65 2c 20 73 7a 2c 20 64 61 74 65 74  "mode, sz, datet
237e0 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78  ime(mtime, 'unix
237f0 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20  epoch'), name". 
23800 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68   };..  char *zWh
23810 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ere = 0;.  sqlit
23820 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
23830 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
23840 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72  rc = arCheckEntr
23850 69 65 73 28 64 62 2c 20 70 41 72 29 3b 0a 20 20  ies(db, pAr);.  
23860 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
23870 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
23880 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
23890 65 50 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c  ePrintf(db, &rc,
238a0 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a   &pSql, zSql, az
238b0 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f  Cols[pAr->bVerbo
238c0 73 65 5d 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72  se], zTbl, zWher
238d0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
238e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e  LITE_OK && pAr->
238f0 62 5a 69 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  bZip ){.    sqli
23900 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
23910 71 6c 2c 20 31 2c 20 70 41 72 2d 3e 7a 46 69 6c  ql, 1, pAr->zFil
23920 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  e, -1, SQLITE_TR
23930 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
23940 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23950 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
23960 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
23970 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pSql) ){.    if
23980 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20  ( pAr->bVerbose 
23990 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4d  ){.      char zM
239a0 6f 64 65 5b 31 31 5d 3b 0a 20 20 20 20 20 20 73  ode[11];.      s
239b0 68 65 6c 6c 4d 6f 64 65 54 6f 53 74 72 69 6e 67  hellModeToString
239c0 28 7a 4d 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f  (zMode, sqlite3_
239d0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
239e0 20 30 29 29 3b 0a 0a 20 20 20 20 20 20 72 61 77   0));..      raw
239f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
23a00 22 25 73 20 25 20 31 30 64 20 20 25 73 20 20 25  "%s % 10d  %s  %
23a10 73 5c 6e 22 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20  s\n", zMode,.   
23a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
23a30 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
23a40 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  1), .          s
23a50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
23a60 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20  xt(pSql, 2),.   
23a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
23a80 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23a90 20 33 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   3).      );.   
23aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
23ab0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
23ac0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
23ad0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
23ae0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20  l, 0));.    }.  
23af0 7d 0a 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  }..  shellFinali
23b00 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
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 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
23b30 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74  tion of .ar "eXt
23b40 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  ract" command. .
23b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
23b60 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 53  ExtractCommand(S
23b70 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
23b80 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43 6f 6d  lite3 *db, ArCom
23b90 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
23ba0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20  nst char *zSql1 
23bb0 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22  = .    "SELECT "
23bc0 0a 20 20 20 20 22 20 20 3a 31 20 7c 7c 20 6e 61  .    "  :1 || na
23bd0 6d 65 2c 20 22 0a 20 20 20 20 22 20 20 77 72 69  me, ".    "  wri
23be0 74 65 66 69 6c 65 28 3f 31 20 7c 7c 20 6e 61 6d  tefile(?1 || nam
23bf0 65 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69  e, %s, mode, mti
23c00 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20  me) ".    "FROM 
23c10 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41 4e  %s WHERE (%s) AN
23c20 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20  D (data IS NULL 
23c30 4f 52 20 3f 32 20 3d 20 30 29 22 3b 0a 0a 20 20  OR ?2 = 0)";..  
23c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78  const char *azEx
23c50 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20  traArg[] = { .  
23c60 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72    "sqlar_uncompr
23c70 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a  ess(data, sz)",.
23c80 20 20 20 20 22 7a 69 70 66 69 6c 65 5f 75 6e 63      "zipfile_unc
23c90 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a  ompress(data, sz
23ca0 2c 20 6d 65 74 68 6f 64 29 22 0a 20 20 7d 3b 0a  , method)".  };.
23cb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
23cc0 53 6f 75 72 63 65 5b 5d 20 3d 20 7b 0a 20 20 20  Source[] = {.   
23cd0 20 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69   "sqlar", "zipfi
23ce0 6c 65 28 3f 33 29 22 0a 20 20 7d 3b 0a 0a 0a 0a  le(?3)".  };....
23cf0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
23d00 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pSql = 0;.  int 
23d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23d20 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30    char *zDir = 0
23d30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  ;.  char *zWhere
23d40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
23d50 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
23d60 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  s are specified,
23d70 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 79   check that they
23d80 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
23d90 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
23da0 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20 70  archive before p
23db0 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66  roceeding. And f
23dc0 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45  ormulate a WHERE
23dd0 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20   clause to.  ** 
23de0 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a  match them.  */.
23df0 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
23e00 74 72 69 65 73 28 64 62 2c 20 70 41 72 29 3b 0a  tries(db, pAr);.
23e10 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28    arWhereClause(
23e20 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72  &rc, pAr, &zWher
23e30 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  e);..  if( rc==S
23e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23e50 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b  if( pAr->zDir ){
23e60 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
23e70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
23e80 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b  s/", pAr->zDir);
23e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23ea0 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33    zDir = sqlite3
23eb0 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20  _mprintf("");.  
23ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72    }.    if( zDir
23ed0 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
23ee0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
23ef0 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
23f00 74 66 28 64 62 2c 20 26 72 63 2c 20 26 70 53 71  tf(db, &rc, &pSq
23f10 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20 20  l, zSql1, .     
23f20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41 72 2d   azExtraArg[pAr-
23f30 3e 62 5a 69 70 5d 2c 20 61 7a 53 6f 75 72 63 65  >bZip], azSource
23f40 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 57 68  [pAr->bZip], zWh
23f50 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  ere.  );..  if( 
23f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23f70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
23f80 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 2c 20  d_text(pSql, 1, 
23f90 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zDir, -1, SQLITE
23fa0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
23fb0 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20  ( pAr->bZip ){. 
23fc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
23fd0 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 2c 20  d_text(pSql, 3, 
23fe0 70 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20  pAr->zFile, -1, 
23ff0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
24000 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75      }..    /* Ru
24010 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
24020 74 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68  tement twice. Th
24030 65 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72  e first time, wr
24040 69 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c  itefile() is cal
24050 6c 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  led.    ** for a
24060 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65  ll archive membe
24070 72 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  rs that should b
24080 65 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65  e extracted. The
24090 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20   second time,.  
240a0 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68    ** only for th
240b0 65 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54  e directories. T
240c0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
240d0 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f  he timestamps fo
240e0 72 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74  r.    ** extract
240f0 65 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d  ed directories m
24100 75 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74  ust be reset aft
24110 65 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75  er they are popu
24120 6c 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a  lated (as.    **
24130 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d   populating them
24140 20 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d   changes the tim
24150 65 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20  estamp).  */.   
24160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
24170 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
24180 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
24190 2c 20 32 2c 20 69 29 3b 0a 20 20 20 20 20 20 77  , 2, i);.      w
241a0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
241b0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
241c0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
241d0 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  pSql) ){.       
241e0 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72   if( i==0 && pAr
241f0 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
24200 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
24210 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
24220 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
24230 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
24240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24250 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
24260 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b  eset(&rc, pSql);
24270 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
24280 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
24290 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ql);.  }..  sqli
242a0 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a  te3_free(zDir);.
242b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
242c0 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
242d0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
242e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
242f0 20 2e 61 72 20 22 63 72 65 61 74 65 22 20 61 6e   .ar "create" an
24300 64 20 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61  d "update" comma
24310 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  nds..**.** Creat
24320 65 20 74 68 65 20 22 73 71 6c 61 72 22 20 74 61  e the "sqlar" ta
24330 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
24340 61 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  ase if it does n
24350 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
24360 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61  ..** Then add ea
24370 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61  ch file in the a
24380 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f  zFile[] array to
24390 20 74 68 65 20 61 72 63 68 69 76 65 2e 20 44 69   the archive. Di
243a0 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65  rectories.** are
243b0 20 61 64 64 65 64 20 72 65 63 75 72 73 69 76 65   added recursive
243c0 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ly. If argument 
243d0 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d  bVerbose is non-
243e0 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20  zero, a message 
243f0 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e  is.** printed on
24400 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68   stdout for each
24410 20 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a   file archived..
24420 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65  **.** The create
24430 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20   command is the 
24440 73 61 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20  same as update, 
24450 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 64  except that it d
24460 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73  rops.** any exis
24470 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62  ting "sqlar" tab
24480 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e  le before beginn
24490 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
244a0 6e 74 20 61 72 43 72 65 61 74 65 55 70 64 61 74  nt arCreateUpdat
244b0 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  e(.  ShellState 
244c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
244d0 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74       /* Shell st
244e0 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ate pointer */. 
244f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
24500 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24530 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73  ents and options
24540 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74   */.  int bUpdat
24550 65 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  e.){.  const cha
24560 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43  r *zSql = "SELEC
24570 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74  T name, mode, mt
24580 69 6d 65 2c 20 64 61 74 61 20 46 52 4f 4d 20 66  ime, data FROM f
24590 73 64 69 72 28 3f 2c 20 3f 29 22 3b 0a 20 20 63  sdir(?, ?)";.  c
245a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
245b0 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
245c0 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
245d0 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 22 0a   EXISTS sqlar(".
245e0 20 20 20 20 20 20 22 6e 61 6d 65 20 54 45 58 54        "name TEXT
245f0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d   PRIMARY KEY,  -
24600 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  - name of the fi
24610 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 6d 6f 64  le\n".      "mod
24620 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  e INT,          
24630 20 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20 70       -- access p
24640 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20  ermissions\n".  
24650 20 20 20 20 22 6d 74 69 6d 65 20 49 4e 54 2c 20      "mtime INT, 
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
24670 6c 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f  last modificatio
24680 6e 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20  n time\n".      
24690 22 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20  "sz INT,        
246a0 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67           -- orig
246b0 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e  inal file size\n
246c0 22 0a 20 20 20 20 20 20 22 64 61 74 61 20 42 4c  ".      "data BL
246d0 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
246e0 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63   -- compressed c
246f0 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 29 22 3b  ontent\n".  ")";
24700 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24710 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
24720 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
24730 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
24740 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 22 52 45  r *zInsert = "RE
24750 50 4c 41 43 45 20 49 4e 54 4f 20 73 71 6c 61 72  PLACE INTO sqlar
24760 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
24770 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 3f  sqlar_compress(?
24780 29 29 22 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ))";..  sqlite3_
24790 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
247a0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
247b0 74 6f 72 79 20 74 72 61 76 65 72 73 65 72 20 2a  tory traverser *
247c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
247d0 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 20 20   *pInsert = 0;  
247e0 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 61 74 69      /* Compilati
247f0 6f 6e 20 6f 66 20 7a 49 6e 73 65 72 74 20 2a 2f  on of zInsert */
24800 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
24830 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
24840 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
24850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24870 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
24880 73 73 65 72 74 28 20 70 41 72 2d 3e 62 5a 69 70  ssert( pAr->bZip
24890 3d 3d 30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ==0 );..  rc = s
248a0 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
248b0 22 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 2c  "SAVEPOINT ar;",
248c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
248d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
248e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
248f0 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b  f( bUpdate==0 ){
24900 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24910 33 5f 65 78 65 63 28 64 62 2c 20 7a 44 72 6f 70  3_exec(db, zDrop
24920 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
24930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24940 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
24950 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
24960 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 43 72 65  e3_exec(db, zCre
24970 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ate, 0, 0, 0);. 
24980 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64 62   shellPrepare(db
24990 2c 20 26 72 63 2c 20 7a 49 6e 73 65 72 74 2c 20  , &rc, zInsert, 
249a0 26 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 68 65  &pInsert);.  she
249b0 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 26 72  llPrepare(db, &r
249c0 63 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 29  c, zSql, &pStmt)
249d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
249e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20  _text(pStmt, 2, 
249f0 70 41 72 2d 3e 7a 44 69 72 2c 20 2d 31 2c 20 53  pAr->zDir, -1, S
24a00 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a  QLITE_STATIC);..
24a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
24a20 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51  ->nArg && rc==SQ
24a30 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
24a40 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24a50 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 70  text(pStmt, 1, p
24a60 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 2d 31  Ar->azArg[i], -1
24a70 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
24a80 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
24a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
24aa0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
24ab0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
24ac0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
24ad0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24ae0 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
24af0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
24b00 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
24b10 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d   0);.      int m
24b20 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ode = sqlite3_co
24b30 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
24b40 31 29 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e  1);.      unsign
24b50 65 64 20 69 6e 74 20 6d 74 69 6d 65 20 3d 20 73  ed int mtime = s
24b60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24b70 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20  t(pStmt, 2);..  
24b80 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
24b90 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
24ba0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
24bb0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 4e 61 6d  ut, "%s\n", zNam
24bc0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
24bd0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24be0 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 31 2c  text(pInsert, 1,
24bf0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
24c00 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
24c10 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24c20 6e 74 28 70 49 6e 73 65 72 74 2c 20 32 2c 20 6d  nt(pInsert, 2, m
24c30 6f 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ode);.      sqli
24c40 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
24c50 49 6e 73 65 72 74 2c 20 33 2c 20 28 73 71 6c 69  Insert, 3, (sqli
24c60 74 65 33 5f 69 6e 74 36 34 29 6d 74 69 6d 65 29  te3_int64)mtime)
24c70 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 53 5f 49  ;..      if( S_I
24c80 53 44 49 52 28 6d 6f 64 65 29 20 29 7b 0a 20 20  SDIR(mode) ){.  
24c90 20 20 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20        sz = 0;.  
24ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24cb0 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c  nd_null(pInsert,
24cc0 20 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   5);.      }else
24cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24ce0 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e  3_bind_value(pIn
24cf0 73 65 72 74 2c 20 35 2c 20 73 71 6c 69 74 65 33  sert, 5, sqlite3
24d00 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
24d10 74 6d 74 2c 20 33 29 29 3b 0a 20 20 20 20 20 20  tmt, 3));.      
24d20 20 20 69 66 28 20 53 5f 49 53 4c 4e 4b 28 6d 6f    if( S_ISLNK(mo
24d30 64 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  de) ){.         
24d40 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   sz = -1;.      
24d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24d60 20 20 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f     sz = sqlite3_
24d70 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
24d80 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  mt, 3);.        
24d90 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
24da0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
24db0 74 28 70 49 6e 73 65 72 74 2c 20 34 2c 20 73 7a  t(pInsert, 4, sz
24dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24dd0 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a  _step(pInsert);.
24de0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24df0 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
24e00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65  );.    }.    she
24e10 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 74  llReset(&rc, pSt
24e20 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  mt);.  }..  if( 
24e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24e40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
24e50 63 28 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20  c(db, "ROLLBACK 
24e60 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61  TO ar; RELEASE a
24e70 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  r;", 0, 0, 0);. 
24e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
24e90 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
24ea0 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 2c  , "RELEASE ar;",
24eb0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
24ec0 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
24ed0 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 73 68  rc, pStmt);.  sh
24ee0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
24ef0 20 70 49 6e 73 65 72 74 29 3b 0a 20 20 72 65 74   pInsert);.  ret
24f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24f10 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
24f20 6f 66 20 2e 61 72 20 22 43 72 65 61 74 65 22 20  of .ar "Create" 
24f30 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2a 0a 2a 2a 20  command. .**.** 
24f40 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
24f50 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
24f60 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
24f70 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
24f80 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
24f90 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
24fa0 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
24fb0 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
24fc0 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
24fd0 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
24fe0 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
24ff0 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
25000 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
25010 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
25020 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
25030 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
25040 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
25050 6e 74 20 61 72 43 72 65 61 74 65 43 6f 6d 6d 61  nt arCreateComma
25060 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
25070 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25080 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73        /* Shell s
25090 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  tate pointer */.
250a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
250b0 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20   ArCommand *pAr 
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
250e0 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e  ments and option
250f0 73 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  s */.){.  return
25100 20 61 72 43 72 65 61 74 65 55 70 64 61 74 65 28   arCreateUpdate(
25110 70 2c 20 64 62 2c 20 70 41 72 2c 20 30 29 3b 0a  p, db, pAr, 0);.
25120 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
25130 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
25140 55 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 2e  Update" command.
25150 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
25160 61 72 55 70 64 61 74 65 43 6d 64 28 53 68 65 6c  arUpdateCmd(Shel
25170 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74  lState *p, sqlit
25180 65 33 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e  e3 *db, ArComman
25190 64 20 2a 70 41 72 29 7b 0a 20 20 72 65 74 75 72  d *pAr){.  retur
251a0 6e 20 61 72 43 72 65 61 74 65 55 70 64 61 74 65  n arCreateUpdate
251b0 28 70 2c 20 64 62 2c 20 70 41 72 2c 20 31 29 3b  (p, db, pAr, 1);
251c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
251d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61  mentation of ".a
251e0 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a  r" dot command..
251f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
25200 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
25210 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
25220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
25230 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
25240 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
25250 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
25280 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
25290 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
252a0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
252d0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
252e0 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e  */.){.  ArComman
252f0 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b  d cmd;.  int rc;
25300 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65 43  .  rc = arParseC
25310 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41  ommand(azArg, nA
25320 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28  rg, &cmd);.  if(
25330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
25350 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
25360 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
25370 68 61 6e 64 6c 65 20 74 6f 20 75 73 65 20 61 73  handle to use as
25380 20 61 72 63 68 69 76 65 20 2a 2f 0a 0a 20 20 20   archive */..   
25390 20 69 66 28 20 63 6d 64 2e 62 5a 69 70 20 29 7b   if( cmd.bZip ){
253a0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a  .      if( cmd.z
253b0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
253c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
253d0 64 65 72 72 2c 20 22 7a 69 70 20 66 6f 72 6d 61  derr, "zip forma
253e0 74 20 72 65 71 75 69 72 65 73 20 61 20 2d 2d 66  t requires a --f
253f0 69 6c 65 20 73 77 69 74 63 68 5c 6e 22 29 3b 0a  ile switch\n");.
25400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25410 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25420 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
25430 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
25440 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d  CMD_CREATE || cm
25450 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55  d.eCmd==AR_CMD_U
25460 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20  PDATE ){.       
25470 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25480 72 72 2c 20 22 7a 69 70 20 61 72 63 68 69 76 65  rr, "zip archive
25490 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 5c  s are read-only\
254a0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
254b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
254c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
254d0 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b  db = pState->db;
254e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
254f0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
25500 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20    int flags;.   
25510 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d     if( cmd.eCmd=
25520 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c  =AR_CMD_CREATE |
25530 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  | cmd.eCmd==AR_C
25540 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  MD_UPDATE ){.   
25550 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
25560 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
25570 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
25580 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
25590 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
255a0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
255b0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
255c0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
255d0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64  ite3_open_v2(cmd
255e0 2e 7a 46 69 6c 65 2c 20 26 64 62 2c 20 66 6c 61  .zFile, &db, fla
255f0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
25600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25610 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
25620 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
25630 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
25640 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %s (%s)\n", .  
25650 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46            cmd.zF
25660 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ile, sqlite3_err
25670 6d 73 67 28 64 62 29 0a 20 20 20 20 20 20 20 20  msg(db).        
25680 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25690 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
256a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
256b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
256c0 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
256d0 69 74 28 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69  it(db, 0, 0);.#i
256e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
256f0 5f 5a 4c 49 42 0a 20 20 20 20 20 20 73 71 6c 69  _ZLIB.      sqli
25700 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 64  te3_sqlar_init(d
25710 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  b, 0, 0);.#endif
25720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25730 20 20 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64    db = pState->d
25740 62 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  b;.    }..    sw
25750 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29  itch( cmd.eCmd )
25760 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  {.      case AR_
25770 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
25780 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
25790 65 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74 65 2c  eCommand(pState,
257a0 20 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20   db, &cmd);.    
257b0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
257c0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58    case AR_CMD_EX
257d0 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72  TRACT:.        r
257e0 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d  c = arExtractCom
257f0 6d 61 6e 64 28 70 53 74 61 74 65 2c 20 64 62 2c  mand(pState, db,
25800 20 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20   &cmd);.        
25810 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
25820 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a  se AR_CMD_LIST:.
25830 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c          rc = arL
25840 69 73 74 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74  istCommand(pStat
25850 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20  e, db, &cmd);.  
25860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
25870 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
25880 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72  HELP:.        ar
25890 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75  Usage(pState->ou
258a0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
258b0 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
258c0 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
258d0 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  t( cmd.eCmd==AR_
258e0 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20  CMD_UPDATE );.  
258f0 20 20 20 20 20 20 72 63 20 3d 20 61 72 55 70 64        rc = arUpd
25900 61 74 65 43 6d 64 28 70 53 74 61 74 65 2c 20 64  ateCmd(pState, d
25910 62 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20 20 20  b, &cmd);.      
25920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
25930 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
25940 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
25950 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
25960 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
25970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
25980 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
25990 20 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63   ".expert" dot c
259a0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
259b0 63 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43  c int expertDotC
259c0 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
259d0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
259e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
259f0 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
25a00 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
25a10 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
25a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
25a30 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
25a40 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
25a50 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
25a60 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
25a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a80 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
25a90 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
25aa0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25ab0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
25ac0 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
25ad0 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65  i;.  int iSample
25ae0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
25af0 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
25b00 70 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20  pExpert==0 );.  
25b10 6d 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e  memset(&pState->
25b20 65 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f  expert, 0, sizeo
25b30 66 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a  f(ExpertInfo));.
25b40 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
25b50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
25b60 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
25b70 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
25b80 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
25b90 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
25ba0 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
25bb0 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  ++;.    n = strl
25bc0 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
25bd0 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e   n>=2 && 0==strn
25be0 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65  cmp(z, "-verbose
25bf0 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70  ", n) ){.      p
25c00 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56  State->expert.bV
25c10 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
25c20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
25c30 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d  >=2 && 0==strncm
25c40 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20  p(z, "-sample", 
25c50 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n) ){.      if( 
25c60 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  i==(nArg-1) ){. 
25c70 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
25c80 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f  f(stderr, "optio
25c90 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
25ca0 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a  gument: %s\n", z
25cb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
25cc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ce0 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e     iSample = (in
25cf0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
25d00 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  zArg[++i]);.    
25d10 20 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c      if( iSample<
25d20 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30  0 || iSample>100
25d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
25d40 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25d50 20 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72   "value out of r
25d60 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  ange: %s\n", azA
25d70 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
25d80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25d90 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
25da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
25db0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77   else{.      raw
25dc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
25dd0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
25de0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
25df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25e00 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
25e10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74  _OK ){.    pStat
25e30 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
25e40 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  t = sqlite3_expe
25e50 72 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64  rt_new(pState->d
25e60 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  b, &zErr);.    i
25e70 66 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  f( pState->exper
25e80 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a  t.pExpert==0 ){.
25e90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25ea0 28 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65  (stderr, "sqlite
25eb0 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73  3_expert_new: %s
25ec0 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
25ed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25ee0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
25ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
25f00 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20  pert_config(.   
25f10 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65         pState->e
25f20 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45  xpert.pExpert, E
25f30 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d  XPERT_CONFIG_SAM
25f40 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20  PLE, iSample.   
25f50 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
25f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25f70 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ../*.** If an in
25f80 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20  put line begins 
25f90 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e  with "." then in
25fa0 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
25fb0 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20  e to.** process 
25fc0 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
25fd0 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
25fe0 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
25ff0 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
26000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
26010 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68  _meta_command(ch
26020 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c  ar *zLine, Shell
26030 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
26040 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41   h = 1;.  int nA
26050 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  rg = 0;.  int n,
26060 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   c;.  int rc = 0
26070 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  ;.  char *azArg[
26080 35 30 5d 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  50];..  if( p->e
26090 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b  xpert.pExpert ){
260a0 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e 69 73  .    expertFinis
260b0 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  h(p, 1, 0);.  }.
260c0 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
260d0 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
260e0 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
260f0 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
26100 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
26110 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77  (azArg) ){.    w
26120 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
26130 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20  ine[h]) ){ h++; 
26140 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  }.    if( zLine[
26150 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  h]==0 ) break;. 
26160 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
26170 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68  ='\'' || zLine[h
26180 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
26190 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e  int delim = zLin
261a0 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a  e[h++];.      az
261b0 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
261c0 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
261d0 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
261e0 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69  & zLine[h]!=deli
261f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
26200 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20   zLine[h]=='\\' 
26210 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26  && delim=='"' &&
26220 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29   zLine[h+1]!=0 )
26230 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b   h++;.        h+
26240 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
26250 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64   if( zLine[h]==d
26260 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
26270 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a  zLine[h++] = 0;.
26280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26290 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72  ( delim=='"' ) r
262a0 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
262b0 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
262c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
262d0 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
262e0 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20  ] = &zLine[h];. 
262f0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
26300 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65  e[h] && !IsSpace
26310 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
26320 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +; }.      if( z
26330 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b  Line[h] ) zLine[
26340 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
26350 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
26360 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
26370 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
26380 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
26390 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  input line..  */
263a0 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
263b0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f   return 0; /* no
263c0 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f   tokens, no erro
263d0 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65  r */.  n = strle
263e0 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n30(azArg[0]);. 
263f0 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   c = azArg[0][0]
26400 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26410 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
26420 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61  TION.  if( c=='a
26430 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
26440 72 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e  rg[0], "auth", n
26450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
26460 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
26470 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26480 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74  rr, "Usage: .aut
26490 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20  h ON|OFF\n");.  
264a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
264b0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
264c0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
264d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
264e0 29 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  );.    if( boole
264f0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
26500 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
26510 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
26520 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75  r(p->db, shellAu
26530 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  th, p);.    }els
26540 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
26550 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
26560 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
26570 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
26580 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
26590 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
265a0 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 61  ABLE.  if( c=='a
265b0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
265c0 72 67 5b 30 5d 2c 20 22 61 72 22 2c 20 6e 29 3d  rg[0], "ar", n)=
265d0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
265e0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  b(p, 0);.    rc 
265f0 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70  = arDotCommand(p
26600 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
26610 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
26620 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26    if( (c=='b' &&
26630 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
26640 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b  (azArg[0], "back
26650 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c  up", n)==0).   |
26660 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  | (c=='s' && n>=
26670 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
26680 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e  rg[0], "save", n
26690 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
266a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74  onst char *zDest
266b0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  File = 0;.    co
266c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
266d0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  0;.    sqlite3 *
266e0 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pDest;.    sqlit
266f0 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
26700 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  up;.    int j;. 
26710 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
26720 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; j++){.      
26730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
26740 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
26750 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
26760 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
26770 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
26780 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f  .        /* No o
26790 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73  ptions to proces
267a0 73 20 61 74 20 74 68 69 73 20 74 69 6d 65 20 2a  s at this time *
267b0 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  /.        {.    
267c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
267d0 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
267e0 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  wn option: %s\n"
267f0 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  , azArg[j]);.   
26800 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
26810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26820 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74   }else if( zDest
26830 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
26840 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
26850 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
26860 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20  else if( zDb==0 
26870 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  ){.        zDb =
26880 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20   zDestFile;.    
26890 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
268a0 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
268b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
268c0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
268d0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
268e0 6d 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75 70  ments to .backup
268f0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  \n");.        re
26900 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
26910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
26920 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
26930 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
26940 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20  tderr, "missing 
26950 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e  FILENAME argumen
26960 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29  t on .backup\n")
26970 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
26980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26990 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  zDb==0 ) zDb = "
269a0 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20  main";.    rc = 
269b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65  sqlite3_open(zDe
269c0 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b  stFile, &pDest);
269d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
269e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
269f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
26a00 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
26a10 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
26a20 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20  ", zDestFile);. 
26a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
26a40 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
26a50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26a60 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
26a70 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20  0);.    pBackup 
26a80 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
26a90 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61  _init(pDest, "ma
26aa0 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29  in", p->db, zDb)
26ab0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
26ac0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  p==0 ){.      ut
26ad0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26ae0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
26af0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26b00 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 73  pDest));.      s
26b10 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
26b20 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
26b30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n 1;.    }.    w
26b40 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c  hile(  (rc = sql
26b50 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
26b60 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
26b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20  SQLITE_OK ){}.  
26b80 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
26b90 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
26ba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26bb0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
26bc0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
26bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
26be0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26bf0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
26c00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
26c10 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  est));.      rc 
26c20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
26c30 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
26c40 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
26c50 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
26c60 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
26c70 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20  Arg[0], "bail", 
26c80 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
26c90 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
26ca0 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20    bail_on_error 
26cb0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
26cc0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
26cd0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
26ce0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
26cf0 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f  sage: .bail on|o
26d00 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
26d10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
26d20 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
26d30 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
26d40 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26d50 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29  binary", n)==0 )
26d60 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
26d70 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  2 ){.      if( b
26d80 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
26d90 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  g[1]) ){.       
26da0 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70   setBinaryMode(p
26db0 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
26dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26dd0 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f  setTextMode(p->o
26de0 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ut, 1);.      }.
26df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26e10 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e  rr, "Usage: .bin
26e20 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ary on|off\n");.
26e30 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
26e40 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
26e50 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72  f( c=='c' && str
26e60 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64  cmp(azArg[0],"cd
26e70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
26e80 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20   nArg==2 ){.#if 
26e90 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
26ea0 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
26eb0 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74 20  ).      wchar_t 
26ec0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
26ed0 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
26ee0 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  de(azArg[1]);.  
26ef0 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75 72      rc = !SetCur
26f00 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 7a  rentDirectoryW(z
26f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26f20 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a  _free(z);.#else.
26f30 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69 72        rc = chdir
26f40 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64  (azArg[1]);.#end
26f50 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
26f60 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
26f70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26f80 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f  Cannot change to
26f90 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73 5c   directory \"%s\
26fa0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
26fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
26fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26fd0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
26fe0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
26ff0 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54 4f  age: .cd DIRECTO
27000 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RY\n");.      rc
27010 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
27020 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e  lse..  /* The un
27030 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72 65  documented ".bre
27040 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64  akpoint" command
27050 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20 74   causes a call t
27060 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a  o the no-op.  **
27070 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20 74   routine named t
27080 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
27090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d  ..  */.  if( c==
270a0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
270b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
270c0 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e   "breakpoint", n
270d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74  )==0 ){.    test
270e0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
270f0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
27100 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='c' && n>=3 && 
27110 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
27120 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d  , "changes", n)=
27130 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
27140 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
27150 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c  etOrClearFlag(p,
27160 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e   SHFLG_CountChan
27170 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  ges, azArg[1]);.
27180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27190 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
271a0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 61  rr, "Usage: .cha
271b0 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nges on|off\n");
271c0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
271d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
271e0 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75 74  /* Cancel output
271f0 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69 66   redirection, if
27200 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
27210 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63 61   set (by .testca
27220 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65  se).  ** Then re
27230 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
27240 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d 6f  f the testcase-o
27250 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 20  ut.txt file and 
27260 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 0a  compare against.
27270 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20    ** azArg[1].  
27280 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
27290 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72 74  ferences, report
272a0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65 78   an error and ex
272b0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  it..  */.  if( c
272c0 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
272d0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
272e0 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d  ], "check", n)==
272f0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
27300 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74  Res = 0;.    out
27310 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
27320 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
27330 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
27340 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
27350 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41  : .check GLOB-PA
27360 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  TTERN\n");.     
27370 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
27380 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20 72  se if( (zRes = r
27390 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61 73  eadFile("testcas
273a0 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29 3d  e-out.txt", 0))=
273b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
273c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
273d0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65  Error: cannot re
273e0 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74  ad 'testcase-out
273f0 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20  .txt'\n");.     
27400 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
27410 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65 5f  se if( testcase_
27420 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52  glob(azArg[1],zR
27430 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  es)==0 ){.      
27440 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27450 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
27460 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d 25       "testcase-%
27470 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65 63  s FAILED\n Expec
27480 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20  ted: [%s]\n     
27490 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20   Got: [%s]\n",. 
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61 7a  p->zTestcase, az
274c0 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20  Arg[1], zRes);. 
274d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
274e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
274f0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
27500 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 6f  , "testcase-%s o
27510 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61  k\n", p->zTestca
27520 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  se);.      p->nC
27530 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  heck++;.    }.  
27540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27550 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Res);.  }else.. 
27560 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
27570 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
27580 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20   "clone", n)==0 
27590 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
275a0 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54  =2 ){.      tryT
275b0 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b  oClone(p, azArg[
275c0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
275d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
275e0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
275f0 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45   .clone FILENAME
27600 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
27610 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
27620 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
27630 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  && n>1 && strncm
27640 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74  p(azArg[0], "dat
27650 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29  abases", n)==0 )
27660 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
27670 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
27680 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
27690 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
276a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
276b0 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
276c0 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
276d0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
276e0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
276f0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
27700 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  List;.    sqlite
27710 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
27720 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  f(data.colSepara
27730 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70  tor),data.colSep
27740 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20  arator,": ");.  
27750 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a    data.cnt = 0;.
27760 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
27770 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
27780 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20  name, file FROM 
27790 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f  pragma_database_
277a0 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20  list",.         
277b0 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
277c0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
277d0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
277e0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
277f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27800 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
27810 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
27820 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
27830 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
27840 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
27850 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
27860 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
27870 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e  [0], "dbinfo", n
27880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
27890 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
278a0 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61  mmand(p, nArg, a
278b0 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zArg);.  }else..
278c0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
278d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
278e0 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
278f0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
27900 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20  r *zLike = 0;.  
27910 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
27920 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
27930 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
27940 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  ;.    ShellClear
27950 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
27960 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46 4c  eserveRowid|SHFL
27970 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
27980 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
27990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
279a0 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27  ( azArg[i][0]=='
279b0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  -' ){.        co
279c0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
279d0 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20 20  Arg[i]+1;.      
279e0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
279f0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
27a00 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72 65  f( strcmp(z,"pre
27a10 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d 3d  serve-rowids")==
27a20 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
27a30 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
27a40 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 72  ABLE.          r
27a50 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27a60 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72 76  , "The --preserv
27a70 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e 20  e-rowids option 
27a80 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
27a90 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d  " with SQLITE_OM
27ac0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 5c  IT_VIRTUALTABLE\
27ad0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
27ae0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
27af0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
27b00 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a 20  nd_exit;.#else. 
27b10 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
27b20 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  tFlag(p, SHFLG_P
27b30 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 23  reserveRowid);.#
27b40 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
27b50 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
27b60 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e  strcmp(z,"newlin
27b70 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  es")==0 ){.     
27b80 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61       ShellSetFla
27b90 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
27ba0 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  nes);.        }e
27bb0 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
27bc0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
27bd0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
27be0 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
27bf0 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e  " on \".dump\"\n
27c00 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
27c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
27c20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
27c30 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
27c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27c50 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b    }else if( zLik
27c60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  e ){.        raw
27c70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27c80 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f 2d  "Usage: .dump ?-
27c90 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
27ca0 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ? ".            
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27cc0 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c 49  ?--newlines? ?LI
27cd0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
27ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
27cf0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
27d00 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
27d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27d20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61 7a        zLike = az
27d30 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  Arg[i];.      }.
27d40 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
27d50 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  b(p, 0);.    /* 
27d60 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
27d70 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20  k a "dump", the 
27d80 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70  content might ap
27d90 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72  pear in an order
27da0 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61  .    ** which ca
27db0 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66  uses immediate f
27dc0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
27dd0 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
27de0 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f  lated..    ** So
27df0 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
27e00 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  -key constraint 
27e10 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
27e20 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e  revent problems.
27e30 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   */.    raw_prin
27e40 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
27e50 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d  MA foreign_keys=
27e60 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61  OFF;\n");.    ra
27e70 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
27e80 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54   "BEGIN TRANSACT
27e90 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  ION;\n");.    p-
27ea0 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
27eb0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  = 0;.    p->show
27ec0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
27ed0 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65 5f  /* Set writable_
27ee0 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20  schema=ON since 
27ef0 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73 20  doing so forces 
27f00 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69 61  SQLite to initia
27f10 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d  lize.    ** as m
27f20 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65 6d  uch of the schem
27f30 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65 6e  a as it can even
27f40 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   if the sqlite_m
27f50 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a 20  aster table is. 
27f60 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a     ** corrupt. *
27f70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  /.    sqlite3_ex
27f80 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
27f90 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47 4d  OINT dump; PRAGM
27fa0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
27fb0 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  a=ON", 0, 0, 0);
27fc0 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30  .    p->nErr = 0
27fd0 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d  ;.    if( zLike=
27fe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f  =0 ){.      run_
27ff0 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
28000 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
28010 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
28020 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
28030 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
28040 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
28050 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d   NULL AND type==
28060 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
28070 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  !='sqlite_sequen
28080 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ce'".      );.  
28090 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64      run_schema_d
280a0 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
280b0 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
280c0 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
280d0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
280e0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
280f0 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
28100 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
28110 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
28120 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
28130 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
28140 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
28150 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
28160 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
28170 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49   NULL AND type I
28180 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
28190 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30  ger','view')", 0
281a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
281b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
281c0 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71  *zSql;.      zSq
281d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
281e0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
281f0 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
28200 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
28210 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
28220 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d    "WHERE tbl_nam
28230 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74 79  e LIKE %Q AND ty
28240 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
28250 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20       "  AND sql 
28260 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65  NOT NULL", zLike
28270 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
28280 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
28290 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71  ,zSql);.      sq
282a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
282b0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
282c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
282d0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
282e0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
282f0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
28300 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
28310 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22 20  NULL".        " 
28320 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69   AND type IN ('i
28330 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c  ndex','trigger',
28340 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
28350 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65   "  AND tbl_name
28360 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65   LIKE %Q", zLike
28370 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
28380 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
28390 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zSql, 0);.     
283a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
283b0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
283c0 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  f( p->writableSc
283d0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61  hema ){.      ra
283e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
283f0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
28400 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
28410 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
28420 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
28430 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28440 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
28450 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
28460 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
28470 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
28480 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
28490 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20  RELEASE dump;", 
284a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 61  0, 0, 0);.    ra
284b0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
284c0 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c   p->nErr ? "ROLL
284d0 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20  BACK; -- due to 
284e0 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d  errors\n" : "COM
284f0 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  MIT;\n");.    p-
28500 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73 61  >showHeader = sa
28510 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a 20  vedShowHeader;. 
28520 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
28530 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
28540 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22  azArg[0], "echo"
28550 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
28560 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
28570 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
28580 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
28590 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
285a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
285b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
285c0 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f   "Usage: .echo o
285d0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
285e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
285f0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
28600 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
28610 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c  azArg[0], "eqp",
28620 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
28630 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
28640 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
28650 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d  Arg[1],"full")==
28660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
28670 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
28680 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  P_full;.      }e
28690 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
286a0 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72  zArg[1],"trigger
286b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
286c0 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
286d0 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 20  TOEQP_trigger;. 
286e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
286f0 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
28700 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
28710 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
28720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28730 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
28740 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71  err, "Usage: .eq
28750 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65 72  p off|on|trigger
28760 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20  |full\n");.     
28770 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
28780 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
28790 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
287a0 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22  azArg[0], "exit"
287b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
287c0 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63  f( nArg>1 && (rc
287d0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
287e0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21  alue(azArg[1]))!
287f0 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20  =0 ) exit(rc);. 
28800 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
28810 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65  se..  /* The ".e
28820 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20  xplain" command 
28830 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77  is automatic now
28840 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c 79  .  It is largely
28850 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a   pointless.  It.
28860 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70 75    ** retained pu
28870 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61 72  rely for backwar
28880 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
28890 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65 27   */.  if( c=='e'
288a0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
288b0 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c  g[0], "explain",
288c0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   n)==0 ){.    in
288d0 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  t val = 1;.    i
288e0 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
288f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
28900 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d  zArg[1],"auto")=
28910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61  =0 ){.        va
28920 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d 65  l = 99;.      }e
28930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  lse{.        val
28940 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65   =  booleanValue
28950 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
28960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
28970 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d  ( val==1 && p->m
28980 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode!=MODE_Explai
28990 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f  n ){.      p->no
289a0 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  rmalMode = p->mo
289b0 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64  de;.      p->mod
289c0 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
289d0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  ;.      p->autoE
289e0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
289f0 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 30  }else if( val==0
28a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
28a10 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
28a20 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20  ain ) p->mode = 
28a30 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20  p->normalMode;. 
28a40 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c       p->autoExpl
28a50 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ain = 0;.    }el
28a60 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20 29  se if( val==99 )
28a70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  {.      if( p->m
28a80 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
28a90 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  n ) p->mode = p-
28aa0 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20  >normalMode;.   
28ab0 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69     p->autoExplai
28ac0 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  n = 1;.    }.  }
28ad0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
28ae0 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
28af0 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22  Arg[0], "expert"
28b00 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
28b10 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
28b20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61    expertDotComma
28b30 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
28b40 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  g);.  }else..  i
28b50 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72  f( c=='f' && str
28b60 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
28b70 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d  fullschema", n)=
28b80 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  =0 ){.    ShellS
28b90 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63  tate data;.    c
28ba0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
28bb0 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74  ;.    int doStat
28bc0 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70  s = 0;.    memcp
28bd0 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
28be0 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
28bf0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
28c00 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
28c10 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
28c20 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20   MODE_Semi;.    
28c30 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f  if( nArg==2 && o
28c40 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
28c50 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20 29  [1], "indent") )
28c60 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f  {.      data.cMo
28c70 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
28c80 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20   MODE_Pretty;.  
28c90 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20      nArg = 1;.  
28ca0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
28cb0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=1 ){.      raw
28cc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28cd0 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68  "Usage: .fullsch
28ce0 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e  ema ?--indent?\n
28cf0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
28d00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
28d10 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
28d20 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
28d30 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  b(p, 0);.    rc 
28d40 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
28d50 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45  ->db,.       "SE
28d60 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a 20  LECT sql FROM". 
28d70 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
28d80 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74   sql sql, type t
28d90 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62  ype, tbl_name tb
28da0 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d  l_name, name nam
28db0 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20 20  e, rowid x".    
28dc0 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71     "     FROM sq
28dd0 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f  lite_master UNIO
28de0 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22 20  N ALL".       " 
28df0 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79    SELECT sql, ty
28e00 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  pe, tbl_name, na
28e10 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  me, rowid FROM s
28e20 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
28e30 72 29 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  r) ".       "WHE
28e40 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
28e50 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
28e60 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
28e70 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20  E 'sqlite_%' ". 
28e80 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
28e90 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 63  rowid",.       c
28ea0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
28eb0 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a  &zErrMsg.    );.
28ec0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
28ee0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
28ef0 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  mt;.      rc = s
28f00 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
28f10 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
28f20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
28f30 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74  rowid FROM sqlit
28f40 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
28f50 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
28f60 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c 69   name GLOB 'sqli
28f70 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c 0a  te_stat[134]'",.
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
28f90 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
28fa0 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20 73       doStats = s
28fb0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
28fc0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  t)==SQLITE_ROW;.
28fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
28fe0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
28ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 53     }.    if( doS
29000 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tats==0 ){.     
29010 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
29020 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54 20  ut, "/* No STAT 
29030 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
29040 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c   */\n");.    }el
29050 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
29060 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
29070 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
29080 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ter;\n");.      
29090 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
290a0 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e 41  db, "SELECT 'ANA
290b0 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
290c0 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  er'",.          
290d0 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
290e0 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
290f0 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
29100 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
29110 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
29120 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
29130 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
29140 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20 73  _stat1";.      s
29150 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c  hell_exec(p->db,
29160 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
29170 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 0a 20  sqlite_stat1",. 
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
291a0 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29 3b  &data,&zErrMsg);
291b0 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
291c0 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
291d0 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73  _stat3";.      s
291e0 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c  hell_exec(p->db,
291f0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
29200 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a 20  sqlite_stat3",. 
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
29230 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29 3b  &data,&zErrMsg);
29240 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
29250 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
29260 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73  _stat4";.      s
29270 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c  hell_exec(p->db,
29280 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
29290 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a 20  sqlite_stat4",. 
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
292c0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
292d0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
292e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
292f0 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
29300 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  r;\n");.    }.  
29310 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
29320 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
29330 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72  zArg[0], "header
29340 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
29350 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
29360 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61        p->showHea
29370 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  der = booleanVal
29380 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
29390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
293a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
293b0 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65  , "Usage: .heade
293c0 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  rs on|off\n");. 
293d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
293e0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
293f0 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
29400 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
29410 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  elp", n)==0 ){. 
29420 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
29430 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 65  ->out, "%s", zHe
29440 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  lp);.  }else..  
29450 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
29460 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29470 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20  "import", n)==0 
29480 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61  ){.    char *zTa
29490 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
294a0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
294b0 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
294c0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
294d0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
294e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
294f0 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f  file to extra co
29500 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  ntent from */.  
29510 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
29520 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a  pStmt = NULL; /*
29530 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a   A statement */.
29540 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
29570 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
29580 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  e */.    int nBy
29590 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
295a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
295b0 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51  f bytes in an SQ
295c0 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  L string */.    
295d0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
295e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
295f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
29600 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d      int needComm
29610 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
29620 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49  /* True to COMMI
29630 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74  T or ROLLBACK at
29640 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
29650 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
29660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29670 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d  r of bytes in p-
29680 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20  >colSeparator[] 
29690 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
296a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
296b0 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
296c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d  tement */.    Im
296d0 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20  portCtx sCtx;   
296e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
296f0 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  der context */. 
29700 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45     char *(SQLITE
29710 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49  _CDECL *xRead)(I
29720 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46  mportCtx*); /* F
29730 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20  unc to read one 
29740 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
29750 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a   (SQLITE_CDECL *
29760 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b  xCloser)(FILE*);
29770 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f        /* Func to
29780 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a   close file */..
29790 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
297a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
297b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
297c0 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45  ge: .import FILE
297d0 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20   TABLE\n");.    
297e0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
297f0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
29800 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
29810 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65  g[1];.    zTable
29820 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
29830 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
29840 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
29850 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
29860 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e  sCtx));.    open
29870 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e  _db(p, 0);.    n
29880 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
29890 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
298a0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
298b0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
298c0 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
298e0 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63  rror: non-null c
298f0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
29900 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
29910 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
29920 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29930 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
29940 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29950 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
29960 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
29970 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  r column separat
29980 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22  ors not allowed"
29990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
299a0 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70         " for imp
299b0 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
299c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
299d0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
299e0 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
299f0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
29a00 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
29a10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29a20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c   "Error: non-nul
29a30 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  l row separator 
29a40 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
29a50 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
29a60 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29a70 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26     if( nSep==2 &
29a80 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  & p->mode==MODE_
29a90 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d  Csv && strcmp(p-
29aa0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
29ab0 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20  EP_CrLf)==0 ){. 
29ac0 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70       /* When imp
29ad0 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79  orting CSV (only
29ae0 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65  ), if the row se
29af0 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  parator is set t
29b00 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
29b10 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f  efault output ro
29b20 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61  w separator, cha
29b30 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65  nge it to the de
29b40 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20  fault input.    
29b50 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74    ** row separat
29b60 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  or.  This avoids
29b70 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74   having to maint
29b80 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e  ain different in
29b90 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  put.      ** and
29ba0 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61   output row sepa
29bb0 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20  rators. */.     
29bc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
29bd0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
29be0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
29bf0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
29c00 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70  Row);.      nSep
29c10 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
29c20 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
29c30 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70    }.    if( nSep
29c40 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  >1 ){.      raw_
29c50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29c60 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61  Error: multi-cha
29c70 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72  racter row separ
29c80 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
29c90 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
29ca0 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
29cb0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
29cc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
29cd0 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20  .    sCtx.zFile 
29ce0 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74  = zFile;.    sCt
29cf0 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20  x.nLine = 1;.   
29d00 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b   if( sCtx.zFile[
29d10 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65  0]=='|' ){.#ifde
29d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
29d30 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72  PEN.      raw_pr
29d40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
29d50 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e  ror: pipes are n
29d60 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
29d70 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20  this OS\n");.   
29d80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c     return 1;.#el
29d90 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  se.      sCtx.in
29da0 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = popen(sCtx.zF
29db0 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20  ile+1, "r");.   
29dc0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20     sCtx.zFile = 
29dd0 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20  "<pipe>";.      
29de0 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65  xCloser = pclose
29df0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
29e00 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69  se{.      sCtx.i
29e10 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a  n = fopen(sCtx.z
29e20 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
29e30 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c     xCloser = fcl
29e40 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ose;.    }.    i
29e50 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
29e60 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20  _Ascii ){.      
29e70 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65  xRead = ascii_re
29e80 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20  ad_one_field;.  
29e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
29ea0 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f  Read = csv_read_
29eb0 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
29ec0 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e  .    if( sCtx.in
29ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
29ee0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29ef0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
29f00 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
29f10 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  zFile);.      re
29f20 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
29f30 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d    sCtx.cColSep =
29f40 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
29f50 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52  [0];.    sCtx.cR
29f60 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
29f70 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
29f80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
29f90 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
29fa0 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c   FROM %s", zTabl
29fb0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  e);.    if( zSql
29fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
29fd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29fe0 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
29ff0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
2a000 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2a010 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a020 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  1;.    }.    nBy
2a030 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  te = strlen30(zS
2a040 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
2a050 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2a060 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2a070 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2a080 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
2a090 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b 20  char(&sCtx, 0); 
2a0a0 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
2a0b0 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63 61  sCtx.z is alloca
2a0c0 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ted */.    if( r
2a0d0 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  c && sqlite3_str
2a0e0 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74 61  glob("no such ta
2a0f0 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33  ble: *", sqlite3
2a100 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3d  _errmsg(p->db))=
2a110 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
2a120 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69   *zCreate = sqli
2a130 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45  te3_mprintf("CRE
2a140 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ATE TABLE %s", z
2a150 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63 68  Table);.      ch
2a160 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20  ar cSep = '(';. 
2a170 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65 61       while( xRea
2a180 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20 20  d(&sCtx) ){.    
2a190 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71      zCreate = sq
2a1a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2a1b0 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54 45  z%c\n  \"%w\" TE
2a1c0 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63 53  XT", zCreate, cS
2a1d0 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ep, sCtx.z);.   
2a1e0 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b       cSep = ',';
2a1f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43 74  .        if( sCt
2a200 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
2a210 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a 20  olSep ) break;. 
2a220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a230 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20   cSep=='(' ){.  
2a240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a250 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
2a260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2a270 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20  e(sCtx.z);.     
2a280 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2a290 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  in);.        utf
2a2a0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a2b0 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c 65 5c  "%s: empty file\
2a2c0 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 29 3b  n", sCtx.zFile);
2a2d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a2e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2a2f0 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
2a300 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e  e3_mprintf("%z\n
2a310 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20  )", zCreate);.  
2a320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a330 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 72  _exec(p->db, zCr
2a340 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eate, 0, 0, 0);.
2a350 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a360 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
2a370 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2a380 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2a390 28 73 74 64 65 72 72 2c 20 22 43 52 45 41 54 45  (stderr, "CREATE
2a3a0 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29 20 66   TABLE %s(...) f
2a3b0 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 7a 54  ailed: %s\n", zT
2a3c0 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  able,.          
2a3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
2a3e0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2a3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a400 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
2a410 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2a420 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  .in);.        re
2a430 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2a440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a450 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2a460 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2a470 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
2a480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a490 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
2a4a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 20   rc ){.      if 
2a4b0 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f  (pStmt) sqlite3_
2a4c0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2a4d0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2a4e0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2a4f0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2a500 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2a510 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
2a520 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Ctx.in);.      r
2a530 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2a540 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
2a550 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
2a560 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
2a570 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2a580 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
2a590 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  0;.    if( nCol=
2a5a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  =0 ) return 0; /
2a5b0 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f  * no columns, no
2a5c0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53   error */.    zS
2a5d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ql = sqlite3_mal
2a5e0 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20 2b  loc64( nByte*2 +
2a5f0 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a   20 + nCol*2 );.
2a600 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2a610 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2a620 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2a630 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
2a640 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c  y\n");.      xCl
2a650 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2a660 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a670 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a680 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
2a690 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  20, zSql, "INSER
2a6a0 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41  T INTO \"%w\" VA
2a6b0 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29  LUES(?", zTable)
2a6c0 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
2a6d0 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
2a6e0 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
2a6f0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
2a700 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
2a710 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
2a720 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
2a730 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
2a740 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
2a750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2a760 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2a770 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2a780 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
2a790 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2a7a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2a7b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2a7c0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2a7d0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2a7e0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
2a7f0 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20       if (pStmt) 
2a800 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2a810 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78  (pStmt);.      x
2a820 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2a830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2a840 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43  .    }.    needC
2a850 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  ommit = sqlite3_
2a860 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70  get_autocommit(p
2a870 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 6e  ->db);.    if( n
2a880 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
2a890 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2a8a0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
2a8b0 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
2a8c0 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
2a8d0 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20   sCtx.nLine;.   
2a8e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2a8f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
2a900 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65 61    char *z = xRea
2a910 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20  d(&sCtx);.      
2a920 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
2a930 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
2a940 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65 20  -of-file before 
2a950 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75  finding any colu
2a960 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20  mns?.        ** 
2a970 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
2a980 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
2a990 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ing the remainin
2a9a0 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20  g columns..     
2a9b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2a9c0 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29  ( z==0 && i==0 )
2a9d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a9e0 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69  /*.        ** Di
2a9f0 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f  d we reach end-o
2aa00 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66  f-file OR end-of
2aa10 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69 6e  -line before fin
2aa20 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20  ding any.       
2aa30 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41   ** columns in A
2aa40 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20 73  SCII mode?  If s
2aa50 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20  o, stop instead 
2aa60 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a  of NULL filling.
2aa70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
2aa80 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73  emaining columns
2aa90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2aaa0 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65       if( p->mode
2aab0 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26 20  ==MODE_Ascii && 
2aac0 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30  (z==0 || z[0]==0
2aad0 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61  ) && i==0 ) brea
2aae0 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
2aaf0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
2ab00 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20  mt, i+1, z, -1, 
2ab10 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
2ab20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
2ab30 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e  <nCol-1 && sCtx.
2ab40 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c  cTerm!=sCtx.cCol
2ab50 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sep ){.         
2ab60 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ab70 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70  err, "%s:%d: exp
2ab80 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
2ab90 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20   but found %d - 
2aba0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69 6c              "fil
2abc0 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77 69  ling the rest wi
2abd0 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20  th NULL\n",.    
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abf0 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65        sCtx.zFile
2ac00 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f  , startLine, nCo
2ac10 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
2ac20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
2ac30 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e       while( i<=n
2ac40 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62  Col ){ sqlite3_b
2ac50 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
2ac60 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20  i); i++; }.     
2ac70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ac80 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72     if( sCtx.cTer
2ac90 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
2aca0 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2acb0 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28 26           xRead(&
2acc0 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  sCtx);.         
2acd0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77   i++;.        }w
2ace0 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
2acf0 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  ==sCtx.cColSep )
2ad00 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
2ad10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2ad20 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  s:%d: expected %
2ad30 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f  d columns but fo
2ad40 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20  und %d - ".     
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72     "extras ignor
2ad70 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ed\n",.         
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ad90 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74  Ctx.zFile, start
2ada0 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a  Line, nCol, i);.
2adb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2adc0 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  ( i>=nCol ){.   
2add0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
2ade0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
2adf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
2ae00 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
2ae10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ae20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ae30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ae40 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
2ae50 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25  INSERT failed: %
2ae60 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  s\n", sCtx.zFile
2ae70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ae80 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e          startLin
2ae90 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
2aea0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2aeb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2aec0 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54   }while( sCtx.cT
2aed0 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20  erm!=EOF );..   
2aee0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2aef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2af00 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
2af10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2af20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
2af30 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73  ( needCommit ) s
2af40 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2af50 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
2af60 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  0, 0);.  }else..
2af70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55  #ifndef SQLITE_U
2af80 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20  NTESTABLE.  if( 
2af90 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
2afa0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
2afb0 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b  oster", n)==0 ){
2afc0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
2afd0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
2afe0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ist = 0;.    sql
2aff0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2b000 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d  ;.    int tnum =
2b010 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
2b020 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
2b030 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2b040 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2b050 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49 4e  ge: .imposter IN
2b060 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22 29  DEX IMPOSTER\n")
2b070 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2b080 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2b090 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2b0a0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
2b0b0 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20  p, 0);.    zSql 
2b0c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b0d0 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  f("SELECT rootpa
2b0e0 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
2b0f0 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 27    " WHERE name='
2b120 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
2b130 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29  dex'", azArg[1])
2b140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72  ;.    sqlite3_pr
2b150 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
2b160 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
2b170 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2b180 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2b190 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2b1a0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2b1b0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 74  E_ROW ){.      t
2b1c0 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
2b1d0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2b1e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2b1f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2b200 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 74  Stmt);.    if( t
2b210 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
2b220 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b230 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  rr, "no such ind
2b240 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  ex: \"%s\"\n", a
2b250 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2b260 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2b270 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2b280 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2b290 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2b2a0 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69  printf("PRAGMA i
2b2b0 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22  ndex_xinfo='%q'"
2b2c0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2b2d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2b2e0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
2b2f0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
2b300 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2b310 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2b320 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    i = 0;.    whi
2b330 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
2b340 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
2b350 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ROW ){.      cha
2b360 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20  r zLabel[20];.  
2b370 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b380 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zCol = (const ch
2b390 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
2b3a0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
2b3b0 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  ;.      i++;.   
2b3c0 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29     if( zCol==0 )
2b3d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
2b3e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2b3f0 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b  (pStmt,1)==-1 ){
2b400 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  .          zCol 
2b410 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20  = "_ROWID_";.   
2b420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2b440 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
2b450 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78  abel),zLabel,"ex
2b460 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20  pr%d",i);.      
2b470 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65      zCol = zLabe
2b480 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
2b490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
2b4a0 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Collist==0 ){.  
2b4b0 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d        zCollist =
2b4c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2b4d0 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29  ("\"%w\"", zCol)
2b4e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b4f0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20         zCollist 
2b500 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b510 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a  f("%z,\"%w\"", z
2b520 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a  Collist, zCol);.
2b530 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b540 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2b550 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
2b560 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2b570 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2b580 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c   "CREATE TABLE \
2b590 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52 59  "%w\"(%s,PRIMARY
2b5a0 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55 54   KEY(%s))WITHOUT
2b5b0 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20 20   ROWID",.       
2b5c0 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f     azArg[2], zCo
2b5d0 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29  llist, zCollist)
2b5e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2b5f0 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  ee(zCollist);.  
2b600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
2b610 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2b620 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2b630 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61  STER, p->db, "ma
2b640 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20  in", 1, tnum);. 
2b650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b670 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2b680 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  p->db, zSql, 0, 
2b690 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2b6a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2b6b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2b6c0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
2b6d0 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29  b, "main", 0, 0)
2b6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2b6f0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2b700 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b710 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73  rror in [%s]: %s
2b720 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74  \n", zSql, sqlit
2b730 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2b740 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b750 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2b760 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3b  ntf(stdout, "%s;
2b770 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
2b780 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2b790 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  tdout,.         
2b7a0 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69 74    "WARNING: writ
2b7b0 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74  ing to an impost
2b7c0 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f  er table will co
2b7d0 72 72 75 70 74 20 74 68 65 20 69 6e 64 65 78 21  rrupt the index!
2b7e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  \n".        );. 
2b7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b800 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2b810 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 49  tf(stderr, "SQLI
2b820 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2b830 53 54 45 52 20 72 65 74 75 72 6e 73 20 25 64 5c  STER returns %d\
2b840 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72  n", rc);.      r
2b850 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
2b860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2b870 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ql);.  }else.#en
2b880 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2b890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54  SQLITE_OMIT_TEST
2b8a0 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69  _CONTROL) */..#i
2b8b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2b8c0 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28  LE_IOTRACE.  if(
2b8d0 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
2b8e0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f  mp(azArg[0], "io
2b8f0 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
2b900 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49 20  .    SQLITE_API 
2b910 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51 4c  extern void (SQL
2b920 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74  ITE_CDECL *sqlit
2b930 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
2b940 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20   char*, ...);.  
2b950 20 20 69 66 28 20 69 6f 74 72 61 63 65 20 26 26    if( iotrace &&
2b960 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75 74   iotrace!=stdout
2b970 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63   ) fclose(iotrac
2b980 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65 20  e);.    iotrace 
2b990 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
2b9a0 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  g<2 ){.      sql
2b9b0 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b  ite3IoTrace = 0;
2b9c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
2b9d0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  trcmp(azArg[1], 
2b9e0 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  "-")==0 ){.     
2b9f0 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2ba00 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b  = iotracePrintf;
2ba10 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d  .      iotrace =
2ba20 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c   stdout;.    }el
2ba30 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63  se{.      iotrac
2ba40 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b  e = fopen(azArg[
2ba50 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20  1], "w");.      
2ba60 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29  if( iotrace==0 )
2ba70 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2ba80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2ba90 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2baa0 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  n \"%s\"\n", azA
2bab0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
2bac0 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
2bad0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2bae0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
2baf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bb00 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63  IoTrace = iotrac
2bb10 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d  ePrintf;.      }
2bb20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
2bb30 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
2bb40 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73  'l' && n>=5 && s
2bb50 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2bb60 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30   "limits", n)==0
2bb70 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
2bb80 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
2bb90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2bba0 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f  *zLimitName;   /
2bbb0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69  * Name of a limi
2bbc0 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20  t */.       int 
2bbd0 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20 20  limitCode;      
2bbe0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
2bbf0 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6c   code for that l
2bc00 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c  imit */.    } aL
2bc10 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  imit[] = {.     
2bc20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20   { "length",    
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2bc40 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20  TE_LIMIT_LENGTH 
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc60 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
2bc70 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 20  ql_length",     
2bc80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2bc90 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20  MIT_SQL_LENGTH  
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2bcb0 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e  .      { "column
2bcc0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2bcd0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
2bce0 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20  OLUMN           
2bcf0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2bd00 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68 22    { "expr_depth"
2bd10 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
2bd20 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
2bd30 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20  EPTH            
2bd40 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2bd50 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22  compound_select"
2bd60 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
2bd70 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
2bd80 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20 7d  LECT           }
2bd90 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65 5f  ,.      { "vdbe_
2bda0 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  op",            
2bdb0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2bdc0 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20  VDBE_OP         
2bdd0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2bde0 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61     { "function_a
2bdf0 72 67 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  rg",          SQ
2be00 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
2be10 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20  ION_ARG         
2be20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2be30 22 61 74 74 61 63 68 65 64 22 2c 20 20 20 20 20  "attached",     
2be40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2be50 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20  LIMIT_ATTACHED  
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be70 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b 65  },.      { "like
2be80 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22  _pattern_length"
2be90 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ,   SQLITE_LIMIT
2bea0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
2beb0 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20 20  NGTH       },.  
2bec0 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65 5f      { "variable_
2bed0 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20 53  number",       S
2bee0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
2bef0 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20  ABLE_NUMBER     
2bf00 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2bf10 20 22 74 72 69 67 67 65 72 5f 64 65 70 74 68 22   "trigger_depth"
2bf20 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
2bf30 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
2bf40 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20  EPTH            
2bf50 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f 72   },.      { "wor
2bf60 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20 20  ker_threads",   
2bf70 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2bf80 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2bfa0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c     };.    int i,
2bfb0 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62   n2;.    open_db
2bfc0 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
2bfd0 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nArg==1 ){.     
2bfe0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
2bff0 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69  ySize(aLimit); i
2c000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  ++){.        pri
2c010 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c  ntf("%20s %d\n",
2c020 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69   aLimit[i].zLimi
2c030 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  tName,.         
2c040 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
2c050 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
2c060 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20  t[i].limitCode, 
2c070 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -1));.      }.  
2c080 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
2c090 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  >3 ){.      raw_
2c0a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2c0b0 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41  Usage: .limit NA
2c0c0 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e  ME ?NEW-VALUE?\n
2c0d0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2c0e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2c0f0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2c100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c110 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31   int iLimit = -1
2c120 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74 72  ;.      n2 = str
2c130 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b  len30(azArg[1]);
2c140 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2c150 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d  i<ArraySize(aLim
2c160 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  it); i++){.     
2c170 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2c180 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69  trnicmp(aLimit[i
2c190 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a  ].zLimitName, az
2c1a0 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29  Arg[1], n2)==0 )
2c1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c1c0 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20  iLimit<0 ){.    
2c1d0 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d          iLimit =
2c1e0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   i;.          }e
2c1f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2c200 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c210 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20  err, "ambiguous 
2c220 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22  limit: \"%s\"\n"
2c230 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2c240 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
2c250 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c260 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2c270 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
2c280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c290 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69   }.      if( iLi
2c2a0 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  mit<0 ){.       
2c2b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c2c0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69  err, "unknown li
2c2d0 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20  mit: \"%s\"\n". 
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c 22         "enter \"
2c300 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20 6e  .limits\" with n
2c310 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  o arguments for 
2c320 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20  a list.\n",.    
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a       azArg[1]);.
2c350 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2c360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2c370 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2c380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c390 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
2c3a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d       sqlite3_lim
2c3b0 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74  it(p->db, aLimit
2c3c0 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f  [iLimit].limitCo
2c3d0 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
2c3e0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 69            (int)i
2c3f0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
2c400 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  g[2]));.      }.
2c410 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32        printf("%2
2c420 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74  0s %d\n", aLimit
2c430 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e  [iLimit].zLimitN
2c440 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
2c450 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
2c460 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c  p->db, aLimit[iL
2c470 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  imit].limitCode,
2c480 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   -1));.    }.  }
2c490 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2c4a0 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74 72  l' && n>2 && str
2c4b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c4c0 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lint", n)==0 ){.
2c4d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2c4e0 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f  );.    lintDotCo
2c4f0 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
2c500 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  nArg);.  }else..
2c510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c520 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2c530 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  ON.  if( c=='l' 
2c540 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c550 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d  [0], "load", n)=
2c560 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2c570 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50  char *zFile, *zP
2c580 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  roc;.    char *z
2c590 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
2c5a0 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
2c5b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2c5c0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2c5d0 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
2c5e0 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20  POINT?\n");.    
2c5f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2c600 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2c610 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2c620 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b    zFile = azArg[
2c630 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20  1];.    zProc = 
2c640 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b  nArg>=3 ? azArg[
2c650 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e  2] : 0;.    open
2c660 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
2c670 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
2c680 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
2c690 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20  , zFile, zProc, 
2c6a0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
2c6b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c6c0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2c6d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2c6e0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
2c6f0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
2c700 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
2c710 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
2c720 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2c730 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
2c740 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='l' && strncmp(
2c750 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c  azArg[0], "log",
2c760 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2c770 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
2c780 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c790 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
2c7a0 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b  og FILENAME\n");
2c7b0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2c7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c7d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c7e0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
2c7f0 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
2c800 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a  close(p->pLog);.
2c810 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20        p->pLog = 
2c820 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
2c830 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (zFile);.    }. 
2c840 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2c850 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
2c860 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
2c870 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2c880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
2c890 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
2c8a0 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20  rg[1] : "";.    
2c8b0 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33  int n2 = strlen3
2c8c0 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  0(zMode);.    in
2c8d0 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b  t c2 = zMode[0];
2c8e0 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27  .    if( c2=='l'
2c8f0 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
2c900 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
2c910 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  nes",n2)==0 ){. 
2c920 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2c930 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20  ODE_Line;.      
2c940 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c950 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2c960 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2c970 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2c980 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
2c990 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74  f( c2=='c' && st
2c9a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2c9b0 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
2c9c0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2c9d0 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
2c9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2c9f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2ca00 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2ca10 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2ca20 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2ca30 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27  else if( c2=='l'
2ca40 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
2ca50 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
2ca60 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  st",n2)==0 ){.  
2ca70 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2ca80 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
2ca90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2caa0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
2cab0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
2cac0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
2cad0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
2cae0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2caf0 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2cb00 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2cb10 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2cb20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cb30 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63  c2=='h' && strnc
2cb40 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d  mp(azArg[1],"htm
2cb50 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
2cb60 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2cb70 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
2cb80 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
2cb90 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2cba0 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29  ],"tcl",n2)==0 )
2cbb0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2cbc0 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20  = MODE_Tcl;.    
2cbd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2cbe0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2cbf0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2cc00 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2cc10 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73  _Space);.      s
2cc20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2cc30 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2cc40 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2cc50 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
2cc60 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
2cc70 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
2cc80 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
2cc90 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
2cca0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2ccb0 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
2ccc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2ccd0 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2cce0 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2ccf0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d  parator, SEP_Com
2cd00 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
2cd10 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2cd20 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2cd30 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2cd40 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
2cd50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2cd60 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
2cd70 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
2cd80 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2cd90 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2cda0 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
2cdb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2cdc0 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
2cdd0 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
2cde0 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29  arator, SEP_Tab)
2cdf0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ce00 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63  c2=='i' && strnc
2ce10 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
2ce20 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
2ce30 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2ce40 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
2ce50 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
2ce60 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  (p, nArg>=3 ? az
2ce70 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22  Arg[2] : "table"
2ce80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2ce90 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e   c2=='q' && strn
2cea0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75  cmp(azArg[1],"qu
2ceb0 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ote",n2)==0 ){. 
2cec0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2ced0 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d  ODE_Quote;.    }
2cee0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27  else if( c2=='a'
2cef0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2cf00 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29  g[1],"ascii",n2)
2cf10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2cf20 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69  mode = MODE_Asci
2cf30 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
2cf40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2cf50 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2cf60 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2cf70 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20  or, SEP_Unit);. 
2cf80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2cf90 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2cfa0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2cfb0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2cfc0 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20  SEP_Record);.   
2cfd0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
2cfe0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
2cff0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2d000 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d  current output m
2d010 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65  ode: %s\n", mode
2d020 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
2d030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d040 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2d050 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64  err, "Error: mod
2d060 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
2d070 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22  of: ".         "
2d080 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76  ascii column csv
2d090 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e   html insert lin
2d0a0 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62  e list quote tab
2d0b0 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20  s tcl\n");.     
2d0c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2d0d0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
2d0e0 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a  >mode;.  }else..
2d0f0 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20    if( c=='n' && 
2d100 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d110 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e  , "nullvalue", n
2d120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2d130 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2d140 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d150 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c  f(sizeof(p->null
2d160 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56  Value), p->nullV
2d170 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
2d190 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
2d1a0 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ize(p->nullValue
2d1b0 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
2d1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d1d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d1e0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c  rr, "Usage: .nul
2d1f0 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22  lvalue STRING\n"
2d200 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2d210 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2d220 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
2d230 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d240 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20  , "open", n)==0 
2d250 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63  && n>=2 ){.    c
2d260 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d  har *zNewFilenam
2d270 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
2d280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d290 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
2d2a0 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20  int iName = 1;  
2d2b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2d2c0 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20   azArg[] of the 
2d2d0 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  filename */.    
2d2e0 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b  int newFlag = 0;
2d2f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2d300 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f  delete file befo
2d310 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  re opening */.  
2d320 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65    /* Close the e
2d330 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
2d340 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
2d350 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20  close_all(p);.  
2d360 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2d370 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
2d380 62 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44  b = 0;.    p->zD
2d390 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  bFilename = 0;. 
2d3a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d3b0 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29  p->zFreeOnClose)
2d3c0 3b 0a 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e  ;.    p->zFreeOn
2d3d0 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 20 20 2f  Close = 0;.    /
2d3e0 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d  * Check for comm
2d3f0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
2d400 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e  ts */.    for(iN
2d410 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72  ame=1; iName<nAr
2d420 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65  g && azArg[iName
2d430 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65  ][0]=='-'; iName
2d440 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
2d450 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
2d460 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69  [iName];.      i
2d470 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
2d480 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20  ,"new") ){.     
2d490 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a     newFlag = 1;.
2d4a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d4b0 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
2d4c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d4d0 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
2d4e0 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
2d4f0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   z);.        rc 
2d500 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2d510 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2d520 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2d530 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66   }.    /* If a f
2d540 69 6c 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69  ilename is speci
2d550 66 69 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65  fied, try to ope
2d560 6e 20 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20  n it first */.  
2d570 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d    zNewFilename =
2d580 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71   nArg>iName ? sq
2d590 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2d5a0 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  s", azArg[iName]
2d5b0 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  ) : 0;.    if( z
2d5c0 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  NewFilename ){. 
2d5d0 20 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67       if( newFlag
2d5e0 20 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69   ) shellDeleteFi
2d5f0 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  le(zNewFilename)
2d600 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69  ;.      p->zDbFi
2d610 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c  lename = zNewFil
2d620 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65  ename;.      ope
2d630 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20  n_db(p, 1);.    
2d640 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
2d650 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2d660 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2d670 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2d680 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46  n '%s'\n", zNewF
2d690 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2d6a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d6b0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
2d6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d6d0 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f     p->zFreeOnClo
2d6e0 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  se = zNewFilenam
2d6f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2d700 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
2d710 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73  0 ){.      /* As
2d720 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65   a fall-back ope
2d730 6e 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73  n a TEMP databas
2d740 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44  e */.      p->zD
2d750 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  bFilename = 0;. 
2d760 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
2d770 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
2d780 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 0a  e..  if( c=='o'.
2d790 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61     && (strncmp(a
2d7a0 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74  zArg[0], "output
2d7b0 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
2d7c0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2d7d0 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  nce", n)==0).  )
2d7e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2d7f0 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d   *zFile = nArg>=
2d800 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
2d810 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69 66 28  stdout";.    if(
2d820 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20   nArg>2 ){.     
2d830 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d840 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73  err, "Usage: .%s
2d850 20 46 49 4c 45 5c 6e 22 2c 20 61 7a 41 72 67 5b   FILE\n", azArg[
2d860 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0]);.      rc = 
2d870 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2d880 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2d890 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2d8a0 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
2d8b0 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20  Arg[0], "once", 
2d8c0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
2d8d0 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
2d8e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2d8f0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2d900 2e 6f 6e 63 65 20 46 49 4c 45 5c 6e 22 29 3b 0a  .once FILE\n");.
2d910 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2d920 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2d930 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2d940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
2d950 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20  >outCount = 2;. 
2d960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d970 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b  p->outCount = 0;
2d980 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75  .    }.    outpu
2d990 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20  t_reset(p);.    
2d9a0 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c  if( zFile[0]=='|
2d9b0 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ' ){.#ifdef SQLI
2d9c0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
2d9d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d9e0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70  tderr, "Error: p
2d9f0 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ipes are not sup
2da00 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f  ported in this O
2da10 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  S\n");.      rc 
2da20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  = 1;.      p->ou
2da30 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73  t = stdout;.#els
2da40 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  e.      p->out =
2da50 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31   popen(zFile + 1
2da60 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
2da70 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20  ( p->out==0 ){. 
2da80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2da90 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2daa0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69  : cannot open pi
2dab0 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  pe \"%s\"\n", zF
2dac0 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ile + 1);.      
2dad0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
2dae0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
2daf0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2db00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2db10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2db20 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2db30 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2db40 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  File);.      }.#
2db50 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2db60 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
2db70 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
2db80 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (zFile);.      i
2db90 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
2dba0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2dbb0 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21  mp(zFile,"off")!
2dbc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2dbd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2dbe0 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2dbf0 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c  t write to \"%s\
2dc00 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
2dc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
2dc30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2dc40 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
2dc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2dc60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2dc70 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2dc80 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2dc90 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
2dca0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2dcb0 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e  if( c=='p' && n>
2dcc0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2dcd0 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c  Arg[0], "print",
2dce0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   n)==0 ){.    in
2dcf0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
2dd00 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2dd10 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29 20        if( i>1 ) 
2dd20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2dd30 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 75  t, " ");.      u
2dd40 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2dd50 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  t, "%s", azArg[i
2dd60 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ]);.    }.    ra
2dd70 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2dd80 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a   "\n");.  }else.
2dd90 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
2dda0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2ddb0 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d  ], "prompt", n)=
2ddc0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2ddd0 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20  rg >= 2) {.     
2dde0 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f   strncpy(mainPro
2ddf0 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e  mpt,azArg[1],(in
2de00 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69 6e  t)ArraySize(main
2de10 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
2de20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  }.    if( nArg >
2de30 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 3) {.      str
2de40 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f  ncpy(continuePro
2de50 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e  mpt,azArg[2],(in
2de60 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e 74  t)ArraySize(cont
2de70 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a  inuePrompt)-1);.
2de80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2de90 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20 73   if( c=='q' && s
2dea0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2deb0 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "quit", n)==0 )
2dec0 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  {.    rc = 2;.  
2ded0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dee0 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
2def0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2df00 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "read", n)==0 )
2df10 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b  {.    FILE *alt;
2df20 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2df30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2df40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2df50 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c  age: .read FILE\
2df60 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2df70 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2df80 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2df90 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d  .    }.    alt =
2dfa0 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
2dfb0 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
2dfc0 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  alt==0 ){.      
2dfd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2dfe0 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2dff0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2e000 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2e010 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2e020 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e030 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
2e040 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
2e050 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
2e060 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2e070 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
2e080 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e090 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e  0], "restore", n
2e0a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2e0b0 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
2e0c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2e0d0 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74   *zDb;.    sqlit
2e0e0 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
2e0f0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
2e100 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
2e110 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
2e120 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2e130 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
2e140 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
2e150 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
2e160 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2e170 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  rg==3 ){.      z
2e180 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
2e190 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  2];.      zDb = 
2e1a0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65  azArg[1];.    }e
2e1b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2e1c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2e1d0 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f  sage: .restore ?
2e1e0 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  DB? FILE\n");.  
2e1f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2e200 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2e210 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2e220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e230 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20  _open(zSrcFile, 
2e240 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20  &pSrc);.    if( 
2e250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e260 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2e270 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2e280 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2e290 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69  "%s\"\n", zSrcFi
2e2a0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
2e2b0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
2e2c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e2d0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2e2e0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2e2f0 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2e300 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62  ackup_init(p->db
2e310 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  , zDb, pSrc, "ma
2e320 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
2e330 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
2e340 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e350 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2e360 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2e370 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2e380 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2e390 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
2e3a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2e3b0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
2e3c0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
2e3d0 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
2e3e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
2e3f0 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
2e400 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20  ITE_BUSY  ){.   
2e410 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e420 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2e430 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
2e440 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
2e450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2e460 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
2e470 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2e480 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
2e490 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
2e4a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e4b0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
2e4c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2e4d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
2e4e0 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
2e4f0 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
2e500 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2e510 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75  err, "Error: sou
2e520 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20  rce database is 
2e530 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  busy\n");.      
2e540 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
2e550 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2e560 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2e570 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2e580 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2e590 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
2e5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e5b0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
2e5c0 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 69 66 28  .  }else...  if(
2e5d0 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
2e5e0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
2e5f0 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20  anstats", n)==0 
2e600 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2e610 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
2e620 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f  canstatsOn = boo
2e630 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2e640 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
2e650 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
2e660 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
2e670 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2e680 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
2e690 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
2e6a0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
2e6b0 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
2e6c0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2e6d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2e6e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
2e6f0 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
2e700 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2e710 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2e720 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
2e730 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e740 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
2e750 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2e760 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
2e770 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2e780 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2e790 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
2e7a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
2e7b0 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
2e7c0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
2e7d0 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
2e7e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
2e7f0 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
2e800 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
2e810 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
2e820 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
2e830 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
2e840 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
2e850 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
2e860 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2e870 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
2e880 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
2e890 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
2e8a0 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
2e8b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
2e8c0 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
2e8d0 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
2e8e0 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
2e8f0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2e900 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
2e910 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e920 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
2e930 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
2e940 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
2e950 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
2e960 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
2e970 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
2e980 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
2e990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e9a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2e9b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
2e9c0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
2e9d0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
2e9e0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2e9f0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2ea00 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2ea10 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2ea20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
2ea30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
2ea40 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
2ea50 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
2ea60 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
2ea70 22 2c 20 30 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ", 0)==0;.      
2ea80 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
2ea90 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
2eaa0 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
2eab0 6d 70 5f 6d 61 73 74 65 72 22 2c 30 29 3d 3d 30  mp_master",0)==0
2eac0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2ead0 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
2eae0 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
2eaf0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
2eb00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2eb10 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
2eb20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
2eb30 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
2eb60 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
2eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2eb80 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
2ebb0 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ebd0 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
2ebe0 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2ec00 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec20 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
2ec30 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
2ec40 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
2ec50 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
2ec60 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
2ec70 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
2ec80 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
2ec90 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
2eca0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
2ecb0 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
2ecc0 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
2ecd0 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
2ece0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
2ecf0 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
2ed00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ed10 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
2ed20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ed30 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
2ed40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2ed50 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
2ed60 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
2ed70 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
2ed80 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
2edb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2edc0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2edd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ede0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2edf0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2ee00 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
2ee10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2ee20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2ee30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ee40 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2ee50 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2ee60 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
2ee70 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
2ee80 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
2ee90 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
2eea0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
2eeb0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
2eec0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
2eed0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
2eee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
2eef0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2ef00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ef10 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2ef20 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
2ef30 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
2ef40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2ef50 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
2ef60 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
2ef70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
2ef80 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2ef90 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
2efa0 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
2efb0 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
2efc0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2efd0 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
2efe0 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
2eff0 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
2f000 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2f010 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
2f020 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
2f030 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2f040 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
2f050 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
2f060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f070 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2f080 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
2f090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f0a0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f0b0 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
2f0c0 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
2f0d0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
2f0e0 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
2f0f0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f100 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
2f110 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
2f120 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2f130 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
2f140 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
2f150 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2f160 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
2f170 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f180 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
2f190 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
2f1a0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2f1b0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
2f1c0 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
2f1d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2f1e0 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
2f1f0 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
2f200 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2f210 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2f220 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2f230 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
2f240 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
2f250 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
2f260 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2f270 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
2f280 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
2f290 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
2f2a0 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
2f2b0 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
2f2c0 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
2f2d0 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
2f2e0 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
2f2f0 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
2f300 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
2f310 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
2f320 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
2f330 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
2f340 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
2f350 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2f360 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
2f370 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
2f380 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2f390 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20  ( strchr(zName, 
2f3a0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
2f3b0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2f3c0 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72  elect, "lower(pr
2f3d0 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61  intf('%s.%s',sna
2f3e0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20  me,tbl_name))", 
2f3f0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
2f400 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
2f410 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2f420 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  , "lower(tbl_nam
2f430 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  e)", 0);.       
2f440 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
2f450 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f460 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a  strchr(zName, '*
2f470 27 29 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20  ') ? " GLOB " : 
2f480 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20  " LIKE ", 0);.  
2f490 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2f4a0 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67  (&sSelect, zQarg
2f4b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
2f4c0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2f4d0 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a  t, " AND ", 0);.
2f4e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f4f0 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20  free(zQarg);.   
2f500 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
2f510 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f520 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e  "type!='meta' AN
2f530 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
2f540 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
2f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2f560 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72  ORDER BY snum, r
2f570 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  owid", 0);.     
2f580 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20   if( bDebug ){. 
2f590 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f5a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a  tf(p->out, "SQL:
2f5b0 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74   %s;\n", sSelect
2f5c0 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .z);.      }else
2f5d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2f5e0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2f5f0 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61  b, sSelect.z, ca
2f600 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
2f610 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f620 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74  }.      freeText
2f630 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
2f640 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
2f650 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
2f660 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
2f670 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
2f680 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
2f690 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
2f6a0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
2f6b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f6c0 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
2f6d0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f6e0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2f6f0 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65  r: querying sche
2f700 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ma information\n
2f710 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2f720 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f730 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
2f740 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65  .  }else..#if de
2f750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
2f760 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
2f770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
2f780 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20  ECTTRACE).  if( 
2f790 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20  c=='s' && n==11 
2f7a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2f7b0 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63  [0], "selecttrac
2f7c0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2f7d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2f7e0 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ace = (int)integ
2f7f0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
2f800 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
2f810 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
2f820 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
2f830 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27  SION).  if( c=='
2f840 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
2f850 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22  Arg[0],"session"
2f860 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29  ,n)==0 && n>=3 )
2f870 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f  {.    OpenSessio
2f880 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70  n *pSession = &p
2f890 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20  ->aSession[0];. 
2f8a0 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20     char **azCmd 
2f8b0 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20  = &azArg[1];.   
2f8c0 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20   int iSes = 0;. 
2f8d0 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41     int nCmd = nA
2f8e0 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20  rg - 1;.    int 
2f8f0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  i;.    if( nArg<
2f900 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
2f910 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2f920 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2f930 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  );.    if( nArg>
2f940 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =3 ){.      for(
2f950 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e  iSes=0; iSes<p->
2f960 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b  nSession; iSes++
2f970 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2f980 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f  trcmp(p->aSessio
2f990 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61  n[iSes].zName, a
2f9a0 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72  zArg[1])==0 ) br
2f9b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2f9c0 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e     if( iSes<p->n
2f9d0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
2f9e0 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70     pSession = &p
2f9f0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
2fa00 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b  ;.        azCmd+
2fa10 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d  +;.        nCmd-
2fa20 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
2fa30 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
2fa40 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
2fa50 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73  0];.        iSes
2fa60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2fa70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73    }..    /* .ses
2fa80 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c  sion attach TABL
2fa90 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  E.    ** Invoke 
2faa0 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
2fab0 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65  on_attach() inte
2fac0 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20  rface to attach 
2fad0 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20  a particular.   
2fae0 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61   ** table so tha
2faf0 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69  t it is never fi
2fb00 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ltered..    */. 
2fb10 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2fb20 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29  Cmd[0],"attach")
2fb30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2fb40 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
2fb50 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
2fb60 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
2fb70 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
2fb80 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
2fb90 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20  n_not_open:.    
2fba0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2fbb0 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
2fbc0 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f  o sessions are o
2fbd0 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  pen\n");.      }
2fbe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2fbf0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
2fc00 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
2fc10 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  n->p, azCmd[1]);
2fc20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2fc30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
2fc40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2fc50 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73  "ERROR: sqlite3s
2fc60 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
2fc70 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
2fc80 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
2fc90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2fca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2fcb0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
2fcc0 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c  on changeset FIL
2fcd0 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f  E.    ** .sessio
2fce0 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a  n patchset FILE.
2fcf0 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63      ** Write a c
2fd00 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63  hangeset or patc
2fd10 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65  hset into a file
2fd20 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f  .  The file is o
2fd30 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  verwritten..    
2fd40 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2fd50 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e  p(azCmd[0],"chan
2fd60 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74  geset")==0 || st
2fd70 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70  rcmp(azCmd[0],"p
2fd80 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a  atchset")==0 ){.
2fd90 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
2fda0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
2fdb0 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
2fdc0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
2fdd0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
2fde0 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67  ession->p==0 ) g
2fdf0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f  oto session_not_
2fe00 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20  open;.      out 
2fe10 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d  = fopen(azCmd[1]
2fe20 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
2fe30 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
2fe40 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2fe50 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
2fe60 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
2fe70 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c  s\" for writing\
2fe80 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  n", azCmd[1]);. 
2fe90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fea0 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a      int szChng;.
2feb0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2fec0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  hng;.        if(
2fed0 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63   azCmd[0][0]=='c
2fee0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ' ){.          r
2fef0 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
2ff00 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65  on_changeset(pSe
2ff10 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e  ssion->p, &szChn
2ff20 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20  g, &pChng);.    
2ff30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ff40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ff50 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
2ff60 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
2ff70 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
2ff80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ffa0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45         printf("E
2ffb0 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65  rror: error code
2ffc0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
2ffd0 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
2ffe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fff0 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20   if( pChng.     
30000 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70       && fwrite(p
30010 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c  Chng, szChng, 1,
30020 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20   out)!=1 ){.    
30030 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
30040 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
30050 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65   Failed to write
30060 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20   entire %d-byte 
30070 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20  output\n",.     
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43               szC
30090 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
300a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
300b0 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20  free(pChng);.   
300c0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
300d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
300e0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
300f0 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a  sion close.    *
30100 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e  * Close the iden
30110 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20  tified session. 
30120 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
30130 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
30140 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  close")==0 ){.  
30150 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
30160 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
30170 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
30180 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
30190 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  on ){.        se
301a0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73  ssion_close(pSes
301b0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  sion);.        p
301c0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
301d0 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d   = p->aSession[-
301e0 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  -p->nSession];. 
301f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
30200 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
30210 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41  n enable ?BOOLEA
30220 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
30230 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c  or set the enabl
30240 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  e flag.    */.  
30250 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
30260 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29  md[0], "enable")
30270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
30280 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
30290 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
302a0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
302b0 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
302c0 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
302d0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
302e0 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
302f0 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
30300 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
30310 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65  e3session_enable
30320 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69  (pSession->p, ii
30330 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
30340 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
30350 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c  session %s enabl
30360 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  e flag = %d\n",.
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30380 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
30390 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
303a0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
303b0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c   /* .session fil
303c0 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20  ter GLOB .....  
303d0 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20    ** Set a list 
303e0 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  of GLOB patterns
303f0 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20   of table names 
30400 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  to be excluded..
30410 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
30420 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
30430 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a  "filter")==0 ){.
30440 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42        int ii, nB
30450 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
30460 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd<2 ) goto ses
30470 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
30480 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
30490 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
304a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
304b0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
304c0 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  er; ii++){.     
304d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
304e0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
304f0 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20  lter[ii]);.     
30500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
30510 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
30520 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
30530 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
30540 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e  izeof(pSession->
30550 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43  azFilter[0])*(nC
30560 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70  md-1);.        p
30570 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
30580 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
30590 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
305a0 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
305b0 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29  n->azFilter==0 )
305c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
305d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
305e0 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65  Error: out or me
305f0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
30600 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
30610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
30620 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64  or(ii=1; ii<nCmd
30630 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
30640 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
30650 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71  ilter[ii-1] = sq
30660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
30670 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a  s", azCmd[ii]);.
30680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30690 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
306a0 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20  ter = ii-1;.    
306b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
306c0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69     /* .session i
306d0 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
306e0 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
306f0 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65  r set the indire
30700 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  ct flag.    */. 
30710 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
30720 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63  Cmd[0], "indirec
30730 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
30740 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
30750 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20  ( nCmd>2 ) goto 
30760 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
30770 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d  rror;.      ii =
30780 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20   nCmd==1 ? -1 : 
30790 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43  booleanValue(azC
307a0 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  md[1]);.      if
307b0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
307c0 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
307d0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
307e0 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e  irect(pSession->
307f0 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
30800 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30810 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
30820 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20  indirect flag = 
30830 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
30840 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
30850 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
30860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30870 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
30880 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20  ion isempty.    
30890 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
308a0 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
308b0 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mpty.    */.    
308c0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
308d0 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d  [0], "isempty")=
308e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
308f0 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
30900 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
30910 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
30920 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
30930 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
30940 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
30950 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28  session_isempty(
30960 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
30970 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30980 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
30990 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c  on %s isempty fl
309a0 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309c0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
309d0 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
309e0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
309f0 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20  .session list.  
30a00 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75    ** List all cu
30a10 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
30a20 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20  sions.    */.   
30a30 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
30a40 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20  d[0],"list")==0 
30a50 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
30a60 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
30a70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
30a80 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
30a90 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c  t, "%d %s\n", i,
30aa0 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e   p->aSession[i].
30ab0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
30ac0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
30ad0 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20  * .session open 
30ae0 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f  DB NAME.    ** O
30af0 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
30b00 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e  n called NAME on
30b10 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61   the attached da
30b20 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a  tabase DB..    *
30b30 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  * DB is normally
30b40 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a   "main"..    */.
30b50 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
30b60 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d  zCmd[0],"open")=
30b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
30b80 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69   *zName;.      i
30b90 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74  f( nCmd!=3 ) got
30ba0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
30bb0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e  _error;.      zN
30bc0 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a  ame = azCmd[2];.
30bd0 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
30be0 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  0]==0 ) goto ses
30bf0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
30c00 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
30c10 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
30c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
30c30 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
30c40 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ssion[i].zName,z
30c50 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
30c60 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30c70 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69  f(stderr, "Sessi
30c80 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  on \"%s\" alread
30c90 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61  y exists\n", zNa
30ca0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
30cb0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30cc0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
30cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30ce0 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d  f( p->nSession>=
30cf0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
30d00 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  ssion) ){.      
30d10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
30d20 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66  err, "Maximum of
30d30 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c   %d sessions\n",
30d40 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53   ArraySize(p->aS
30d50 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  ession));.      
30d60 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
30d70 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
30d80 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  }.      pSession
30d90 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
30da0 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
30db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30dc0 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70  session_create(p
30dd0 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20  ->db, azCmd[1], 
30de0 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  &pSession->p);. 
30df0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
30e00 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
30e10 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
30e20 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20  t open session: 
30e30 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22  error code=%d\n"
30e40 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
30e50 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  c = 0;.        g
30e60 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30e70 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
30e80 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e       pSession->n
30e90 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Filter = 0;.    
30ea0 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
30eb0 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53  _table_filter(pS
30ec0 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69  ession->p, sessi
30ed0 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73  on_filter, pSess
30ee0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ion);.      p->n
30ef0 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  Session++;.     
30f00 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
30f10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30f20 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
30f30 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f  .    }else.    /
30f40 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20  * If no command 
30f50 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68  name matches, sh
30f60 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ow a syntax erro
30f70 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  r */.    session
30f80 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20  _syntax_error:. 
30f90 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28     session_help(
30fa0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
30fb0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
30fc0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64  E_DEBUG.  /* Und
30fd0 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
30fe0 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ds for internal 
30ff0 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63  testing.  Subjec
31000 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  t to change.  **
31010 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e   without notice.
31020 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27   */.  if( c=='s'
31030 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72   && n>=10 && str
31040 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31050 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d  selftest-", 9)==
31060 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  0 ){.    if( str
31070 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
31080 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29   "boolean", n-9)
31090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
310a0 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72   i, v;.      for
310b0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
310c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  +){.        v = 
310d0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
310e0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
310f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31100 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
31110 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
31120 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
31130 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
31140 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
31150 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
31160 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
31170 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
31180 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
31190 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
311a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
311b0 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
311c0 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
311d0 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
311e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
311f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
31200 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c  f),zBuf,"%s: %ll
31210 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41  d 0x%llx\n", azA
31220 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20  rg[i],v,v);.    
31230 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31240 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
31250 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
31260 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
31270 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
31280 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
31290 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c  mp(azArg[0],"sel
312a0 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  ftest",n)==0 ){.
312b0 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20      int bIsInit 
312c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
312d0 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  True to initiali
312e0 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  ze the SELFTEST 
312f0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
31300 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
31310 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65        /* Verbose
31320 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
31330 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69 73  nt bSelftestExis
31340 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ts;     /* True 
31350 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65  if SELFTEST alre
31360 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
31370 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
31380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
31390 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
313a0 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
313b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
313c0 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
313d0 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
313e0 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
313f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31400 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
31410 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
31420 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
31430 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
31440 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ry */.    sqlite
31450 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
31460 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69  0; /* Query agai
31470 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53 54  nst the SELFTEST
31480 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f   table */..    o
31490 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20  pen_db(p,0);.   
314a0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
314b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
314c0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
314d0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
314e0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
314f0 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
31500 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
31510 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
31520 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e 69  {.        bIsIni
31530 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
31540 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
31550 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29  cmp(z,"-v")==0 )
31560 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62 6f  {.        bVerbo
31570 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  se++;.      }els
31580 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
31590 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
315a0 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
315b0 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
315c0 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
315e0 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30  zArg[i], azArg[0
315f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ]);.        raw_
31600 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31610 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
31620 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b  : --init -v\n");
31630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
31640 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
31650 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
31660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
31680 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
31690 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e  data(p->db,"main
316a0 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30  ","selftest",0,0
316b0 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20  ,0,0,0,0).      
316c0 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f       != SQLITE_O
316d0 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  K ){.      bSelf
316e0 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a  testExists = 0;.
316f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31700 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
31710 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
31720 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20  if( bIsInit ){. 
31730 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66 74       createSelft
31740 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20  estTable(p);.   
31750 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
31760 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
31770 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72 29    initText(&str)
31780 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
31790 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a  (&str, "x", 0);.
317a0 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74      for(k=bSelft
317b0 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b  estExists; k>=0;
317c0 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   k--){.      if(
317d0 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k==1 ){.       
317e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
317f0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
31800 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
31810 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  ECT tno,op,cmd,a
31820 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  ns FROM selftest
31830 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a   ORDER BY tno",.
31840 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
31850 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
31860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
31880 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
31890 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
318a0 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73  S(0,'memo','Miss
318b0 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61 62  ing SELFTEST tab
318c0 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65  le - default che
318d0 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a  cks only',''),".
318e0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
318f0 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d   (1,'run','PRAGM
31900 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
31910 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20  k','ok')",.     
31920 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
31930 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
31940 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31950 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31960 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71  stderr, "Error q
31970 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66  uerying the self
31980 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a  test table\n");.
31990 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
319a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
319b0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
319c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
319d0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
319e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
319f0 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f  or(i=1; sqlite3_
31a00 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
31a10 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20  ITE_ROW; i++){. 
31a20 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d         int tno =
31a30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
31a40 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
31a50 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
31a60 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
31a70 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
31a80 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
31a90 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   1);.        con
31aa0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
31ab0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31ac0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
31ad0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
31ae0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31af0 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  zAns = (const ch
31b00 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
31b10 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
31b20 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  );..        k = 
31b30 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  0;.        if( b
31b40 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20  Verbose>0 ){.   
31b50 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75         char *zQu
31b60 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ote = sqlite3_mp
31b70 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c  rintf("%q", zSql
31b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  );.          pri
31b90 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e  ntf("%d: %s %s\n
31ba0 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71  ", tno, zOp, zSq
31bb0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
31bc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
31bd0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
31be0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
31bf0 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20  (zOp,"memo")==0 
31c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
31c10 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
31c20 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
31c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
31c40 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
31c50 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29  (zOp,"run")==0 )
31c60 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
31c70 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
31c80 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d           str.n =
31c90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
31ca0 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  r.z[0] = 0;.    
31cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31cc0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
31cd0 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70  Sql, captureOutp
31ce0 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72  utCallback, &str
31cf0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
31d00 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a         nTest++;.
31d10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 56            if( bV
31d20 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
31d30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31d40 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c  f(p->out, "Resul
31d50 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29  t: %s\n", str.z)
31d60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31d70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c          if( rc |
31d80 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
31d90 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
31da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31db0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
31dc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
31dd0 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d  out, "%d: error-
31de0 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20  code-%d: %s\n", 
31df0 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  tno, rc, zErrMsg
31e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
31e10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
31e20 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
31e30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
31e40 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20  (zAns,str.z)!=0 
31e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
31e60 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
31e70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
31e80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31e90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
31ea0 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
31eb0 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20  ", tno, zAns);. 
31ec0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
31ed0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31ee0 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  %d:      Got: [%
31ef0 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e  s]\n", tno, str.
31f00 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
31f10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
31f20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
31f30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
31f40 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
31f50 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61    "Unknown opera
31f60 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73  tion \"%s\" on s
31f70 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c  elftest line %d\
31f80 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20  n", zOp, tno);. 
31f90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
31fa0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
31fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31fc0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
31fd0 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e  over rows of con
31fe0 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45  tent from SELFTE
31ff0 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ST */.      sqli
32000 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
32010 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  mt);.    } /* En
32020 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f  d loop over k */
32030 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
32040 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  tr);.    utf8_pr
32050 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
32060 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
32070 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72  d tests\n", nErr
32080 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , nTest);.  }els
32090 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
320a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
320b0 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
320c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
320d0 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72  f( nArg<2 || nAr
320e0 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
320f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32100 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74  "Usage: .separat
32110 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29  or COL ?ROW?\n")
32120 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
32140 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
32150 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32160 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
32170 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
32180 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
32190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321a0 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
321b0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65  raySize(p->colSe
321c0 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
321d0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[1]);.    }.   
321e0 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
321f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32200 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32210 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
32220 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
32230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32240 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
32250 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
32260 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d  ->rowSeparator)-
32270 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  1, azArg[2]);.  
32280 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
32290 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
322a0 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
322b0 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c  rg[0],"sha3sum",
322c0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
322d0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
322e0 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74   0;   /* Which t
322f0 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d  able to checksum
32300 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74  . 0 means everyt
32310 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hing */.    int 
32320 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
32330 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
32340 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
32350 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  bSchema = 0;    
32360 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73       /* Also has
32370 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  h the schema */.
32380 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61 74      int bSeparat
32390 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
323a0 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65 20  Hash each table 
323b0 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
323c0 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32    int iSize = 22
323d0 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  4;         /* Ha
323e0 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  sh algorithm to 
323f0 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  use */.    int b
32400 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20  Debug = 0;      
32410 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
32420 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
32430 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a  would have run *
32440 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
32450 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
32460 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74  * For querying t
32470 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20  ables names */. 
32480 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
32490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
324a0 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  QL to be run */.
324b0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20      char *zSep; 
324c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
324d0 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20  Separator */.   
324e0 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b   ShellText sSql;
324f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
32500 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68  plete SQL for th
32510 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74  e query to run t
32520 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53  he hash */.    S
32530 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b  hellText sQuery;
32540 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
32550 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  f queries used t
32560 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65  o read all conte
32570 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64  nt */.    open_d
32580 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
32590 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
325a0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
325b0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
325c0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  i];.      if( z[
325d0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
325e0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
325f0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
32600 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
32610 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d   strcmp(z,"schem
32620 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  a")==0 ){.      
32630 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b      bSchema = 1;
32640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
32650 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
32660 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d  p(z,"sha3-224")=
32670 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
32680 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20  sha3-256")==0.  
32690 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
326a0 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d  (z,"sha3-384")==
326b0 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73  0 || strcmp(z,"s
326c0 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20  ha3-512")==0.   
326d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
326e0 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26    iSize = atoi(&
326f0 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[5]);.        }
32700 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
32710 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
32720 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
32730 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
32740 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
32750 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
32760 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
32770 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
32780 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
32790 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
327a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327b0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
327c0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0]);.          r
327d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
327e0 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65  , "Should be one
327f0 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20   of: --schema". 
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d              " --
32820 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d  sha3-224 --sha3-
32830 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d  255 --sha3-384 -
32840 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20  -sha3-512\n");. 
32850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
32860 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32870 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
32880 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
32890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
328a0 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
328b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
328c0 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75   "Usage: .sha3su
328d0 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b  m ?OPTIONS? ?LIK
328e0 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
328f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32900 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
32910 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
32920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32930 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a       zLike = z;.
32940 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61 74          bSeparat
32950 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
32960 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
32970 6b 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a  ke("sqlite_%", z
32980 4c 69 6b 65 2c 20 30 29 3d 3d 30 20 29 20 62 53  Like, 0)==0 ) bS
32990 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
329a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
329b0 20 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   bSchema ){.    
329c0 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
329d0 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
329e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
329f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
32a00 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
32a10 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
32a20 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
32a30 20 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e              " UN
32a40 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
32a50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a  sqlite_master'".
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
32a70 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
32a80 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
32a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
32aa0 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
32ab0 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
32ac0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
32ad0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
32ae0 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
32af0 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
32b00 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
32b10 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65        " AND name
32b20 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
32b30 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
32b40 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
32b50 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
32b60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32b70 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
32b80 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
32b90 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
32ba0 6e 69 74 54 65 78 74 28 26 73 51 75 65 72 79 29  nitText(&sQuery)
32bb0 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
32bc0 73 53 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  sSql);.    appen
32bd0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49  dText(&sSql, "WI
32be0 54 48 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72  TH [sha3sum$quer
32bf0 79 5d 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b  y](a,b) AS(",0);
32c00 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c  .    zSep = "VAL
32c10 55 45 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65  UES(";.    while
32c20 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
32c30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
32c40 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
32c50 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63   char *zTab = (c
32c60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
32c70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
32c80 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69  Stmt,0);.      i
32c90 66 28 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69  f( zLike && sqli
32ca0 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b  te3_strlike(zLik
32cb0 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29  e, zTab, 0)!=0 )
32cc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
32cd0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
32ce0 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21  b, "sqlite_",7)!
32cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
32d00 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
32d10 2c 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ,"SELECT * FROM 
32d20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
32d30 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
32d40 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20  y,zTab,'"');.   
32d50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
32d60 26 73 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e  &sQuery," NOT IN
32d70 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20  DEXED;", 0);.   
32d80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
32d90 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
32da0 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
32db0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
32dc0 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
32dd0 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
32de0 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20  l_name,sql FROM 
32df0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e10 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
32e20 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
32e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32e40 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
32e50 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
32e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
32e70 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
32e80 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73  y,"SELECT name,s
32e90 65 71 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  eq FROM sqlite_s
32ea0 65 71 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20  equence".       
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
32ed0 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
32ee0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
32ef0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
32f00 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
32f10 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
32f20 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
32f30 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
32f40 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22  OM sqlite_stat1"
32f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32f60 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
32f70 44 45 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22  DER BY tbl,idx;"
32f80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
32f90 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
32fa0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
32fb0 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ")==0.          
32fc0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61     || strcmp(zTa
32fd0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
32fe0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
32ff0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
33000 65 72 79 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ery, "SELECT * F
33010 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
33020 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33030 51 75 65 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b  Query, zTab, 0);
33040 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33050 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 20 4f  ext(&sQuery, " O
33060 52 44 45 52 20 42 59 20 74 62 6c 2c 20 69 64 78  RDER BY tbl, idx
33070 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b  , rowid;\n", 0);
33080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
33090 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
330a0 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20 20 20 20   zSep, 0);.     
330b0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
330c0 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27  l, sQuery.z, '\'
330d0 27 29 3b 0a 20 20 20 20 20 20 73 51 75 65 72 79  ');.      sQuery
330e0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 70  .n = 0;.      ap
330f0 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
33100 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ",", 0);.      a
33110 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
33120 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20   zTab, '\'');.  
33130 20 20 20 20 7a 53 65 70 20 3d 20 22 29 2c 28 22      zSep = "),("
33140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33150 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33160 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 62 53 65  mt);.    if( bSe
33170 70 61 72 61 74 65 20 29 7b 0a 20 20 20 20 20 20  parate ){.      
33180 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
33190 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
331a0 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20 20    "%s))".       
331b0 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65     " SELECT lowe
331c0 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  r(hex(sha3_query
331d0 28 61 2c 25 64 29 29 29 20 41 53 20 68 61 73 68  (a,%d))) AS hash
331e0 2c 20 62 20 41 53 20 6c 61 62 65 6c 22 0a 20 20  , b AS label".  
331f0 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
33200 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
33210 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
33220 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
33230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
33240 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
33250 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
33260 22 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20  "%s))".         
33270 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28   " SELECT lower(
33280 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 67  hex(sha3_query(g
33290 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27  roup_concat(a,''
332a0 29 2c 25 64 29 29 29 20 41 53 20 68 61 73 68 22  ),%d))) AS hash"
332b0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
332c0 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
332d0 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
332e0 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
332f0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 54 65      }.    freeTe
33300 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20  xt(&sQuery);.   
33310 20 66 72 65 65 54 65 78 74 28 26 73 53 71 6c 29   freeText(&sSql)
33320 3b 0a 20 20 20 20 69 66 28 20 62 44 65 62 75 67  ;.    if( bDebug
33330 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
33340 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
33350 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
33360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
33370 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
33380 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
33390 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
333a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
333b0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
333c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
333d0 0a 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28  .   && (strncmp(
333e0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c  azArg[0], "shell
333f0 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
33400 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79  cmp(azArg[0],"sy
33410 73 74 65 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29  stem",n)==0).  )
33420 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64  {.    char *zCmd
33430 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a  ;.    int i, x;.
33440 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
33450 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
33460 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
33470 65 3a 20 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41  e: .system COMMA
33480 4e 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ND\n");.      rc
33490 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
334a0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
334b0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  it;.    }.    zC
334c0 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
334d0 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41 72  intf(strchr(azAr
334e0 67 5b 31 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73  g[1],' ')==0?"%s
334f0 22 3a 22 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72  ":"\"%s\"", azAr
33500 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  g[1]);.    for(i
33510 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =2; i<nArg; i++)
33520 7b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73  {.      zCmd = s
33530 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73  qlite3_mprintf(s
33540 74 72 63 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27  trchr(azArg[i],'
33550 20 27 29 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22   ')==0?"%z %s":"
33560 25 7a 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  %z \"%s\"",.    
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 20 20 20 20 20 20 20 20 7a 43 6d 64 2c 20 61           zCmd, a
33590 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
335a0 20 20 20 20 78 20 3d 20 73 79 73 74 65 6d 28 7a      x = system(z
335b0 43 6d 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cmd);.    sqlite
335c0 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
335d0 20 20 69 66 28 20 78 20 29 20 72 61 77 5f 70 72    if( x ) raw_pr
335e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 79  intf(stderr, "Sy
335f0 73 74 65 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74  stem command ret
33600 75 72 6e 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a  urns %d\n", x);.
33610 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
33620 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
33630 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77  (azArg[0], "show
33640 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
33650 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33660 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20 3d 20 7b 20  r *azBool[] = { 
33670 22 6f 66 66 22 2c 20 22 6f 6e 22 2c 20 22 74 72  "off", "on", "tr
33680 69 67 67 65 72 22 2c 20 22 66 75 6c 6c 22 7d 3b  igger", "full"};
33690 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
336a0 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20  if( nArg!=1 ){. 
336b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
336c0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
336d0 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20 20 20 20  .show\n");.     
336e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
336f0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33700 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
33710 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
33720 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
33730 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 0a 20 20 20  s\n","echo",.   
33740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
33760 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48 61 73 46 6c  zBool[ShellHasFl
33770 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
33780 29 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  )]);.    utf8_pr
33790 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
337a0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 71  2.12s: %s\n","eq
337b0 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 61 75  p", azBool[p->au
337c0 74 6f 45 51 50 26 33 5d 29 3b 0a 20 20 20 20 75  toEQP&3]);.    u
337d0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
337e0 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  t, "%12.12s: %s\
337f0 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20  n","explain",.  
33800 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 3d 3d         p->mode==
33810 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 3f 20 22  MODE_Explain ? "
33820 6f 6e 22 20 3a 20 70 2d 3e 61 75 74 6f 45 78 70  on" : p->autoExp
33830 6c 61 69 6e 20 3f 20 22 61 75 74 6f 22 20 3a 20  lain ? "auto" : 
33840 22 6f 66 66 22 29 3b 0a 20 20 20 20 75 74 66 38  "off");.    utf8
33850 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
33860 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
33870 68 65 61 64 65 72 73 22 2c 20 61 7a 42 6f 6f 6c  headers", azBool
33880 5b 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 21 3d  [p->showHeader!=
33890 30 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  0]);.    utf8_pr
338a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
338b0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f  2.12s: %s\n","mo
338c0 64 65 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70  de", modeDescr[p
338d0 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 75 74  ->mode]);.    ut
338e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
338f0 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  , "%12.12s: ", "
33900 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20  nullvalue");.   
33910 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
33920 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75  ng(p->out, p->nu
33930 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
33940 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
33950 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
33960 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
33970 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22  ,"%12.12s: %s\n"
33980 2c 22 6f 75 74 70 75 74 22 2c 0a 20 20 20 20 20  ,"output",.     
33990 20 20 20 20 20 20 20 73 74 72 6c 65 6e 33 30 28         strlen30(
339a0 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d  p->outfile) ? p-
339b0 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73 74 64 6f  >outfile : "stdo
339c0 75 74 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  ut");.    utf8_p
339d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31  rintf(p->out,"%1
339e0 32 2e 31 32 73 3a 20 22 2c 20 22 63 6f 6c 73 65  2.12s: ", "colse
339f0 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20  parator");.     
33a00 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
33a10 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 63 6f 6c 53  (p->out, p->colS
33a20 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
33a30 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
33a40 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
33a50 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
33a60 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  t,"%12.12s: ", "
33a70 72 6f 77 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  rowseparator");.
33a80 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
33a90 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
33aa0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
33ab0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33ac0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
33ad0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33ae0 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
33af0 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c  : %s\n","stats",
33b00 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 74 61 74 73   azBool[p->stats
33b10 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66  On!=0]);.    utf
33b20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
33b30 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 77   "%12.12s: ", "w
33b40 69 64 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20  idth");.    for 
33b50 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61  (i=0;i<(int)Arra
33b60 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
33b70 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74  h) && p->colWidt
33b80 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b  h[i] != 0;i++) {
33b90 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33ba0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 22 2c  f(p->out, "%d ",
33bb0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29   p->colWidth[i])
33bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
33bd0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33be0 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  \n");.    utf8_p
33bf0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
33c00 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 20 22  12.12s: %s\n", "
33c10 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20 20 20  filename",.     
33c20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44             p->zD
33c30 62 46 69 6c 65 6e 61 6d 65 20 3f 20 70 2d 3e 7a  bFilename ? p->z
33c40 44 62 46 69 6c 65 6e 61 6d 65 20 3a 20 22 22 29  DbFilename : "")
33c50 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
33c60 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
33c70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74  mp(azArg[0], "st
33c80 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
33c90 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
33ca0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74 61 74 73  {.      p->stats
33cb0 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
33cc0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
33cd0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
33ce0 3d 31 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70  =1 ){.      disp
33cf0 6c 61 79 5f 73 74 61 74 73 28 70 2d 3e 64 62 2c  lay_stats(p->db,
33d00 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   p, 0);.    }els
33d10 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
33d20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
33d30 67 65 3a 20 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f  ge: .stats ?on|o
33d40 66 66 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ff?\n");.      r
33d50 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
33d60 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
33d70 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
33d80 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
33d90 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 29  "tables", n)==0)
33da0 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 69 27 20 26  .   || (c=='i' &
33db0 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
33dc0 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22 2c 20  [0], "indices", 
33dd0 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
33de0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6e 63 6d         || strncm
33df0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
33e00 65 78 65 73 22 2c 20 6e 29 3d 3d 30 29 20 29 0a  exes", n)==0) ).
33e10 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
33e20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
33e30 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c    char **azResul
33e40 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c  t;.    int nRow,
33e50 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e 74   nAlloc;.    int
33e60 20 69 69 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65   ii;.    ShellTe
33e70 78 74 20 73 3b 0a 20 20 20 20 69 6e 69 74 54 65  xt s;.    initTe
33e80 78 74 28 26 73 29 3b 0a 20 20 20 20 6f 70 65 6e  xt(&s);.    open
33e90 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
33ea0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
33eb0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50  are_v2(p->db, "P
33ec0 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
33ed0 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ist", -1, &pStmt
33ee0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
33ef0 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
33f00 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
33f10 64 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  db);..    if( nA
33f20 72 67 3e 32 20 26 26 20 63 3d 3d 27 69 27 20 29  rg>2 && c=='i' )
33f30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
33f40 20 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 61   an historical a
33f50 63 63 69 64 65 6e 74 20 74 68 61 74 20 74 68 65  ccident that the
33f60 20 2e 69 6e 64 65 78 65 73 20 63 6f 6d 6d 61 6e   .indexes comman
33f70 64 20 73 68 6f 77 73 20 61 6e 20 65 72 72 6f 72  d shows an error
33f80 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  .      ** when c
33f90 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 77  alled with the w
33fa0 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
33fb0 72 67 75 6d 65 6e 74 73 20 77 68 65 72 65 61 73  rguments whereas
33fc0 20 74 68 65 20 2e 74 61 62 6c 65 73 0a 20 20 20   the .tables.   
33fd0 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64 6f     ** command do
33fe0 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  es not. */.     
33ff0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34000 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6e 64  rr, "Usage: .ind
34010 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41 54 54 45  exes ?LIKE-PATTE
34020 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  RN?\n");.      r
34030 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
34040 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
34050 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  xit;.    }.    f
34060 6f 72 28 69 69 3d 30 3b 20 73 71 6c 69 74 65 33  or(ii=0; sqlite3
34070 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
34080 4c 49 54 45 5f 52 4f 57 3b 20 69 69 2b 2b 29 7b  LITE_ROW; ii++){
34090 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
340a0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f  r *zDbName = (co
340b0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
340c0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
340d0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
340e0 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 20  f( zDbName==0 ) 
340f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
34100 69 66 28 20 73 2e 7a 20 26 26 20 73 2e 7a 5b 30  if( s.z && s.z[0
34110 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 26  ] ) appendText(&
34120 73 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22  s, " UNION ALL "
34130 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
34140 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
34150 7a 44 62 4e 61 6d 65 2c 20 22 6d 61 69 6e 22 29  zDbName, "main")
34160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
34170 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 53  ppendText(&s, "S
34180 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
34190 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
341a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  se{.        appe
341b0 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c 45  ndText(&s, "SELE
341c0 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  CT ", 0);.      
341d0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
341e0 20 7a 44 62 4e 61 6d 65 2c 20 27 5c 27 27 29 3b   zDbName, '\'');
341f0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34200 65 78 74 28 26 73 2c 20 22 7c 7c 27 2e 27 7c 7c  ext(&s, "||'.'||
34210 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
34220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34230 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44  ppendText(&s, zD
34240 62 4e 61 6d 65 2c 20 27 22 27 29 3b 0a 20 20 20  bName, '"');.   
34250 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34260 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  , ".sqlite_maste
34270 72 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  r ", 0);.      i
34280 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
34290 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
342a0 26 73 2c 22 20 57 48 45 52 45 20 74 79 70 65 20  &s," WHERE type 
342b0 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
342c0 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  w')".           
342d0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
342e0 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
342f0 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20   'sqlite_%'".   
34300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34310 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20     "   AND name 
34320 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20  LIKE ?1", 0);.  
34330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34340 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34350 2c 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  ," WHERE type='i
34360 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 20  ndex'".         
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
34380 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
34390 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20  KE ?1", 0);.    
343a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
343b0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
343c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
343d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
343e0 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 30 29   ORDER BY 1", 0)
343f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34400 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
34410 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26 70  >db, s.z, -1, &p
34420 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
34430 65 65 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20  eeText(&s);.    
34440 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
34450 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
34460 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20  or(p->db);..    
34470 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  /* Run the SQL s
34480 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72 65  tatement prepare
34490 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 20 62  d by the above b
344a0 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74 68 65 20  lock. Store the 
344b0 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
344c0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 75  s an array of nu
344d0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
344e0 69 6e 67 73 20 69 6e 20 61 7a 52 65 73 75 6c 74  ings in azResult
344f0 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  [].  */.    nRow
34500 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20   = nAlloc = 0;. 
34510 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b     azResult = 0;
34520 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
34530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34540 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
34550 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d  , 1, azArg[1], -
34560 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
34570 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ENT);.    }else{
34580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
34590 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
345a0 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49  1, "%", -1, SQLI
345b0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
345c0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  }.    while( sql
345d0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
345e0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
345f0 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d        if( nRow>=
34600 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
34610 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
34620 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20 3d          int n2 =
34630 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a   nAlloc*2 + 10;.
34640 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d 20          azNew = 
34650 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
34660 34 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65  4(azResult, size
34670 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a  of(azResult[0])*
34680 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n2);.        if(
34690 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   azNew==0 ){.   
346a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c         rc = shel
346b0 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20  lNomemError();. 
346c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
346d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
346e0 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a 20    nAlloc = n2;. 
346f0 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 20         azResult 
34700 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d  = azNew;.      }
34710 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b  .      azResult[
34720 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f  nRow] = sqlite3_
34730 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
34740 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
34750 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
34760 20 20 20 20 69 66 28 20 30 3d 3d 61 7a 52 65 73      if( 0==azRes
34770 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20 20  ult[nRow] ){.   
34780 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e       rc = shellN
34790 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20  omemError();.   
347a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
347b0 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b    }.      nRow++
347c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
347d0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
347e0 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f  (pStmt)!=SQLITE_
347f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
34800 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
34810 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ror(p->db);.    
34820 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 74 79  }..    /* Pretty
34830 2d 70 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65  -print the conte
34840 6e 74 73 20 6f 66 20 61 72 72 61 79 20 61 7a 52  nts of array azR
34850 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68 65 20 6f  esult[] to the o
34860 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  utput */.    if(
34870 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f 77 3e 30   rc==0 && nRow>0
34880 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
34890 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20  n, maxlen = 0;. 
348a0 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
348b0 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74 43       int nPrintC
348c0 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20  ol, nPrintRow;. 
348d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
348e0 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
348f0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
34900 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b  30(azResult[i]);
34910 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
34920 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
34930 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a   = len;.      }.
34940 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20        nPrintCol 
34950 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b  = 80/(maxlen+2);
34960 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69 6e  .      if( nPrin
34970 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43  tCol<1 ) nPrintC
34980 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50  ol = 1;.      nP
34990 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20  rintRow = (nRow 
349a0 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29  + nPrintCol - 1)
349b0 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20  /nPrintCol;.    
349c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72    for(i=0; i<nPr
349d0 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  intRow; i++){.  
349e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a        for(j=i; j
349f0 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74  <nRow; j+=nPrint
34a00 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Row){.          
34a10 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e 50  char *zSp = j<nP
34a20 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
34a30 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 75    ";.          u
34a40 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34a50 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70  t, "%s%-*s", zSp
34a60 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20 20 20 20  , maxlen,.      
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a80 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a  azResult[j] ? az
34a90 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20  Result[j]:"");. 
34aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34ab0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
34ac0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
34ad0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
34ae0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b  r(ii=0; ii<nRow;
34af0 20 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66   ii++) sqlite3_f
34b00 72 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d  ree(azResult[ii]
34b10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
34b20 72 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20  ree(azResult);. 
34b30 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 42 65 67   }else..  /* Beg
34b40 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f  in redirecting o
34b50 75 74 70 75 74 20 74 6f 20 74 68 65 20 66 69 6c  utput to the fil
34b60 65 20 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e "testcase-out.
34b70 74 78 74 22 20 2a 2f 0a 20 20 69 66 28 20 63 3d  txt" */.  if( c=
34b80 3d 27 74 27 20 26 26 20 73 74 72 63 6d 70 28 61  ='t' && strcmp(a
34b90 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74 63 61 73  zArg[0],"testcas
34ba0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75  e")==0 ){.    ou
34bb0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
34bc0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
34bd0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 22 74 65  ut_file_open("te
34be0 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 29  stcase-out.txt")
34bf0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74  ;.    if( p->out
34c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
34c10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34c20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
34c30 70 65 6e 20 27 74 65 73 74 63 61 73 65 2d 6f 75  pen 'testcase-ou
34c40 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
34c50 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
34c60 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
34c70 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
34c80 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  of(p->zTestcase)
34c90 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20  , p->zTestcase, 
34ca0 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "%s", azArg[1]);
34cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34cc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34cd0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65  tf(sizeof(p->zTe
34ce0 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73  stcase), p->zTes
34cf0 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a 20 20 20  tcase, "?");.   
34d00 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
34d10 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
34d20 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
34d30 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73 74  t' && n>=8 && st
34d40 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34d50 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d  "testctrl", n)==
34d60 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
34d70 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
34d80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34d90 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20 2f   *zCtrlName;   /
34da0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73 74  * Name of a test
34db0 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e 20  -control option 
34dc0 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63 74  */.       int ct
34dd0 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rlCode;         
34de0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
34df0 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74 69  de for that opti
34e00 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 63 6f 6e  on */.       con
34e10 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 3b  st char *zUsage;
34e20 20 20 20 20 20 20 2f 2a 20 55 73 61 67 65 20 6e        /* Usage n
34e30 6f 74 65 73 20 2a 2f 0a 20 20 20 20 7d 20 61 43  otes */.    } aC
34e40 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trl[] = {.      
34e50 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20  { "always",     
34e60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
34e70 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
34e80 20 20 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22         "BOOLEAN"
34e90 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
34ea0 20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c       { "assert",
34eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
34ec0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
34ed0 45 52 54 2c 20 20 20 20 20 20 20 20 22 42 4f 4f  ERT,        "BOO
34ee0 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20  LEAN"           
34ef0 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 62 65 6e   },.    /*{ "ben
34f00 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73  ign_malloc_hooks
34f10 22 2c 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  ",SQLITE_TESTCTR
34f20 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
34f30 48 4f 4f 4b 53 2c 20 22 22 20 20 20 20 20 20 20  HOOKS, ""       
34f40 20 20 20 7d 2c 2a 2f 0a 20 20 20 20 2f 2a 7b 20     },*/.    /*{ 
34f50 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c 20 20  "bitvec_test",  
34f60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
34f70 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
34f80 54 2c 20 20 20 22 22 20 20 20 20 20 20 20 20 20  T,   ""         
34f90 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20         },*/.    
34fa0 20 20 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c    { "byteorder",
34fb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
34fc0 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
34fd0 44 45 52 2c 20 20 20 20 20 22 22 20 20 20 20 20  DER,     ""     
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
34ff0 0a 20 20 20 20 2f 2a 7b 20 22 66 61 75 6c 74 5f  .    /*{ "fault_
35000 69 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20 53  install",      S
35010 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
35020 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 22 22  AULT_INSTALL, ""
35030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35040 7d 2c 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 69  }, */.      { "i
35050 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20 20  mposter",       
35060 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
35070 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 20 20  TRL_IMPOSTER,   
35080 22 53 43 48 45 4d 41 20 4f 4e 2f 4f 46 46 20 52  "SCHEMA ON/OFF R
35090 4f 4f 54 50 41 47 45 22 7d 2c 0a 23 69 66 64 65  OOTPAGE"},.#ifde
350a0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
350b0 52 44 0a 20 20 20 20 20 20 7b 20 22 69 73 6b 65  RD.      { "iske
350c0 79 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20 20  yword",         
350d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
350e0 5f 49 53 4b 45 59 57 4f 52 44 2c 20 20 20 20 20  _ISKEYWORD,     
350f0 22 49 44 45 4e 54 49 46 49 45 52 22 20 20 20 20  "IDENTIFIER"    
35100 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20       },.#endif. 
35110 20 20 20 20 20 7b 20 22 6c 6f 63 61 6c 74 69 6d       { "localtim
35120 65 5f 66 61 75 6c 74 22 2c 20 20 20 20 53 51 4c  e_fault",    SQL
35130 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
35140 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 22 42 4f  ALTIME_FAULT,"BO
35150 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20  OLEAN"          
35160 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6e 65 76   },.      { "nev
35170 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  er_corrupt",    
35180 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
35190 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
351a0 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20   "BOOLEAN"      
351b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
351c0 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22   "optimizations"
351d0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ,      SQLITE_TE
351e0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
351f0 49 4f 4e 53 2c 20 22 44 49 53 41 42 4c 45 2d 4d  IONS, "DISABLE-M
35200 41 53 4b 22 20 20 20 20 20 20 20 7d 2c 0a 23 69  ASK"       },.#i
35210 66 64 65 66 20 59 59 43 4f 56 45 52 41 47 45 0a  fdef YYCOVERAGE.
35220 20 20 20 20 20 20 7b 20 22 70 61 72 73 65 72 5f        { "parser_
35230 63 6f 76 65 72 61 67 65 22 2c 20 20 20 20 53 51  coverage",    SQ
35240 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
35250 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 22  RSER_COVERAGE, "
35260 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
35270 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
35280 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79 74    { "pending_byt
35290 65 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  e",       SQLITE
352a0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
352b0 47 5f 42 59 54 45 2c 20 20 22 4f 46 46 53 45 54  G_BYTE,  "OFFSET
352c0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c    "           },
352d0 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72  .      { "prng_r
352e0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 53  eset",         S
352f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
35300 52 4e 47 5f 52 45 53 45 54 2c 20 20 20 20 22 22  RNG_RESET,    ""
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35320 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
35330 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20  rng_restore",   
35340 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
35350 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
35360 2c 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20  ,  ""           
35370 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
35380 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20   { "prng_save", 
35390 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
353a0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
353b0 56 45 2c 20 20 20 20 20 22 22 20 20 20 20 20 20  VE,     ""      
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
353d0 20 20 20 20 20 20 7b 20 22 72 65 73 65 72 76 65        { "reserve
353e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
353f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
35400 53 45 52 56 45 2c 20 20 20 20 20 20 20 22 42 59  SERVE,       "BY
35410 54 45 53 2d 4f 46 2d 52 45 53 45 52 56 45 22 20  TES-OF-RESERVE" 
35420 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
35430 69 6e 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d  int testctrl = -
35440 31 3b 0a 20 20 20 20 69 6e 74 20 69 43 74 72 6c  1;.    int iCtrl
35450 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 72   = -1;.    int r
35460 63 32 20 3d 20 30 3b 20 20 20 20 2f 2a 20 30 3a  c2 = 0;    /* 0:
35470 20 75 73 61 67 65 2e 20 20 31 3a 20 25 64 20 20   usage.  1: %d  
35480 32 3a 20 25 78 20 20 33 3a 20 6e 6f 2d 6f 75 74  2: %x  3: no-out
35490 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
354a0 73 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sOk = 0;.    int
354b0 20 69 2c 20 6e 32 3b 0a 20 20 20 20 63 6f 6e 73   i, n2;.    cons
354c0 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30  t char *zCmd = 0
354d0 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ;..    open_db(p
354e0 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6d 64 20 3d  , 0);.    zCmd =
354f0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
35500 5b 31 5d 20 3a 20 22 68 65 6c 70 22 3b 0a 0a 20  [1] : "help";.. 
35510 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
35520 6e 74 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c  nt can optionall
35530 79 20 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22  y begin with "-"
35540 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a 20 20 20 20   or "--" */.    
35550 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d 27 2d 27  if( zCmd[0]=='-'
35560 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29 7b 0a 20   && zCmd[1] ){. 
35570 20 20 20 20 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20       zCmd++;.   
35580 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d     if( zCmd[0]==
35590 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29  '-' && zCmd[1] )
355a0 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   zCmd++;.    }..
355b0 20 20 20 20 2f 2a 20 2d 2d 68 65 6c 70 20 6c 69      /* --help li
355c0 73 74 73 20 61 6c 6c 20 74 65 73 74 2d 63 6f 6e  sts all test-con
355d0 74 72 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 66 28  trols */.    if(
355e0 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 68 65   strcmp(zCmd,"he
355f0 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
35600 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
35610 6f 75 74 2c 20 22 41 76 61 69 6c 61 62 6c 65 20  out, "Available 
35620 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 3a 5c 6e  test-controls:\n
35630 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
35640 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
35650 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Ctrl); i++){.   
35660 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35670 28 70 2d 3e 6f 75 74 2c 20 22 20 20 2e 74 65 73  (p->out, "  .tes
35680 74 63 74 72 6c 20 25 73 20 25 73 5c 6e 22 2c 0a  tctrl %s %s\n",.
35690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356a0 20 20 20 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74      aCtrl[i].zCt
356b0 72 6c 4e 61 6d 65 2c 20 61 43 74 72 6c 5b 69 5d  rlName, aCtrl[i]
356c0 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20  .zUsage);.      
356d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  }.      rc = 1;.
356e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
356f0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
35700 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76    }..    /* conv
35710 65 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78  ert testctrl tex
35720 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75  t option to valu
35730 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69  e. allow any uni
35740 71 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a  que prefix.    *
35750 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  * of the option 
35760 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72  name, or a numer
35770 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  ical value. */. 
35780 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30     n2 = strlen30
35790 28 7a 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (zCmd);.    for(
357a0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
357b0 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20  (aCtrl); i++){. 
357c0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
357d0 28 7a 43 6d 64 2c 20 61 43 74 72 6c 5b 69 5d 2e  (zCmd, aCtrl[i].
357e0 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e 32 29 3d 3d  zCtrlName, n2)==
357f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
35800 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b 0a 20   testctrl<0 ){. 
35810 20 20 20 20 20 20 20 20 20 74 65 73 74 63 74 72           testctr
35820 6c 20 3d 20 61 43 74 72 6c 5b 69 5d 2e 63 74 72  l = aCtrl[i].ctr
35830 6c 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  lCode;.         
35840 20 69 43 74 72 6c 20 3d 20 69 3b 0a 20 20 20 20   iCtrl = i;.    
35850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35860 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35870 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
35880 20 61 6d 62 69 67 75 6f 75 73 20 74 65 73 74 2d   ambiguous test-
35890 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25 73 5c 22 5c  control: \"%s\"\
358a0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358c0 20 22 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72   "Use \".testctr
358d0 6c 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68  l --help\" for h
358e0 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  elp\n", zCmd);. 
358f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
35900 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
35910 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
35920 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
35930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
35940 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b  f( testctrl<0 ){
35950 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
35960 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
35970 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65 73 74 2d 63  : unknown test-c
35980 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e 22 0a 20 20  ontrol: %s\n".  
35990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359a0 20 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74         "Use \".t
359b0 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22  estctrl --help\"
359c0 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43   for help\n", zC
359d0 6d 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  md);.    }else{.
359e0 20 20 20 20 20 20 73 77 69 74 63 68 28 74 65 73        switch(tes
359f0 74 63 74 72 6c 29 7b 0a 0a 20 20 20 20 20 20 20  tctrl){..       
35a00 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
35a10 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 64 62  _control(int, db
35a20 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
35a30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
35a40 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
35a50 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20 63 61  IONS:.        ca
35a60 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
35a70 52 4c 5f 52 45 53 45 52 56 45 3a 0a 20 20 20 20  RL_RESERVE:.    
35a80 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
35a90 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
35aa0 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74 29   int opt = (int)
35ab0 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d 2c  strtol(azArg[2],
35ac0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
35ad0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
35ae0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
35af0 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20  estctrl, p->db, 
35b00 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
35b10 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20    isOk = 3;.    
35b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35b30 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
35b40 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
35b50 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a  t_control(int) *
35b60 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
35b70 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
35b80 52 4e 47 5f 53 41 56 45 3a 0a 20 20 20 20 20 20  RNG_SAVE:.      
35b90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
35ba0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
35bb0 4f 52 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ORE:.        cas
35bc0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
35bd0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20  L_PRNG_RESET:.  
35be0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
35bf0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
35c00 52 44 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  RDER:.          
35c10 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
35c20 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
35c30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35c40 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b  ntrol(testctrl);
35c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
35c60 6b 20 3d 20 74 65 73 74 63 74 72 6c 3d 3d 53 51  k = testctrl==SQ
35c70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
35c80 54 45 4f 52 44 45 52 20 3f 20 31 20 3a 20 33 3b  TEORDER ? 1 : 3;
35c90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35ca0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
35cb0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
35cc0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
35cd0 6e 74 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20  nt, uint) */.   
35ce0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
35cf0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
35d00 47 5f 42 59 54 45 3a 0a 20 20 20 20 20 20 20 20  G_BYTE:.        
35d10 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
35d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
35d30 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20  igned int opt = 
35d40 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e  (unsigned int)in
35d50 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
35d60 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [2]);.          
35d70 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
35d80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
35d90 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20  tctrl, opt);.   
35da0 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
35db0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
35dc0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35dd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
35de0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
35df0 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  (int, int) */.  
35e00 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
35e10 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
35e20 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  T:.        case 
35e30 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35e40 41 4c 57 41 59 53 3a 0a 20 20 20 20 20 20 20 20  ALWAYS:.        
35e50 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
35e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
35e70 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61   opt = booleanVa
35e80 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  lue(azArg[2]);. 
35e90 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
35ea0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35eb0 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
35ec0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
35ed0 20 20 69 73 4f 6b 20 3d 20 31 3b 0a 20 20 20 20    isOk = 1;.    
35ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35ef0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
35f00 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
35f10 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69  t_control(int, i
35f20 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
35f30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
35f40 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
35f50 55 4c 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ULT:.        cas
35f60 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
35f70 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
35f80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
35f90 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
35fa0 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
35fb0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
35fc0 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
35fd0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
35fe0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
35ff0 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20  estctrl, opt);. 
36000 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
36010 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
36020 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
36030 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
36040 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
36050 6f 6c 28 69 6e 74 2c 20 63 68 61 72 20 2a 29 20  ol(int, char *) 
36060 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36070 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20  _N_KEYWORD.     
36080 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
36090 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
360a0 44 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  D:.          if(
360b0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
360c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
360d0 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41 72 67 5b  ar *opt = azArg[
360e0 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2];.            
360f0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
36100 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
36110 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  trl, opt);.     
36120 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b         isOk = 1;
36130 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36140 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 65         break;.#e
36150 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 63 61  ndif..        ca
36160 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
36170 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 0a 20 20 20  RL_IMPOSTER:.   
36180 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
36190 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =5 ){.          
361a0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
361b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
361c0 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 0a 20 20  tctrl, p->db,.  
361d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361e0 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d          azArg[2]
361f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36200 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
36210 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 33  gerValue(azArg[3
36220 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
36230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
36240 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
36250 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20  [4]));.         
36260 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20     isOk = 3;.   
36270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36280 20 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65     break;..#ifde
36290 66 20 59 59 43 4f 56 45 52 41 47 45 0a 20 20 20  f YYCOVERAGE.   
362a0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
362b0 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52  _TESTCTRL_PARSER
362c0 5f 43 4f 56 45 52 41 47 45 3a 0a 20 20 20 20 20  _COVERAGE:.     
362d0 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32       if( nArg==2
362e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
362f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
36300 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70  trol(testctrl, p
36310 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  ->out);.        
36320 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20      isOk = 3;.  
36330 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
36340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36350 20 20 20 69 66 28 20 69 73 4f 6b 3d 3d 30 20 26     if( isOk==0 &
36360 26 20 69 43 74 72 6c 3e 3d 30 20 29 7b 0a 20 20  & iCtrl>=0 ){.  
36370 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36380 70 2d 3e 6f 75 74 2c 20 22 55 73 61 67 65 3a 20  p->out, "Usage: 
36390 2e 74 65 73 74 63 74 72 6c 20 25 73 20 25 73 5c  .testctrl %s %s\
363a0 6e 22 2c 20 7a 43 6d 64 2c 20 61 43 74 72 6c 5b  n", zCmd, aCtrl[
363b0 69 43 74 72 6c 5d 2e 7a 55 73 61 67 65 29 3b 0a  iCtrl].zUsage);.
363c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
363d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 6b    }else if( isOk
363e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==1 ){.      raw
363f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
36400 22 25 64 5c 6e 22 2c 20 72 63 32 29 3b 0a 20 20  "%d\n", rc2);.  
36410 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 6b    }else if( isOk
36420 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==2 ){.      raw
36430 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
36440 22 30 78 25 30 38 78 5c 6e 22 2c 20 72 63 32 29  "0x%08x\n", rc2)
36450 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
36460 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
36470 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ed(SQLITE_UNTEST
36480 41 42 4c 45 29 20 2a 2f 0a 0a 20 20 69 66 28 20  ABLE) */..  if( 
36490 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26 26  c=='t' && n>4 &&
364a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
364b0 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29  ], "timeout", n)
364c0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
364d0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  db(p, 0);.    sq
364e0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
364f0 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72 67 3e 3d  ut(p->db, nArg>=
36500 32 20 3f 20 28 69 6e 74 29 69 6e 74 65 67 65 72  2 ? (int)integer
36510 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
36520 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  : 0);.  }else.. 
36530 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
36540 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=5 && strncmp(a
36550 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 72 22  zArg[0], "timer"
36560 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
36570 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
36580 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65 72 20      enableTimer 
36590 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
365a0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
365b0 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  if( enableTimer 
365c0 26 26 20 21 48 41 53 5f 54 49 4d 45 52 20 29 7b  && !HAS_TIMER ){
365d0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
365e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
365f0 6f 72 3a 20 74 69 6d 65 72 20 6e 6f 74 20 61 76  or: timer not av
36600 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  ailable on this 
36610 73 79 73 74 65 6d 2e 5c 6e 22 29 3b 0a 20 20 20  system.\n");.   
36620 20 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65 72       enableTimer
36630 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
36640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36650 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36660 2c 20 22 55 73 61 67 65 3a 20 2e 74 69 6d 65 72  , "Usage: .timer
36670 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
36680 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
36690 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
366a0 63 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  c=='t' && strncm
366b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 72 61  p(azArg[0], "tra
366c0 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
366d0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
366e0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
366f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
36700 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36710 61 67 65 3a 20 2e 74 72 61 63 65 20 46 49 4c 45  age: .trace FILE
36720 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
36730 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
36740 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36750 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
36760 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
36770 65 28 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b 0a  e(p->traceOut);.
36780 20 20 20 20 70 2d 3e 74 72 61 63 65 4f 75 74 20      p->traceOut 
36790 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
367a0 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  en(azArg[1]);.#i
367b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
367c0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
367d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
367e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
367f0 4f 49 4e 54 29 0a 20 20 20 20 69 66 28 20 70 2d  OINT).    if( p-
36800 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29 7b 0a  >traceOut==0 ){.
36810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
36820 61 63 65 5f 76 32 28 70 2d 3e 64 62 2c 20 30 2c  ace_v2(p->db, 0,
36830 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
36840 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36850 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64 62 2c  _trace_v2(p->db,
36860 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54   SQLITE_TRACE_ST
36870 4d 54 2c 20 73 71 6c 5f 74 72 61 63 65 5f 63 61  MT, sql_trace_ca
36880 6c 6c 62 61 63 6b 2c 70 2d 3e 74 72 61 63 65 4f  llback,p->traceO
36890 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ut);.    }.#endi
368a0 66 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 53  f.  }else..#if S
368b0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
368c0 4e 54 49 43 41 54 49 4f 4e 0a 20 20 69 66 28 20  NTICATION.  if( 
368d0 63 3d 3d 27 75 27 20 26 26 20 73 74 72 6e 63 6d  c=='u' && strncm
368e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 75 73 65  p(azArg[0], "use
368f0 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  r", n)==0 ){.   
36900 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
36910 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36920 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36930 2e 75 73 65 72 20 53 55 42 43 4f 4d 4d 41 4e 44  .user SUBCOMMAND
36940 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20   ...\n");.      
36950 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
36960 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36970 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
36980 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
36990 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
369a0 41 72 67 5b 31 5d 2c 22 6c 6f 67 69 6e 22 29 3d  Arg[1],"login")=
369b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
369c0 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20 20  nArg!=4 ){.     
369d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
369e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75  derr, "Usage: .u
369f0 73 65 72 20 6c 6f 67 69 6e 20 55 53 45 52 20 50  ser login USER P
36a00 41 53 53 57 4f 52 44 5c 6e 22 29 3b 0a 20 20 20  ASSWORD\n");.   
36a10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36a20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
36a30 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
36a40 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
36a50 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
36a60 68 65 6e 74 69 63 61 74 65 28 70 2d 3e 64 62 2c  henticate(p->db,
36a70 20 61 7a 41 72 67 5b 32 5d 2c 20 61 7a 41 72 67   azArg[2], azArg
36a80 5b 33 5d 2c 20 73 74 72 6c 65 6e 33 30 28 61 7a  [3], strlen30(az
36a90 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[3]));.      
36aa0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
36ab0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36ac0 64 65 72 72 2c 20 22 41 75 74 68 65 6e 74 69 63  derr, "Authentic
36ad0 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 66 6f 72  ation failed for
36ae0 20 75 73 65 72 20 25 73 5c 6e 22 2c 20 61 7a 41   user %s\n", azA
36af0 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
36b00 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
36b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
36b20 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
36b30 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dd")==0 ){.     
36b40 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a   if( nArg!=5 ){.
36b50 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36b60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
36b70 65 3a 20 2e 75 73 65 72 20 61 64 64 20 55 53 45  e: .user add USE
36b80 52 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  R PASSWORD ISADM
36b90 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  IN\n");.        
36ba0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
36bb0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36bc0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36be0 65 33 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e 64  e3_user_add(p->d
36bf0 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 61 7a 41  b, azArg[2], azA
36c00 72 67 5b 33 5d 2c 20 73 74 72 6c 65 6e 33 30 28  rg[3], strlen30(
36c10 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c30 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61         booleanVa
36c40 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a  lue(azArg[4]));.
36c50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36c60 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36c70 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
36c80 2d 41 64 64 20 66 61 69 6c 65 64 3a 20 25 64 5c  -Add failed: %d\
36c90 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
36ca0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
36cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
36cc0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
36cd0 65 64 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  edit")==0 ){.   
36ce0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29     if( nArg!=5 )
36cf0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
36d00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36d10 61 67 65 3a 20 2e 75 73 65 72 20 65 64 69 74 20  age: .user edit 
36d20 55 53 45 52 20 50 41 53 53 57 4f 52 44 20 49 53  USER PASSWORD IS
36d30 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  ADMIN\n");.     
36d40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
36d50 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
36d60 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
36d70 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
36d80 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
36d90 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32  e(p->db, azArg[2
36da0 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c 20 73 74 72  ], azArg[3], str
36db0 6c 65 6e 33 30 28 61 7a 41 72 67 5b 33 5d 29 2c  len30(azArg[3]),
36dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
36de0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
36df0 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  g[4]));.      if
36e00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36e10 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36e20 72 2c 20 22 55 73 65 72 2d 45 64 69 74 20 66 61  r, "User-Edit fa
36e30 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29  iled: %d\n", rc)
36e40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
36e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36e60 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
36e70 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65 74 65 22  zArg[1],"delete"
36e80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
36e90 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20  ( nArg!=3 ){.   
36ea0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36eb0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36ec0 2e 75 73 65 72 20 64 65 6c 65 74 65 20 55 53 45  .user delete USE
36ed0 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  R\n");.        r
36ee0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
36ef0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
36f00 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
36f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36f20 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 70 2d  3_user_delete(p-
36f30 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  >db, azArg[2]);.
36f40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36f50 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36f60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
36f70 2d 44 65 6c 65 74 65 20 66 61 69 6c 65 64 3a 20  -Delete failed: 
36f80 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
36f90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36fa0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36fb0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36fc0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36fd0 2e 75 73 65 72 20 6c 6f 67 69 6e 7c 61 64 64 7c  .user login|add|
36fe0 65 64 69 74 7c 64 65 6c 65 74 65 20 2e 2e 2e 5c  edit|delete ...\
36ff0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
37000 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
37010 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
37020 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
37030 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37040 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
37050 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d  ION */..  if( c=
37060 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='v' && strncmp(
37070 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65 72 73 69  azArg[0], "versi
37080 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  on", n)==0 ){.  
37090 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
370a0 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73  >out, "SQLite %s
370b0 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76   %s\n" /*extra-v
370c0 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20  ersion-info*/,. 
370d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
370e0 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c  ibversion(), sql
370f0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
37100 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
37110 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
37120 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66  mp(azArg[0], "vf
37130 73 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  sinfo", n)==0 ){
37140 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
37150 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d  *zDbName = nArg=
37160 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
37170 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71 6c 69  "main";.    sqli
37180 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
37190 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  0;.    if( p->db
371a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
371b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
371c0 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  ->db, zDbName, S
371d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
371e0 50 4f 49 4e 54 45 52 2c 20 26 70 56 66 73 29 3b  POINTER, &pVfs);
371f0 0a 20 20 20 20 20 20 69 66 28 20 70 56 66 73 20  .      if( pVfs 
37200 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
37210 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
37220 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20 3d  vfs.zName      =
37230 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70 56 66 73   \"%s\"\n", pVfs
37240 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
37250 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
37260 6f 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69  out, "vfs.iVersi
37270 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56  on   = %d\n", pV
37280 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20  fs->iVersion);. 
37290 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
372a0 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73  f(p->out, "vfs.s
372b0 7a 4f 73 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e  zOsFile   = %d\n
372c0 22 2c 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ", pVfs->szOsFil
372d0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
372e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
372f0 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d  vfs.mxPathname =
37300 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d 78   %d\n", pVfs->mx
37310 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
37320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
37330 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26  ..  if( c=='v' &
37340 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
37350 30 5d 2c 20 22 76 66 73 6c 69 73 74 22 2c 20 6e  0], "vfslist", n
37360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
37370 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
37380 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
37390 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20  pCurrent = 0;.  
373a0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
373b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
373c0 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
373d0 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
373e0 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45  FCNTL_VFS_POINTE
373f0 52 2c 20 26 70 43 75 72 72 65 6e 74 29 3b 0a 20  R, &pCurrent);. 
37400 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 56 66     }.    for(pVf
37410 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  s=sqlite3_vfs_fi
37420 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66  nd(0); pVfs; pVf
37430 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a  s=pVfs->pNext){.
37440 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
37450 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a  f(p->out, "vfs.z
37460 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c 22 25 73  Name      = \"%s
37470 5c 22 25 73 5c 6e 22 2c 20 70 56 66 73 2d 3e 7a  \"%s\n", pVfs->z
37480 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
37490 20 70 56 66 73 3d 3d 70 43 75 72 72 65 6e 74 20   pVfs==pCurrent 
374a0 3f 20 22 20 20 3c 2d 2d 2d 20 43 55 52 52 45 4e  ? "  <--- CURREN
374b0 54 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  T" : "");.      
374c0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
374d0 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69 6f 6e  t, "vfs.iVersion
374e0 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73     = %d\n", pVfs
374f0 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20  ->iVersion);.   
37500 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
37510 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73 46  >out, "vfs.szOsF
37520 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70  ile   = %d\n", p
37530 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
37540 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37550 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d 78  (p->out, "vfs.mx
37560 50 61 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e 22  Pathname = %d\n"
37570 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
37580 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
37590 56 66 73 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Vfs->pNext ){.  
375a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
375b0 28 70 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  (p->out, "------
375c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
375d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
375e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
375f0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
37600 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d  c=='v' && strncm
37610 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73  p(azArg[0],