/ Hex Artifact Content
Login

Artifact f0f59ea60ad297f671b7ae0fb957a736ad17c92c:


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 49 66 20 72 65 71 75 65 73 74 65 64 2c 20 69   If requested, i
02b0: 6e 63 6c 75 64 65 20 74 68 65 20 53 51 4c 69 74  nclude the SQLit
02c0: 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  e compiler optio
02d0: 6e 73 20 66 69 6c 65 20 66 6f 72 20 4d 53 56 43  ns file for MSVC
02e0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
02f0: 28 49 4e 43 4c 55 44 45 5f 4d 53 56 43 5f 48 29  (INCLUDE_MSVC_H)
0300: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 73 76 63 2e  .#include "msvc.
0310: 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h".#endif../*.**
0320: 20 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20   No support for 
0330: 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69  loadable extensi
0340: 6f 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a  ons in VxWorks..
0350: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
0360: 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69  __RTP__) || defi
0370: 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
0380: 29 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  ) && !SQLITE_OMI
0390: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
03a0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
03b0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
03c0: 53 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  SION 1.#endif../
03d0: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67  *.** Enable larg
03e0: 65 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66  e-file support f
03f0: 6f 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66  or fopen() and f
0400: 72 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a  riends on unix..
0410: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0420: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
0430: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49  define _LARGE_FI
0440: 4c 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e  LE       1.# ifn
0450: 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  def _FILE_OFFSET
0460: 5f 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65  _BITS.#   define
0470: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
0480: 54 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20  TS 64.# endif.# 
0490: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c  define _LARGEFIL
04a0: 45 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69  E_SOURCE 1.#endi
04b0: 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  f..#include <std
04c0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
04d0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
04e0: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69  ude <stdio.h>.#i
04f0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0500: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  >.#include "sqli
0510: 74 65 33 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  te3.h".#if SQLIT
0520: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0530: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0540: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0550: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0560: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0570: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
0580: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
0590: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
05a0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
05b0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
05c0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
05d0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
05e0: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
05f0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0600: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69 6e 63  h>.# endif.# inc
0610: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0620: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  # include <sys/t
0630: 79 70 65 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ypes.h>.#endif..
0640: 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
0650: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61  E.# include <rea
0660: 64 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68  dline/readline.h
0670: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61  >.# include <rea
0680: 64 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e  dline/history.h>
0690: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56  .#endif..#if HAV
06a0: 45 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69 6e 63  E_EDITLINE.# inc
06b0: 6c 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f 72  lude <editline/r
06c0: 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64 69  eadline.h>.#endi
06d0: 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49 54  f..#if HAVE_EDIT
06e0: 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 52 45 41  LINE || HAVE_REA
06f0: 44 4c 49 4e 45 0a 0a 23 20 64 65 66 69 6e 65 20  DLINE..# define 
0700: 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72  shell_add_histor
0710: 79 28 58 29 20 61 64 64 5f 68 69 73 74 6f 72 79  y(X) add_history
0720: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0730: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0740: 58 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28  X) read_history(
0750: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0760: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0770: 58 29 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79  X) write_history
0780: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0790: 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72  ll_stifle_histor
07a0: 79 28 58 29 20 73 74 69 66 6c 65 5f 68 69 73 74  y(X) stifle_hist
07b0: 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ory(X).# define 
07c0: 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58  shell_readline(X
07d0: 29 20 72 65 61 64 6c 69 6e 65 28 58 29 0a 0a 23  ) readline(X)..#
07e0: 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
07f0: 49 53 45 0a 0a 23 20 69 6e 63 6c 75 64 65 20 22  ISE..# include "
0800: 6c 69 6e 65 6e 6f 69 73 65 2e 68 22 0a 23 20 64  linenoise.h".# d
0810: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f  efine shell_add_
0820: 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e  history(X) linen
0830: 6f 69 73 65 48 69 73 74 6f 72 79 41 64 64 28 58  oiseHistoryAdd(X
0840: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0850: 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29  _read_history(X)
0860: 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72   linenoiseHistor
0870: 79 4c 6f 61 64 28 58 29 0a 23 20 64 65 66 69 6e  yLoad(X).# defin
0880: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0890: 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69  story(X) linenoi
08a0: 73 65 48 69 73 74 6f 72 79 53 61 76 65 28 58 29  seHistorySave(X)
08b0: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
08c0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
08d0: 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f  ) linenoiseHisto
08e0: 72 79 53 65 74 4d 61 78 4c 65 6e 28 58 29 0a 23  rySetMaxLen(X).#
08f0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0900: 61 64 6c 69 6e 65 28 58 29 20 6c 69 6e 65 6e 6f  adline(X) lineno
0910: 69 73 65 28 58 29 0a 0a 23 65 6c 73 65 0a 0a 23  ise(X)..#else..#
0920: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0930: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 0a 23  ad_history(X) .#
0940: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72   define shell_wr
0950: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0960: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0970: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a  ifle_history(X).
0980: 0a 23 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  .# define SHELL_
0990: 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e  USE_LOCAL_GETLIN
09a0: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  E 1.#endif...#if
09b0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
09c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
09d0: 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f  2).# include <io
09e0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66  .h>.# include <f
09f0: 63 6e 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65  cntl.h>.# define
0a00: 20 69 73 61 74 74 79 28 68 29 20 5f 69 73 61 74   isatty(h) _isat
0a10: 74 79 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61  ty(h).# ifndef a
0a20: 63 63 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20  ccess.#  define 
0a30: 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63  access(f,m) _acc
0a40: 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65  ess((f),(m)).# e
0a50: 6e 64 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70  ndif.# undef pop
0a60: 65 6e 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65  en.# define pope
0a70: 6e 20 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66  n _popen.# undef
0a80: 20 70 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65   pclose.# define
0a90: 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a   pclose _pclose.
0aa0: 23 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73  #else. /* Make s
0ab0: 75 72 65 20 69 73 61 74 74 79 28 29 20 68 61 73  ure isatty() has
0ac0: 20 61 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f   a prototype. */
0ad0: 0a 20 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61  . extern int isa
0ae0: 74 74 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20  tty(int);..# if 
0af0: 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
0b00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
0b10: 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20  RS_KERNEL).  /* 
0b20: 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65  popen and pclose
0b30: 20 61 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e   are not C89 fun
0b40: 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72  ctions and so ar
0b50: 65 0a 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73  e.  ** sometimes
0b60: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
0b70: 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64  e <stdio.h> head
0b80: 65 72 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20  er */.   extern 
0b90: 46 49 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73  FILE *popen(cons
0ba0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0bb0: 61 72 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20  ar*);.   extern 
0bc0: 69 6e 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a  int pclose(FILE*
0bd0: 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66  );.# else.#  def
0be0: 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ine SQLITE_OMIT_
0bf0: 50 4f 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a  POPEN 1.# endif.
0c00: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
0c10: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
0c20: 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61  /* Windows CE (a
0c30: 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32  rm-wince-mingw32
0c40: 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74  ce-gcc) does not
0c50: 20 70 72 6f 76 69 64 65 20 69 73 61 74 74 79 28   provide isatty(
0c60: 29 0a 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77  ). * thus we alw
0c70: 61 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20  ays assume that 
0c80: 77 65 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c  we have a consol
0c90: 65 2e 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20  e. That can be. 
0ca0: 2a 20 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74  * overridden wit
0cb0: 68 20 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d  h the -batch com
0cc0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
0cd0: 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  .. */.#define is
0ce0: 61 74 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66  atty(x) 1.#endif
0cf0: 0a 0a 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f  ../* ctype macro
0d00: 73 20 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68  s that work with
0d10: 20 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65   signed characte
0d20: 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73  rs */.#define Is
0d30: 53 70 61 63 65 28 58 29 20 20 69 73 73 70 61 63  Space(X)  isspac
0d40: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
0d50: 29 58 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69  )X).#define IsDi
0d60: 67 69 74 28 58 29 20 20 69 73 64 69 67 69 74 28  git(X)  isdigit(
0d70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
0d80: 29 0a 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65  ).#define ToLowe
0d90: 72 28 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f  r(X)  (char)tolo
0da0: 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  wer((unsigned ch
0db0: 61 72 29 58 29 0a 0a 2f 2a 20 4f 6e 20 57 69 6e  ar)X)../* On Win
0dc0: 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c  dows, we normall
0dd0: 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70 75  y run with outpu
0de0: 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20 73  t mode of TEXT s
0df0: 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61 63  o that \n charac
0e00: 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74 6f  ters.** are auto
0e10: 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73 6c  matically transl
0e20: 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20  ated into \r\n. 
0e30: 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 62   However, this b
0e40: 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a 2a  ehavior needs.**
0e50: 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
0e60: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28 65  in some cases (e
0e70: 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74 69  x: when generati
0e80: 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61 6e  ng CSV output an
0e90: 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65 72  d when.** render
0ea0: 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69 6e  ing quoted strin
0eb0: 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  gs that contain 
0ec0: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e 20  \n characters). 
0ed0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
0ee0: 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65 20  * routines take 
0ef0: 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a 2f  care of that..*/
0f00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0f10: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0f20: 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76 6f  WIN32).static vo
0f30: 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  id setBinaryMode
0f40: 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 66  (FILE *out){.  f
0f50: 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 5f 73  flush(out);.  _s
0f60: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 6f  etmode(_fileno(o
0f70: 75 74 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b  ut), _O_BINARY);
0f80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
0f90: 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45 20  etTextMode(FILE 
0fa0: 2a 6f 75 74 29 7b 0a 20 20 66 66 6c 75 73 68 28  *out){.  fflush(
0fb0: 6f 75 74 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  out);.  _setmode
0fc0: 28 5f 66 69 6c 65 6e 6f 28 6f 75 74 29 2c 20 5f  (_fileno(out), _
0fd0: 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73 65  O_TEXT);.}.#else
0fe0: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69 6e  .# define setBin
0ff0: 61 72 79 4d 6f 64 65 28 58 29 0a 23 20 64 65 66  aryMode(X).# def
1000: 69 6e 65 20 73 65 74 54 65 78 74 4d 6f 64 65 28  ine setTextMode(
1010: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54  X).#endif.../* T
1020: 72 75 65 20 69 66 20 74 68 65 20 74 69 6d 65 72  rue if the timer
1030: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
1040: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65  tatic int enable
1050: 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52  Timer = 0;../* R
1060: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1070: 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d  t wall-clock tim
1080: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  e */.static sqli
1090: 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66  te3_int64 timeOf
10a0: 44 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Day(void){.  sta
10b0: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
10c0: 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20  *clockVfs = 0;. 
10d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
10e0: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
10f0: 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d  ==0 ) clockVfs =
1100: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1110: 64 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63  d(0);.  if( cloc
1120: 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  kVfs->iVersion>=
1130: 32 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  2 && clockVfs->x
1140: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
1150: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b  !=0 ){.    clock
1160: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
1170: 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c  eInt64(clockVfs,
1180: 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   &t);.  }else{. 
1190: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
11a0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
11b0: 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73  entTime(clockVfs
11c0: 2c 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20 28  , &r);.    t = (
11d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
11e0: 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20  *86400000.0);.  
11f0: 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a  }.  return t;.}.
1200: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
1210: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1220: 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  d(WIN32) && !def
1230: 69 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69  ined(__minux).#i
1240: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
1250: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1260: 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f  s/resource.h>../
1270: 2a 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e  * VxWorks does n
1280: 6f 74 20 73 75 70 70 6f 72 74 20 67 65 74 72 75  ot support getru
1290: 73 61 67 65 28 29 20 61 73 20 66 61 72 20 61 73  sage() as far as
12a0: 20 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e   we can determin
12b0: 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  e */.#if defined
12c0: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c  (_WRS_KERNEL) ||
12d0: 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f   defined(__RTP__
12e0: 29 0a 73 74 72 75 63 74 20 72 75 73 61 67 65 20  ).struct rusage 
12f0: 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  {.  struct timev
1300: 61 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20  al ru_utime; /* 
1310: 75 73 65 72 20 43 50 55 20 74 69 6d 65 20 75 73  user CPU time us
1320: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74  ed */.  struct t
1330: 69 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b  imeval ru_stime;
1340: 20 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20 74   /* system CPU t
1350: 69 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23  ime used */.};.#
1360: 64 65 66 69 6e 65 20 67 65 74 72 75 73 61 67 65  define getrusage
1370: 28 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c 30  (A,B) memset(B,0
1380: 2c 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e  ,sizeof(*B)).#en
1390: 64 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65  dif../* Saved re
13a0: 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69  source informati
13b0: 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e  on for the begin
13c0: 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61  ning of an opera
13d0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73  tion */.static s
13e0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 42 65  truct rusage sBe
13f0: 67 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d  gin;  /* CPU tim
1400: 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73 74  e at start */.st
1410: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
1420: 36 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57  64 iBegin;  /* W
1430: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61  all-clock time a
1440: 74 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a  t start */../*.*
1450: 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61  * Begin timing a
1460: 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73  n operation.*/.s
1470: 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e  tatic void begin
1480: 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  Timer(void){.  i
1490: 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29  f( enableTimer )
14a0: 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  {.    getrusage(
14b0: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 42  RUSAGE_SELF, &sB
14c0: 65 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67 69  egin);.    iBegi
14d0: 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  n = timeOfDay();
14e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  .  }.}../* Retur
14f0: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
1500: 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74 72   of two time_str
1510: 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20  ucts in seconds 
1520: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
1530: 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63 74   timeDiff(struct
1540: 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72 74   timeval *pStart
1550: 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  , struct timeval
1560: 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75 72   *pEnd){.  retur
1570: 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63  n (pEnd->tv_usec
1580: 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75 73   - pStart->tv_us
1590: 65 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 20 0a  ec)*0.000001 + .
15a0: 20 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65           (double
15b0: 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d  )(pEnd->tv_sec -
15c0: 20 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29   pStart->tv_sec)
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
15e0: 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75   the timing resu
15f0: 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lts..*/.static v
1600: 6f 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69  oid endTimer(voi
1610: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1620: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Timer ){.    sql
1630: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20  ite3_int64 iEnd 
1640: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
1650: 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65     struct rusage
1660: 20 73 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75   sEnd;.    getru
1670: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1680: 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72  , &sEnd);.    pr
1690: 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20  intf("Run Time: 
16a0: 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25  real %.3f user %
16b0: 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20  f sys %f\n",.   
16c0: 20 20 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67      (iEnd - iBeg
16d0: 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20  in)*0.001,.     
16e0: 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67    timeDiff(&sBeg
16f0: 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45  in.ru_utime, &sE
1700: 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20  nd.ru_utime),.  
1710: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73       timeDiff(&s
1720: 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20  Begin.ru_stime, 
1730: 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29  &sEnd.ru_stime))
1740: 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65  ;.  }.}..#define
1750: 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67   BEGIN_TIMER beg
1760: 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  inTimer().#defin
1770: 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54  e END_TIMER endT
1780: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48  imer().#define H
1790: 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69  AS_TIMER 1..#eli
17a0: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
17b0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
17c0: 4e 33 32 29 29 0a 0a 23 69 6e 63 6c 75 64 65 20  N32))..#include 
17d0: 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20  <windows.h>../* 
17e0: 53 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69  Saved resource i
17f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
1800: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1810: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  an operation */.
1820: 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50  static HANDLE hP
1830: 72 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46  rocess;.static F
1840: 49 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c  ILETIME ftKernel
1850: 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49  Begin;.static FI
1860: 4c 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67  LETIME ftUserBeg
1870: 69 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74  in;.static sqlit
1880: 65 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42  e3_int64 ftWallB
1890: 65 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f  egin;.typedef BO
18a0: 4f 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50  OL (WINAPI *GETP
18b0: 52 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45  ROCTIMES)(HANDLE
18c0: 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50  , LPFILETIME, LP
18d0: 46 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20  FILETIME,.      
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 50                LP
1900: 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45  FILETIME, LPFILE
1910: 54 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45  TIME);.static GE
1920: 54 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72  TPROCTIMES getPr
1930: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
1940: 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   NULL;../*.** Ch
1950: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
1960: 20 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70   have timer supp
1970: 6f 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ort.  Return 1 i
1980: 66 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73  f necessary.** s
1990: 75 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72  upport found (or
19a0: 20 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c   found previousl
19b0: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y)..*/.static in
19c0: 74 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29  t hasTimer(void)
19d0: 7b 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65  {.  if( getProce
19e0: 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20  ssTimesAddr ){. 
19f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1a00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47   else {.    /* G
1a10: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29  etProcessTimes()
1a20: 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1a30: 20 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f   in WIN95 and so
1a40: 6d 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  me other Windows
1a50: 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73  .    ** versions
1a60: 2e 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72  . See if the ver
1a70: 73 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e  sion we are runn
1a80: 69 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61  ing on has it, a
1a90: 6e 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20  nd if it.    ** 
1aa0: 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61  does, save off a
1ab0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61   pointer to it a
1ac0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  nd the current p
1ad0: 72 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20  rocess handle.. 
1ae0: 20 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65     */.    hProce
1af0: 73 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50  ss = GetCurrentP
1b00: 72 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66  rocess();.    if
1b10: 28 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20  ( hProcess ){.  
1b20: 20 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69      HINSTANCE hi
1b30: 6e 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62  nstLib = LoadLib
1b40: 72 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65  rary(TEXT("Kerne
1b50: 6c 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20  l32.dll"));.    
1b60: 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69    if( NULL != hi
1b70: 6e 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20  nstLib ){.      
1b80: 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65    getProcessTime
1b90: 73 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20  sAddr =.        
1ba0: 20 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45      (GETPROCTIME
1bb0: 53 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  S) GetProcAddres
1bc0: 73 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74  s(hinstLib, "Get
1bd0: 50 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a  ProcessTimes");.
1be0: 20 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c          if( NULL
1bf0: 20 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69   != getProcessTi
1c00: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20  mesAddr ){.     
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1c20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c30: 20 46 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e   FreeLibrary(hin
1c40: 73 74 4c 69 62 29 3b 20 0a 20 20 20 20 20 20 7d  stLib); .      }
1c50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1c70: 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20  Begin timing an 
1c80: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  operation.*/.sta
1c90: 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69  tic void beginTi
1ca0: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
1cb0: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20   enableTimer && 
1cc0: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1cd0: 64 64 72 20 29 7b 0a 20 20 20 20 46 49 4c 45 54  ddr ){.    FILET
1ce0: 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20  IME ftCreation, 
1cf0: 66 74 45 78 69 74 3b 0a 20 20 20 20 67 65 74 50  ftExit;.    getP
1d00: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28  rocessTimesAddr(
1d10: 68 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61  hProcess,&ftCrea
1d20: 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20  tion,&ftExit,.  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 26 66 74 4b 65 72 6e 65 6c 42        &ftKernelB
1d50: 65 67 69 6e 2c 26 66 74 55 73 65 72 42 65 67 69  egin,&ftUserBegi
1d60: 6e 29 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42 65  n);.    ftWallBe
1d70: 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  gin = timeOfDay(
1d80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74  );.  }.}../* Ret
1d90: 75 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e  urn the differen
1da0: 63 65 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49  ce of two FILETI
1db0: 4d 45 20 73 74 72 75 63 74 73 20 69 6e 20 73 65  ME structs in se
1dc0: 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  conds */.static 
1dd0: 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28  double timeDiff(
1de0: 46 49 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74  FILETIME *pStart
1df0: 2c 20 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64  , FILETIME *pEnd
1e00: 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  ){.  sqlite_int6
1e10: 34 20 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28  4 i64Start = *((
1e20: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20  sqlite_int64 *) 
1e30: 70 53 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74  pStart);.  sqlit
1e40: 65 5f 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d  e_int64 i64End =
1e50: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
1e60: 20 2a 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74   *) pEnd);.  ret
1e70: 75 72 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69  urn (double) ((i
1e80: 36 34 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74  64End - i64Start
1e90: 29 20 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b  ) / 10000000.0);
1ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
1eb0: 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c  the timing resul
1ec0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
1ed0: 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64  id endTimer(void
1ee0: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
1ef0: 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65  imer && getProce
1f00: 73 73 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20  ssTimesAddr){.  
1f10: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65    FILETIME ftCre
1f20: 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66  ation, ftExit, f
1f30: 74 4b 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73  tKernelEnd, ftUs
1f40: 65 72 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  erEnd;.    sqlit
1f50: 65 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 45  e3_int64 ftWallE
1f60: 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  nd = timeOfDay()
1f70: 3b 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73 73  ;.    getProcess
1f80: 54 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65  TimesAddr(hProce
1f90: 73 73 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26  ss,&ftCreation,&
1fa0: 66 74 45 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c  ftExit,&ftKernel
1fb0: 45 6e 64 2c 26 66 74 55 73 65 72 45 6e 64 29 3b  End,&ftUserEnd);
1fc0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e  .    printf("Run
1fd0: 20 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66   Time: real %.3f
1fe0: 20 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c   user %f sys %f\
1ff0: 6e 22 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61  n",.       (ftWa
2000: 6c 6c 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65  llEnd - ftWallBe
2010: 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20  gin)*0.001,.    
2020: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55     timeDiff(&ftU
2030: 73 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65  serBegin, &ftUse
2040: 72 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69  rEnd),.       ti
2050: 6d 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c  meDiff(&ftKernel
2060: 42 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c  Begin, &ftKernel
2070: 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  End));.  }.}..#d
2080: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
2090: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
20a0: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
20b0: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
20c0: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61  ine HAS_TIMER ha
20d0: 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a  sTimer()..#else.
20e0: 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49  #define BEGIN_TI
20f0: 4d 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44  MER .#define END
2100: 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48  _TIMER.#define H
2110: 41 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69  AS_TIMER 0.#endi
2120: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f  f../*.** Used to
2130: 20 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67   prevent warning
2140: 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
2150: 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65  arameters.*/.#de
2160: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
2170: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
2180: 78 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  x)../*.** If the
2190: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
21a0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
21b0: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
21c0: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
21d0: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
21e0: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
21f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
2200: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
2210: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
2220: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
2230: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
2240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2250: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
2260: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
2270: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
2280: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
2290: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
22a0: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
22b0: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
22c0: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  1;../*.** The fo
22d0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f  llowing is the o
22e0: 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62  pen SQLite datab
22f0: 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ase.  We make a 
2300: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2310: 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74  is database a st
2320: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f  atic variable so
2330: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
2340: 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74  accessed.** by t
2350: 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65  he SIGINT handle
2360: 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64  r to interrupt d
2370: 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69  atabase processi
2380: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ng..*/.static sq
2390: 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20  lite3 *globalDb 
23a0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  = 0;../*.** True
23b0: 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74   if an interrupt
23c0: 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73   (Control-C) has
23d0: 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a   been received..
23e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69  */.static volati
23f0: 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72  le int seenInter
2400: 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rupt = 0;../*.**
2410: 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d   This is the nam
2420: 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d  e of our program
2430: 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d  . It is set in m
2440: 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69  ain(), used.** i
2450: 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74  n a number of ot
2460: 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74  her places, most
2470: 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ly for error mes
2480: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
2490: 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f   char *Argv0;../
24a0: 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69  *.** Prompt stri
24b0: 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64  ngs. Initialized
24c0: 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62   in main. Settab
24d0: 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72  le with.**   .pr
24e0: 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e  ompt main contin
24f0: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
2500: 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d  r mainPrompt[20]
2510: 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c  ;     /* First l
2520: 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ine prompt. defa
2530: 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a  ult: "sqlite> "*
2540: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
2550: 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d  ntinuePrompt[20]
2560: 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f  ; /* Continuatio
2570: 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  n prompt. defaul
2580: 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f  t: "   ...> " */
2590: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
25a0: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
25b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
25c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
25d0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
25e0: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
25f0: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
2600: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
2610: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
2620: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
2630: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
2640: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
2650: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
2660: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
2670: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
2680: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
2690: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
26a0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
26b0: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
26c0: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
26d0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
26e0: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
26f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2700: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
2710: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
2720: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
2730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2740: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2750: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2760: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
2770: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
2780: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2790: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
27a0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
27b0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
27c0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72  a_end(ap);.  fpr
27d0: 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25  intf(iotrace, "%
27e0: 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65  s", z);.  sqlite
27f0: 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e  3_free(z);.}.#en
2800: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  dif.../*.** Dete
2810: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 72 69  rmines if a stri
2820: 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  ng is a number o
2830: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
2840: 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63 6f   int isNumber(co
2850: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2860: 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66   *realnum){.  if
2870: 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d  ( *z=='-' || *z=
2880: 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66  ='+' ) z++;.  if
2890: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
28a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
28b0: 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28    }.  z++;.  if(
28c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
28d0: 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  num = 0;.  while
28e0: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
28f0: 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a   z++; }.  if( *z
2900: 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='.' ){.    z++
2910: 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44 69 67  ;.    if( !IsDig
2920: 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  it(*z) ) return 
2930: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  0;.    while( Is
2940: 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Digit(*z) ){ z++
2950: 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c  ; }.    if( real
2960: 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d  num ) *realnum =
2970: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a   1;.  }.  if( *z
2980: 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27  =='e' || *z=='E'
2990: 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20   ){.    z++;.   
29a0: 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20   if( *z=='+' || 
29b0: 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  *z=='-' ) z++;. 
29c0: 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28     if( !IsDigit(
29d0: 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
29e0: 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67      while( IsDig
29f0: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
2a00: 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  .    if( realnum
2a10: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b   ) *realnum = 1;
2a20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  .  }.  return *z
2a30: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  ==0;.}../*.** A 
2a40: 67 6c 6f 62 61 6c 20 63 68 61 72 2a 20 61 6e 64  global char* and
2a50: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
2a60: 20 74 6f 20 61 63 63 65 73 73 20 69 74 73 20 63   to access its c
2a70: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a  urrent value .**
2a80: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
2a90: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  SQL statement. T
2aa0: 68 69 73 20 70 72 6f 67 72 61 6d 20 75 73 65 64  his program used
2ab0: 20 74 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a 20   to use the .** 
2ac0: 73 71 6c 69 74 65 5f 65 78 65 63 5f 70 72 69 6e  sqlite_exec_prin
2ad0: 74 66 28 29 20 41 50 49 20 74 6f 20 73 75 62 73  tf() API to subs
2ae0: 74 69 74 75 65 20 61 20 73 74 72 69 6e 67 20 69  titue a string i
2af0: 6e 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74 65  nto an SQL state
2b00: 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72  ment..** The cor
2b10: 72 65 63 74 20 77 61 79 20 74 6f 20 64 6f 20 74  rect way to do t
2b20: 68 69 73 20 77 69 74 68 20 73 71 6c 69 74 65 33  his with sqlite3
2b30: 20 69 73 20 74 6f 20 75 73 65 20 74 68 65 20 62   is to use the b
2b40: 69 6e 64 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20  ind API, but.** 
2b50: 73 69 6e 63 65 20 74 68 65 20 73 68 65 6c 6c 20  since the shell 
2b60: 69 73 20 62 75 69 6c 74 20 61 72 6f 75 6e 64 20  is built around 
2b70: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 70 61 72  the callback par
2b80: 61 64 69 67 6d 20 69 74 20 77 6f 75 6c 64 20 62  adigm it would b
2b90: 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f  e a lot.** of wo
2ba0: 72 6b 2e 20 49 6e 73 74 65 61 64 20 6a 75 73 74  rk. Instead just
2bb0: 20 75 73 65 20 74 68 69 73 20 68 61 63 6b 2c 20   use this hack, 
2bc0: 77 68 69 63 68 20 69 73 20 71 75 69 74 65 20 68  which is quite h
2bd0: 61 72 6d 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  armless..*/.stat
2be0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
2bf0: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
2c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
2c10: 6c 6c 73 74 61 74 69 63 46 75 6e 63 28 0a 20 20  llstaticFunc(.  
2c20: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c30: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2c40: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2c50: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2c60: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 61 72 67    assert( 0==arg
2c70: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  c );.  assert( z
2c80: 53 68 65 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20  ShellStatic );. 
2c90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ca0: 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45  R(argc);.  UNUSE
2cb0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 76  D_PARAMETER(argv
2cc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
2cd0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
2ce0: 2c 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c 20  , zShellStatic, 
2cf0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
2d00: 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  C);.}.../*.** Th
2d10: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
2d20: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
2d30: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
2d40: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
2d50: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2d60: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
2d70: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
2d80: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2d90: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
2da0: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
2db0: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
2dc0: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
2dd0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e  s..**.** If zLin
2de0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  e is not NULL th
2df0: 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f  en it is a mallo
2e00: 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72  ced buffer retur
2e10: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2e20: 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74  evious call to t
2e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74  his routine that
2e40: 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a   may be reused..
2e50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2e60: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
2e70: 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20  ar *zLine, FILE 
2e80: 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e  *in){.  int nLin
2e90: 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30  e = zLine==0 ? 0
2ea0: 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20   : 100;.  int n 
2eb0: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
2ec0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30   ){.    if( n+10
2ed0: 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20  0>nLine ){.     
2ee0: 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32   nLine = nLine*2
2ef0: 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c   + 100;.      zL
2f00: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c  ine = realloc(zL
2f10: 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20  ine, nLine);.   
2f20: 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
2f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2f40: 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28  }.    if( fgets(
2f50: 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65  &zLine[n], nLine
2f60: 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a   - n, in)==0 ){.
2f70: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
2f80: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  {.        free(z
2f90: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Line);.        r
2fa0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
2fb0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
2fc0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
2fe0: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b  e( zLine[n] ) n+
2ff0: 2b 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26  +;.    if( n>0 &
3000: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
3010: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
3020: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26  .      if( n>0 &
3030: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
3040: 72 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  r' ) n--;.      
3050: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
3060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3070: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
3080: 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ine;.}../*.** Re
3090: 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20  trieve a single 
30a0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65  line of input te
30b0: 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d  xt..**.** If in=
30c0: 3d 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f  =0 then read fro
30d0: 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  m standard input
30e0: 20 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f   and prompt befo
30f0: 72 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a  re each line..**
3100: 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69   If isContinuati
3110: 6f 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  on is true, then
3120: 20 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   a continuation 
3130: 70 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70  prompt is approp
3140: 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43  riate..** If isC
3150: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a  ontinuation is z
3160: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ero, then the ma
3170: 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64  in prompt should
3180: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
3190: 49 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74  If zPrior is not
31a0: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
31b0: 20 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61   a buffer from a
31c0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
31d0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  his.** routine t
31e0: 68 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65  hat can be reuse
31f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  d..**.** The res
3200: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
3210: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
3220: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
3230: 64 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a  d must either.**
3240: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
3250: 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20   caller or else 
3260: 70 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f  passed back into
3270: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
3280: 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20  a the.** zPrior 
3290: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75  argument for reu
32a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
32b0: 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69  ar *one_input_li
32c0: 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61  ne(FILE *in, cha
32d0: 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69  r *zPrior, int i
32e0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a  sContinuation){.
32f0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b    char *zPrompt;
3300: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
3310: 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b  ;.  if( in!=0 ){
3320: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c  .    zResult = l
3330: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72  ocal_getline(zPr
3340: 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73  ior, in);.  }els
3350: 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  e{.    zPrompt =
3360: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   isContinuation 
3370: 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  ? continuePrompt
3380: 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23   : mainPrompt;.#
3390: 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43  if SHELL_USE_LOC
33a0: 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70  AL_GETLINE.    p
33b0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f  rintf("%s", zPro
33c0: 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  mpt);.    fflush
33d0: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52  (stdout);.    zR
33e0: 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65  esult = local_ge
33f0: 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74  tline(zPrior, st
3400: 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  din);.#else.    
3410: 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20  free(zPrior);.  
3420: 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c    zResult = shel
3430: 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d  l_readline(zProm
3440: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  pt);.    if( zRe
3450: 73 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74  sult && *zResult
3460: 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73   ) shell_add_his
3470: 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23  tory(zResult);.#
3480: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
3490: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn zResult;.}../
34a0: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
34b0: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
34c0: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
34d0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 20 0a 2a  .explain on", .*
34e0: 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20  * saved so that 
34f0: 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  it can be restor
3500: 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20  ed by ".explain 
3510: 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20  off".*/.typedef 
3520: 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65  struct SavedMode
3530: 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e  Info SavedModeIn
3540: 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64  fo;.struct Saved
3550: 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74  ModeInfo {.  int
3560: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20   valid;         
3570: 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67   /* Is there leg
3580: 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f  it data in here?
3590: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
35a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
35b0: 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  e prior to ".exp
35c0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
35d0: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
35e0: 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65    /* The ".heade
35f0: 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72  r" setting prior
3600: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
3610: 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  " */.  int colWi
3620: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f  dth[100];  /* Co
3630: 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f  lumn widths prio
3640: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
3650: 6e 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  n" */.};../*.** 
3660: 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  State informatio
3670: 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
3680: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
3690: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
36a0: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
36b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
36c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
36d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
36e0: 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61  llState ShellSta
36f0: 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  te;.struct Shell
3700: 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65  State {.  sqlite
3710: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
3720: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
3730: 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e   */.  int echoOn
3740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3750: 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69 6e 70  True to echo inp
3760: 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20  ut commands */. 
3770: 20 69 6e 74 20 61 75 74 6f 45 51 50 3b 20 20 20   int autoEQP;   
3780: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45          /* Run E
3790: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
37a0: 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68  N prior to seach
37b0: 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 69   SQL stmt */.  i
37c0: 6e 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  nt statsOn;     
37d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
37e0: 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   display memory 
37f0: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
3800: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
3810: 69 6e 74 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b  int scanstatsOn;
3820: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
3830: 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73  o display scan s
3840: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
3850: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69   finalize */.  i
3860: 6e 74 20 62 61 63 6b 73 6c 61 73 68 4f 6e 3b 20  nt backslashOn; 
3870: 20 20 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65        /* Resolve
3880: 20 43 2d 73 74 79 6c 65 20 5c 78 20 65 73 63 61   C-style \x esca
3890: 70 65 73 20 69 6e 20 53 51 4c 20 69 6e 70 75 74  pes in SQL input
38a0: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f   text */.  int o
38b0: 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  utCount;        
38c0: 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73    /* Revert to s
38d0: 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68  tdout when reach
38e0: 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  ing zero */.  in
38f0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
3900: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3910: 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61  f records displa
3920: 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  yed so far */.  
3930: 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
3940: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
3950: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
3960: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74    FILE *traceOut
3970: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  ;        /* Outp
3980: 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74  ut for sqlite3_t
3990: 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  race() */.  int 
39a0: 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  nErr;           
39b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
39c0: 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20  errors seen */. 
39d0: 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20   int mode;      
39e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75          /* An ou
39f0: 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e  tput mode settin
3a00: 67 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74 61  g */.  int writa
3a10: 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a  bleSchema;    /*
3a20: 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20   True if PRAGMA 
3a30: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
3a40: 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77  ON */.  int show
3a50: 48 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 2f  Header;        /
3a60: 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77 20 63  * True to show c
3a70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 4c  olumn names in L
3a80: 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f  ist or Column mo
3a90: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
3aa0: 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20 20 2f   shellFlgs;    /
3ab0: 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20  * Various flags 
3ac0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74  */.  char *zDest
3ad0: 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e  Table;      /* N
3ae0: 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69  ame of destinati
3af0: 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f  on table when MO
3b00: 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63  DE_Insert */.  c
3b10: 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72  har colSeparator
3b20: 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20  [20]; /* Column 
3b30: 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
3b40: 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ter for several 
3b50: 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  modes */.  char 
3b60: 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d  rowSeparator[20]
3b70: 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74  ; /* Row separat
3b80: 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72  or character for
3b90: 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20   MODE_Ascii */. 
3ba0: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
3bb0: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
3bc0: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
3bd0: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
3be0: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
3bf0: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
3c00: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
3c10: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
3c20: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
3c30: 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b  r nullValue[20];
3c40: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
3c50: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
3c60: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
3c70: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
3c90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
3ca0: 0a 20 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f  .  SavedModeInfo
3cb0: 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 2f 2a 20 48   normalMode;/* H
3cc0: 6f 6c 64 73 20 74 68 65 20 6d 6f 64 65 20 6a 75  olds the mode ju
3cd0: 73 74 20 62 65 66 6f 72 65 20 2e 65 78 70 6c 61  st before .expla
3ce0: 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20  in ON */.  char 
3cf0: 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45  outfile[FILENAME
3d00: 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61  _MAX]; /* Filena
3d10: 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20  me for *out */. 
3d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
3d30: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
3d40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3d50: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
3d60: 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73  har *zFreeOnClos
3d70: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  e;         /* Fi
3d80: 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77  lename to free w
3d90: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
3da0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
3db0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
3dc0: 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75  Name of VFS to u
3dd0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
3de0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
3df0: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
3e00: 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ent if any. */. 
3e10: 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20   FILE *pLog;    
3e20: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3e30: 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65   log output here
3e40: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64   */.  int *aiInd
3e50: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ent;         /* 
3e60: 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73  Array of indents
3e70: 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78   used in MODE_Ex
3e80: 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  plain */.  int n
3e90: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
3ea0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
3eb0: 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  ay aiIndent[] */
3ec0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20  .  int iIndent; 
3ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3ee0: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70  ex of current op
3ef0: 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   in aiIndent[] *
3f00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
3f10: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
3f20: 64 20 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75  d shellFlgs valu
3f30: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  es.*/.#define SH
3f40: 46 4c 47 5f 53 63 72 61 74 63 68 20 20 20 20 20  FLG_Scratch     
3f50: 30 78 30 30 30 30 31 20 20 20 20 20 2f 2a 20 54  0x00001     /* T
3f60: 68 65 20 2d 2d 73 63 72 61 74 63 68 20 6f 70 74  he --scratch opt
3f70: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
3f80: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
3f90: 65 63 61 63 68 65 20 20 20 30 78 30 30 30 30 32  ecache   0x00002
3fa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 2d 2d 70 61       /* The --pa
3fb0: 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69  gecache option i
3fc0: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
3fd0: 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64  e SHFLG_Lookasid
3fe0: 65 20 20 20 30 78 30 30 30 30 34 20 20 20 20 20  e   0x00004     
3ff0: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
4000: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a  ory is used */..
4010: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
4020: 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65  the allowed mode
4030: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  s..*/.#define MO
4040: 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f  DE_Line     0  /
4050: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72  * One column per
4060: 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69   line.  Blank li
4070: 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72  ne between recor
4080: 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ds */.#define MO
4090: 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f  DE_Column   1  /
40a0: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
40b0: 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f   line in neat co
40c0: 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lumns */.#define
40d0: 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32   MODE_List     2
40e0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
40f0: 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20  per line with a 
4100: 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65  separator */.#de
4110: 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20  fine MODE_Semi  
4120: 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73     3  /* Same as
4130: 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61   MODE_List but a
4140: 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63  ppend ";" to eac
4150: 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  h line */.#defin
4160: 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20  e MODE_Html     
4170: 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  4  /* Generate a
4180: 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f  n XHTML table */
4190: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e  .#define MODE_In
41a0: 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e  sert   5  /* Gen
41b0: 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72  erate SQL "inser
41c0: 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  t" statements */
41d0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
41e0: 6c 20 20 20 20 20 20 36 20 20 2f 2a 20 47 65 6e  l      6  /* Gen
41f0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
4200: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
4210: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
4220: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 37 20 20  ODE_Csv      7  
4230: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
4240: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
4250: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
4260: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 38 20 20  ODE_Explain  8  
4270: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
4280: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
4290: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
42a0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73  .#define MODE_As
42b0: 63 69 69 20 20 20 20 39 20 20 2f 2a 20 55 73 65  cii    9  /* Use
42c0: 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20   ASCII unit and 
42d0: 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72  record separator
42e0: 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f  s (0x1F/0x1E) */
42f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
4300: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
4310: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
4320: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
4330: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
4340: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
4350: 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  rt",.  "tcl",.  
4360: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
4370: 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 7d  n",.  "ascii",.}
4380: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
4390: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
43a0: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
43b0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
43c0: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
43d0: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
43e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
43f0: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
4400: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
4410: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
4420: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
4430: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
4440: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
4450: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
4460: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
4470: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
4480: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
4490: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
44a0: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
44b0: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
44c0: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  ** Number of ele
44d0: 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61  ments in an arra
44e0: 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72  y.*/.#define Arr
44f0: 61 79 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29  aySize(X)  (int)
4500: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
4510: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
4520: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
4530: 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20   length that is 
4540: 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20  limited to what 
4550: 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
4560: 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74  .** lower 30 bit
4570: 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69  s of a 32-bit si
4580: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  gned integer..*/
4590: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
45a0: 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20  en30(const char 
45b0: 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z){.  const cha
45c0: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69  r *z2 = z;.  whi
45d0: 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b  le( *z2 ){ z2++;
45e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66   }.  return 0x3f
45f0: 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a  ffffff & (int)(z
4600: 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2 - z);.}../*.**
4610: 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20   A callback for 
4620: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  the sqlite3_log(
4630: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
4640: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
4650: 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c  lLog(void *pArg,
4660: 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63   int iErrCode, c
4670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29  onst char *zMsg)
4680: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
4690: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
46a0: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e  )pArg;.  if( p->
46b0: 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  pLog==0 ) return
46c0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 70  ;.  fprintf(p->p
46d0: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
46e0: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
46f0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
4700: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Log);.}../*.** O
4710: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
4720: 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d  string as a hex-
4730: 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67  encoded blob (eg
4740: 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73  . X'1234' ).*/.s
4750: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
4760: 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20  t_hex_blob(FILE 
4770: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  *out, const void
4780: 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
4790: 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ob){.  int i;.  
47a0: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63  char *zBlob = (c
47b0: 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 66  har *)pBlob;.  f
47c0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
47d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
47e0: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70 72 69  Blob; i++){ fpri
47f0: 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a  ntf(out,"%02x",z
4800: 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d  Blob[i]&0xff); }
4810: 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
4820: 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  '");.}../*.** Ou
4830: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
4840: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
4850: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
4860: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
4870: 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntions..*/.stati
4880: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
4890: 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  oted_string(FILE
48a0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
48b0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
48c0: 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20    int nSingle = 
48d0: 30 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f  0;.  setBinaryMo
48e0: 64 65 28 6f 75 74 29 3b 0a 20 20 66 6f 72 28 69  de(out);.  for(i
48f0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
4900: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
4910: 27 27 20 29 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a  '' ) nSingle++;.
4920: 20 20 7d 0a 20 20 69 66 28 20 6e 53 69 6e 67 6c    }.  if( nSingl
4930: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
4940: 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a  ntf(out,"'%s'",z
4950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4960: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
4970: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
4980: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
4990: 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d  ; z[i] && z[i]!=
49a0: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '\''; i++){}.   
49b0: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
49c0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
49d0: 75 74 2c 22 27 27 22 29 3b 0a 20 20 20 20 20 20  ut,"''");.      
49e0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    z++;.      }el
49f0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
4a00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ' ){.        fpr
4a10: 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 27 27  intf(out,"%.*s''
4a20: 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20  ",i,z);.        
4a30: 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  z += i+1;.      
4a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
4a50: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
4a60: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
4a70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4a80: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
4a90: 2c 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74  ,"'");.  }.  set
4aa0: 54 65 78 74 4d 6f 64 65 28 6f 75 74 29 3b 0a 7d  TextMode(out);.}
4ab0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
4ac0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
4ad0: 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f  as a quoted acco
4ae0: 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43  rding to C or TC
4af0: 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e  L quoting rules.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
4b20: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
4b30: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73   char *z){.  uns
4b40: 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66  igned int c;.  f
4b50: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
4b60: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28    while( (c = *(
4b70: 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  z++))!=0 ){.    
4b80: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
4b90: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
4ba0: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
4bb0: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  c, out);.    }el
4bc0: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
4bd0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
4be0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
4bf0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
4c00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4c10: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\t' ){.      f
4c20: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
4c30: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27  .      fputc('t'
4c40: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
4c50: 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b  e if( c=='\n' ){
4c60: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
4c70: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
4c80: 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a  putc('n', out);.
4c90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4ca0: 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\r' ){.      f
4cb0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
4cc0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27  .      fputc('r'
4cd0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
4ce0: 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63  e if( !isprint(c
4cf0: 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20  &0xff) ){.      
4d00: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c  fprintf(out, "\\
4d10: 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a  %03o", c&0xff);.
4d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4d30: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
4d40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74      }.  }.  fput
4d50: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a  c('"', out);.}..
4d60: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
4d70: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69   given string wi
4d80: 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68  th characters th
4d90: 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74  at are special t
4da0: 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65  o.** HTML escape
4db0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4dc0: 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74  d output_html_st
4dd0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
4de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
4df0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
4e00: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
4e10: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
4e20: 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d   for(i=0;   z[i]
4e30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
4e40: 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20 20 20   z[i]!='<' .    
4e50: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
4e60: 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='&' .          
4e70: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 20 0a    && z[i]!='>' .
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
4e90: 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20 20 20  [i]!='\"' .     
4ea0: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
4eb0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b  '\'';.        i+
4ec0: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30  +){}.    if( i>0
4ed0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4ee0: 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a  f(out,"%.*s",i,z
4ef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4f00: 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20   z[i]=='<' ){.  
4f10: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
4f20: 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&lt;");.    }el
4f30: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27  se if( z[i]=='&'
4f40: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4f50: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
4f60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
4f70: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
4f80: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67   fprintf(out,"&g
4f90: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
4fa0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29  if( z[i]=='\"' )
4fb0: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4fc0: 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20  out,"&quot;");. 
4fd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
4fe0: 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  ]=='\'' ){.     
4ff0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23   fprintf(out,"&#
5000: 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  39;");.    }else
5010: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
5020: 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20     }.    z += i 
5030: 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  + 1;.  }.}../*.*
5040: 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e  * If a field con
5050: 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63  tains any charac
5060: 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
5070: 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c  y a 1 in the fol
5080: 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c  lowing.** array,
5090: 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67   then the string
50a0: 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20   must be quoted 
50b0: 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74  for CSV..*/.stat
50c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65  ic const char ne
50d0: 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b  edCsvQuote[] = {
50e0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
50f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
5100: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
5110: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
5120: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
5130: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
5140: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
5150: 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20   1, 0, 1, 0, 0, 
5160: 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c  0, 0, 1,   0, 0,
5170: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
5180: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
5190: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
51a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
51b0: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
51c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
51d0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
51e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20   0, 0, 0, 0, .  
51f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
5200: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
5210: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
5220: 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , .  0, 0, 0, 0,
5230: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
5240: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
5250: 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20   0, 0, .  0, 0, 
5260: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
5270: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
5280: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20 20 31  0, 0, 0, 1, .  1
5290: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
52a0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
52b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
52c0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
52d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
52e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
52f0: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
5300: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
5310: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
5320: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
5330: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
5340: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
5350: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
5360: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
5370: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
5380: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
5390: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
53a0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
53b0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
53c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
53d0: 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31   1,   .  1, 1, 1
53e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
53f0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
5400: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20  , 1, 1, 1,   .  
5410: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
5420: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
5430: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
5440: 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ,   .};../*.** O
5450: 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74  utput a single t
5460: 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74  erm of CSV.  Act
5470: 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70  ually, p->colSep
5480: 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66  arator is used f
5490: 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  or.** the separa
54a0: 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  tor, which may o
54b0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  r may not be a c
54c0: 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61  omma.  p->nullVa
54d0: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75  lue is.** the nu
54e0: 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e  ll value.  Strin
54f0: 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69 66  gs are quoted if
5500: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
5510: 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73   separator.** is
5520: 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20   only issued if 
5530: 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f  bSep is true..*/
5540: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
5550: 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61  put_csv(ShellSta
5560: 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
5570: 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b  r *z, int bSep){
5580: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70  .  FILE *out = p
5590: 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d  ->out;.  if( z==
55a0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
55b0: 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c  (out,"%s",p->nul
55c0: 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65  lValue);.  }else
55d0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
55e0: 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c   int nSep = strl
55f0: 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72  en30(p->colSepar
5600: 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ator);.    for(i
5610: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
5620: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73        if( needCs
5630: 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65  vQuote[((unsigne
5640: 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a  d char*)z)[i]] .
5650: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69           || (z[i
5660: 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ]==p->colSeparat
5670: 6f 72 5b 30 5d 20 26 26 20 0a 20 20 20 20 20 20  or[0] && .      
5680: 20 20 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20         (nSep==1 
5690: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e  || memcmp(z, p->
56a0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53  colSeparator, nS
56b0: 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20  ep)==0)) ){.    
56c0: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
56d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
56e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
56f0: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 75  i==0 ){.      pu
5700: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
5710: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
5720: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
5730: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29   if( z[i]=='"' )
5740: 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b   putc('"', out);
5750: 0a 20 20 20 20 20 20 20 20 70 75 74 63 28 7a 5b  .        putc(z[
5760: 69 5d 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  i], out);.      
5770: 7d 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27  }.      putc('"'
5780: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
5790: 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
57a0: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  (out, "%s", z);.
57b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
57c0: 62 53 65 70 20 29 7b 0a 20 20 20 20 66 70 72 69  bSep ){.    fpri
57d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
57e0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
57f0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65  r);.  }.}..#ifde
5800: 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20 54  f SIGINT./*.** T
5810: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
5820: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70   when the user p
5830: 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f  resses Ctrl-C.*/
5840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74  .static void int
5850: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69  errupt_handler(i
5860: 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  nt NotUsed){.  U
5870: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
5880: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e  NotUsed);.  seen
5890: 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69  Interrupt++;.  i
58a0: 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
58b0: 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20  >2 ) exit(1);.  
58c0: 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73  if( globalDb ) s
58d0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
58e0: 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 23 65  (globalDb);.}.#e
58f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
5900: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
5910: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
5920: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
5930: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
5940: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
5950: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5960: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
5970: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
5980: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
5990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
59a0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
59b0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
59c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
59d0: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
59e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
59f0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
5a00: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
5a10: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
5a20: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
5a30: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
5a40: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
5a50: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
5a60: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ;..  switch( p->
5a70: 6d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  mode ){.    case
5a80: 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20   MODE_Line: {.  
5a90: 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20      int w = 5;. 
5aa0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
5ab0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
5ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5ae0: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
5af0: 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  30(azCol[i] ? az
5b00: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
5b10: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20        if( len>w 
5b20: 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ) w = len;.     
5b30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
5b40: 63 6e 74 2b 2b 3e 30 20 29 20 66 70 72 69 6e 74  cnt++>0 ) fprint
5b50: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
5b60: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
5b70: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5b80: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
5b90: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
5ba0: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
5bb0: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
5bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5bd0: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
5be0: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
5bf0: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
5c00: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
5c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c20: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
5c30: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
5c40: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
5c50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
5c60: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
5c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5c80: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5c90: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
5ca0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
5cb0: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
5cc0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
5cd0: 20 20 20 77 20 3d 20 70 2d 3e 63 6f 6c 57 69 64     w = p->colWid
5ce0: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
5cf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5d00: 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20      w = 0;.     
5d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5d20: 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20   if( w==0 ){.   
5d30: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
5d40: 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f  len30(azCol[i] ?
5d50: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
5d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
5d70: 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a   w<10 ) w = 10;.
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
5d90: 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 20 26  strlen30(azArg &
5da0: 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  & azArg[i] ? azA
5db0: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
5dc0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
5dd0: 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d     if( w<n ) w =
5de0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   n;.          }.
5df0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
5e00: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
5e10: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
5e20: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75           p->actu
5e30: 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a  alWidth[i] = w;.
5e40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5e50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f        if( p->sho
5e60: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
5e70: 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29         if( w<0 )
5e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5e90: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5ea0: 25 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d 77 2c 61  %*.*s%s",-w,-w,a
5eb0: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5ed0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
5ee0: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 22 20 20  wSeparator : "  
5ef0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
5f00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5f10: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5f20: 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77  out,"%-*.*s%s",w
5f30: 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  ,w,azCol[i],.   
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
5f60: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
5f70: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
5f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5f90: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
5fa0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
5fb0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
5fc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
5fd0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
5fe0: 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20        int w;.   
5ff0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
6000: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
6010: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
6020: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
6030: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d  ->actualWidth[i]
6040: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6050: 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d   if( w<0 ) w = -
6060: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  w;.            }
6070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6080: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
6090: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
60a0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
60b0: 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22  ->out,"%-*.*s%s"
60c0: 2c 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ,w,w,"----------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72  i==nArg-1 ? p->r
6160: 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 22 20  owSeparator : " 
6170: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
6180: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6190: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
61a0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
61b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
61c0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
61d0: 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20      int w;.     
61e0: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
61f0: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
6200: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
6210: 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69   w = p->actualWi
6220: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
6230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6240: 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    w = 10;.      
6250: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6260: 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
6270: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
6280: 5d 20 26 26 20 73 74 72 6c 65 6e 33 30 28 61 7a  ] && strlen30(az
6290: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
62a0: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
62b0: 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n30(azArg[i]);. 
62c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
62d0: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
62e0: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
62f0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
6300: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
6310: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
6320: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
6330: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
6340: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
6350: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
6360: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6370: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
6380: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
6390: 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29         if( w<0 )
63a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
63b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 2e 2a  ntf(p->out,"%*.*
63c0: 73 25 73 22 2c 2d 77 2c 2d 77 2c 0a 20 20 20 20  s%s",-w,-w,.    
63d0: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
63e0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
63f0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20  p->nullValue,.  
6400: 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e              i==n
6410: 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65  Arg-1 ? p->rowSe
6420: 70 61 72 61 74 6f 72 20 3a 20 22 20 20 22 29 3b  parator : "  ");
6430: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6440: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
6450: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
6460: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
6470: 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20         azArg[i] 
6480: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
6490: 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20  nullValue,.     
64a0: 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67           i==nArg
64b0: 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61 72  -1 ? p->rowSepar
64c0: 61 74 6f 72 20 3a 20 22 20 20 22 29 3b 0a 20 20  ator : "  ");.  
64d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
64e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
64f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
6500: 5f 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65 20  _Semi:.    case 
6510: 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20  MODE_List: {.   
6520: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
6530: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
6540: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
6550: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
6560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
6570: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
6580: 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a  %s%s",azCol[i],.
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d    i==nArg-1 ? p-
65b0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20  >rowSeparator : 
65c0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
65d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
65e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
65f0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
6600: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6610: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
6620: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
6630: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
6640: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
6650: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20  p->nullValue;.  
6660: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
6670: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
6680: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41          if( i<nA
6690: 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rg-1 ){.        
66a0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
66b0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
66c0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
66d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d    }else if( p->m
66e0: 6f 64 65 3d 3d 4d 4f 44 45 5f 53 65 6d 69 20 29  ode==MODE_Semi )
66f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
6700: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 25 73  ntf(p->out, ";%s
6710: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
6720: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  or);.        }el
6730: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
6740: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
6750: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
6760: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
6770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6790: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
67a0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
67b0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
67c0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
67d0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
67e0: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
67f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
6800: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
6810: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
6820: 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20  ut,"<TH>");.    
6830: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d        output_htm
6840: 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  l_string(p->out,
6850: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
6860: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
6870: 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b  >out,"</TH>\n");
6880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6890: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
68a0: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
68b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
68c0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
68d0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
68e0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
68f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6900: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
6910: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
6920: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
6930: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
6940: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
6950: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
6960: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
6970: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ue);.        fpr
6980: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
6990: 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  D>\n");.      }.
69a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
69b0: 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b  >out,"</TR>\n");
69c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
69d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
69e0: 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69  E_Tcl: {.      i
69f0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
6a00: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
6a10: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
6a20: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
6a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
6a40: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
6a50: 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  ut,azCol[i] ? az
6a60: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
6a70: 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72          if(i<nAr
6a80: 67 2d 31 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  g-1) fprintf(p->
6a90: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
6aa0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
6ab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
6ac0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
6ad0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
6ae0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
6af0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
6b00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
6b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6b30: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
6b40: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
6b50: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
6b60: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
6b70: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
6b80: 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  ) fprintf(p->out
6b90: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
6ba0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
6bb0: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
6bc0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
6bd0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
6be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6bf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
6c00: 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 73 65  _Csv: {.      se
6c10: 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f  tBinaryMode(p->o
6c20: 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ut);.      if( p
6c30: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
6c40: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
6c50: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
6c60: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
6c70: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
6c80: 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f  sv(p, azCol[i] ?
6c90: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20   azCol[i] : "", 
6ca0: 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20  i<nArg-1);.     
6cb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
6cc0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
6cd0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
6ce0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
6cf0: 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b     if( nArg>0 ){
6d00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6d10: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
6d20: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
6d30: 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d  _csv(p, azArg[i]
6d40: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
6d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
6d60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
6d70: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
6d80: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
6d90: 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
6da0: 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20  (p->out);.      
6db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6dc0: 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72   case MODE_Inser
6dd0: 74 3a 20 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e  t: {.      p->cn
6de0: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  t++;.      if( a
6df0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
6e00: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
6e10: 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e  ->out,"INSERT IN
6e20: 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54  TO %s",p->zDestT
6e30: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  able);.      if(
6e40: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
6e50: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
6e60: 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20  f(p->out,"(");. 
6e70: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
6e80: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
6e90: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
6ea0: 65 70 20 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20  ep = i>0 ? ",": 
6eb0: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  "";.          fp
6ec0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
6ed0: 73 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f  s%s", zSep, azCo
6ee0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
6ef0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
6f00: 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20 20  (p->out,")");.  
6f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
6f20: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 20 56 41 4c  ntf(p->out," VAL
6f30: 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 66 6f  UES(");.      fo
6f40: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
6f50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
6f60: 72 20 2a 7a 53 65 70 20 3d 20 69 3e 30 20 3f 20  r *zSep = i>0 ? 
6f70: 22 2c 22 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  ",": "";.       
6f80: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
6f90: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
6fa0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
6fb0: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
6fc0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
6fd0: 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c 22 2c 7a 53  >out,"%sNULL",zS
6fe0: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ep);.        }el
6ff0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
7000: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
7010: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
7020: 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30 5d       if( zSep[0]
7030: 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
7040: 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20  t,"%s",zSep);.  
7050: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
7060: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
7070: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
7080: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7090: 28 20 61 69 54 79 70 65 20 26 26 20 28 61 69 54  ( aiType && (aiT
70a0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
70b0: 4e 54 45 47 45 52 0a 20 20 20 20 20 20 20 20 20  NTEGER.         
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 7c 7c 20 61 69 54 79 70 65 5b 69 5d      || aiType[i]
70e0: 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 20  ==SQLITE_FLOAT) 
70f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
7100: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
7110: 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b 69  s",zSep, azArg[i
7120: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
7130: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
7140: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
7150: 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74  E_BLOB && p->pSt
7160: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
7170: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
7180: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
7190: 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74  mn_blob(p->pStmt
71a0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
71b0: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
71c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
71d0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
71e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65           if( zSe
71f0: 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70  p[0] ) fprintf(p
7200: 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29  ->out,"%s",zSep)
7210: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
7220: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f  ut_hex_blob(p->o
7230: 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ut, pBlob, nBlob
7240: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7250: 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a   if( isNumber(az
7260: 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20  Arg[i], 0) ){.  
7270: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
7280: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53  p->out,"%s%s",zS
7290: 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ep, azArg[i]);. 
72a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
72b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 70          if( zSep
72c0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d  [0] ) fprintf(p-
72d0: 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b  >out,"%s",zSep);
72e0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
72f0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
7300: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
7310: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7320: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
7330: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
7340: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7350: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
7360: 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20  ODE_Ascii: {.   
7370: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
7380: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
7390: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
73a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
73b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
73c0: 69 66 28 20 69 3e 30 20 29 20 66 70 72 69 6e 74  if( i>0 ) fprint
73d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
73e0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
73f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
7400: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
7410: 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c  azCol[i] ? azCol
7420: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  [i] : "");.     
7430: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
7440: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
7450: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
7460: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
7470: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
7480: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
7490: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
74a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
74b0: 28 20 69 3e 30 20 29 20 66 70 72 69 6e 74 66 28  ( i>0 ) fprintf(
74c0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
74d0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
74e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
74f0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72  p->out,"%s",azAr
7500: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
7510: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
7520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
7530: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
7540: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
7550: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65  ator);.      bre
7560: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7570: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7580: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
7590: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
75a0: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
75b0: 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b  library.** invok
75c0: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
75d0: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
75e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
75f0: 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a   callback(void *
7600: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
7610: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
7620: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f  ar **azCol){.  /
7630: 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74  * since we don't
7640: 20 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c   have type info,
7650: 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f   call the shell_
7660: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20  callback with a 
7670: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
7680: 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c  return shell_cal
7690: 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67  lback(pArg, nArg
76a0: 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20  , azArg, azCol, 
76b0: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NULL);.}../*.** 
76c0: 53 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74  Set the destinat
76d0: 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20  ion table field 
76e0: 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  of the ShellStat
76f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  e structure to.*
7700: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
7710: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20  e table given.  
7720: 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65  Escape any quote
7730: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7740: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  he.** table name
7750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7760: 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
7770: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
7780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7790: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
77a0: 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a   int needQuote;.
77b0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
77c0: 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  ( p->zDestTable 
77d0: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a  ){.    free(p->z
77e0: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
77f0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
7800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
7810: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
7820: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69    needQuote = !i
7830: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
7840: 20 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26   char)*zName) &&
7850: 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20   *zName!='_';.  
7860: 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65  for(i=n=0; zName
7870: 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a  [i]; i++, n++){.
7880: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
7890: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
78a0: 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61  zName[i]) && zNa
78b0: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20  me[i]!='_' ){.  
78c0: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
78d0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  1;.      if( zNa
78e0: 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b  me[i]=='\'' ) n+
78f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
7900: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e  f( needQuote ) n
7910: 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e   += 2;.  z = p->
7920: 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
7930: 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
7940: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( z==0 ){.    fp
7950: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
7960: 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
7970: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
7980: 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30  (1);.  }.  n = 0
7990: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
79a0: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27  e ) z[n++] = '\'
79b0: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  ';.  for(i=0; zN
79c0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
79d0: 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
79e0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
79f0: 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  me[i]=='\'' ) z[
7a00: 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  n++] = '\'';.  }
7a10: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
7a20: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
7a30: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a  ;.  z[n] = 0;.}.
7a40: 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65  ./* zIn is eithe
7a50: 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
7a60: 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64   NULL-terminated
7a70: 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72   string in memor
7a80: 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  y obtained.** fr
7a90: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20  om malloc(), or 
7aa0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20  a NULL pointer. 
7ab0: 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  The string point
7ac0: 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64  ed to by zAppend
7ad0: 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20   is.** added to 
7ae0: 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73  zIn, and the res
7af0: 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ult returned in 
7b00: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7b10: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  from malloc()..*
7b20: 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73  * zIn, if it was
7b30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72   not NULL, is fr
7b40: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eed..**.** If th
7b50: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
7b60: 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20  , quote, is not 
7b70: 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73  '\0', then it is
7b80: 20 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71   used as a .** q
7b90: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66  uote character f
7ba0: 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73  or zAppend..*/.s
7bb0: 74 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 65  tatic char *appe
7bc0: 6e 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e  ndText(char *zIn
7bd0: 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41  , char const *zA
7be0: 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74  ppend, char quot
7bf0: 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  e){.  int len;. 
7c00: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41   int i;.  int nA
7c10: 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30  ppend = strlen30
7c20: 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74  (zAppend);.  int
7c30: 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c   nIn = (zIn?strl
7c40: 65 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20  en30(zIn):0);.. 
7c50: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 6e   len = nAppend+n
7c60: 49 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74  In+1;.  if( quot
7c70: 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20  e ){.    len += 
7c80: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
7c90: 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b  i<nAppend; i++){
7ca0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65  .      if( zAppe
7cb0: 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c  nd[i]==quote ) l
7cc0: 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en++;.    }.  }.
7cd0: 0a 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20 2a  .  zIn = (char *
7ce0: 29 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65  )realloc(zIn, le
7cf0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20 29  n);.  if( !zIn )
7d00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7d10: 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74 65    }..  if( quote
7d20: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
7d30: 73 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a  sr = &zIn[nIn];.
7d40: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
7d50: 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ote;.    for(i=0
7d60: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
7d70: 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b  ){.      *zCsr++
7d80: 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20   = zAppend[i];. 
7d90: 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64       if( zAppend
7da0: 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43  [i]==quote ) *zC
7db0: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
7dc0: 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20    }.    *zCsr++ 
7dd0: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a 43  = quote;.    *zC
7de0: 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20  sr++ = '\0';.   
7df0: 20 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d 7a   assert( (zCsr-z
7e00: 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65  In)==len );.  }e
7e10: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  lse{.    memcpy(
7e20: 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65  &zIn[nIn], zAppe
7e30: 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20  nd, nAppend);.  
7e40: 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27    zIn[len-1] = '
7e50: 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  \0';.  }..  retu
7e60: 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn zIn;.}.../*.*
7e70: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
7e80: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
7e90: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53   will generate S
7ea0: 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e  QL output.  Prin
7eb0: 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  t.** the result 
7ec0: 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73  columns, comma-s
7ed0: 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c  eparated, on a l
7ee0: 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64  ine and then add
7ef0: 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20   a.** semicolon 
7f00: 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68  terminator to th
7f10: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69  e end of that li
7f20: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
7f30: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7f40: 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74  ns is 1 and that
7f50: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
7f60: 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68   text "--".** th
7f70: 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d  en write the sem
7f80: 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61  icolon on a sepa
7f90: 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74  rate line.  That
7fa0: 20 77 61 79 2c 20 69 66 20 61 20 0a 2a 2a 20 22   way, if a .** "
7fb0: 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
7fc0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
7fd0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
7fe0: 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
7ff0: 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
8000: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
8010: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
8020: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
8030: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
8040: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
8050: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
8060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
8070: 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
8080: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
8090: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
80a0: 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
80b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
80c0: 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
80d0: 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
80e0: 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
80f0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
8100: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
8110: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
8120: 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
8130: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8140: 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
8150: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
8160: 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
8170: 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
8180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8190: 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
81a0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
81b0: 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
81c0: 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
81d0: 2a 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c 69 74  */\n", rc, sqlit
81e0: 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
81f0: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
8200: 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
8210: 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
8220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
8230: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8240: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
8250: 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73  );.  nResult = s
8260: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
8270: 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  unt(pSelect);.  
8280: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
8290: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
82a0: 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20   zFirstRow ){.  
82b0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
82c0: 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74  ut, "%s", zFirst
82d0: 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72  Row);.      zFir
82e0: 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  stRow = 0;.    }
82f0: 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
8300: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
8310: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
8320: 74 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e  t, 0);.    fprin
8330: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
8340: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   z);.    for(i=1
8350: 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
8360: 29 7b 20 0a 20 20 20 20 20 20 66 70 72 69 6e 74  ){ .      fprint
8370: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c  f(p->out, ",%s",
8380: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8390: 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29  text(pSelect, i)
83a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
83b0: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
83c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20      while( z[0] 
83d0: 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c  && (z[0]!='-' ||
83e0: 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b   z[1]!='-') ) z+
83f0: 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20  +;.    if( z[0] 
8400: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
8410: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
8420: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8430: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
8440: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
8450: 7d 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 73  }    .    rc = s
8460: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
8470: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ect);.  }.  rc =
8480: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
8490: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
84a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
84b0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
84c0: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
84d0: 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
84e0: 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c 69  **/\n", rc, sqli
84f0: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
8500: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
8510: 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
8520: 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
8530: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8540: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
8550: 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20  ocate space and 
8560: 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74  save off current
8570: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a   error string..*
8580: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
8590: 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73  ave_err_msg(.  s
85a0: 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20  qlite3 *db      
85b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
85c0: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b  e to query */.){
85d0: 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d  .  int nErrMsg =
85e0: 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69   1+strlen30(sqli
85f0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
8600: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
8610: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
8620: 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20  c64(nErrMsg);.  
8630: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
8640: 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73     memcpy(zErrMs
8650: 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  g, sqlite3_errms
8660: 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b  g(db), nErrMsg);
8670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
8680: 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rrMsg;.}../*.** 
8690: 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  Display memory s
86a0: 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
86b0: 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74  int display_stat
86c0: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
86d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
86e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
86f0: 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
8700: 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
8710: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8720: 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
8730: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
8760: 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
8770: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  {.  int iCur;.  
8780: 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69  int iHiwtr;..  i
8790: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
87a0: 3e 6f 75 74 20 29 7b 0a 20 20 20 20 0a 20 20 20  >out ){.    .   
87b0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
87c0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
87d0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
87e0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
87f0: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
8800: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
8810: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
8820: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  t,.            "
8830: 4d 65 6d 6f 72 79 20 55 73 65 64 3a 20 20 20 20  Memory Used:    
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
8860: 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
8870: 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69         iCur, iHi
8880: 77 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  wtr);.    iHiwtr
8890: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
88a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
88b0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
88c0: 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 26 69 43  ALLOC_COUNT, &iC
88d0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
88e0: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
88f0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
8900: 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64  mber of Outstand
8910: 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
8920: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
8930: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
8940: 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
8950: 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
8960: 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61  lFlgs & SHFLG_Pa
8970: 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 20  gecache ){.     
8980: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
8990: 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
89a0: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
89b0: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
89c0: 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
89d0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
89e0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
89f0: 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
8a00: 20 20 20 20 20 20 20 20 22 4e 75 6d 62 65 72 20          "Number 
8a10: 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20  of Pcache Pages 
8a20: 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 25 64  Used:         %d
8a30: 20 28 6d 61 78 20 25 64 29 20 70 61 67 65 73 5c   (max %d) pages\
8a40: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
8a50: 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
8a60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
8a70: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
8a80: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
8a90: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
8aa0: 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
8ab0: 4f 57 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  OW, &iCur, &iHiw
8ac0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
8ad0: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8ae0: 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
8af0: 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
8b00: 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
8b10: 3a 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64  :     %d (max %d
8b20: 29 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  ) bytes\n",.    
8b30: 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48          iCur, iH
8b40: 69 77 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70  iwtr);.    if( p
8b50: 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
8b60: 20 53 48 46 4c 47 5f 53 63 72 61 74 63 68 20 29   SHFLG_Scratch )
8b70: 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d  {.      iHiwtr =
8b80: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
8b90: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
8ba0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
8bb0: 43 52 41 54 43 48 5f 55 53 45 44 2c 20 26 69 43  CRATCH_USED, &iC
8bc0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
8bd0: 73 65 74 29 3b 0a 20 20 20 20 20 20 66 70 72 69  set);.      fpri
8be0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
8bf0: 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61 74 63  Number of Scratc
8c00: 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20 55 73  h Allocations Us
8c10: 65 64 3a 20 20 25 64 20 28 6d 61 78 20 25 64 29  ed:  %d (max %d)
8c20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
8c30: 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
8c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
8c50: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
8c60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
8c70: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
8c80: 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f  _SCRATCH_OVERFLO
8c90: 57 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  W, &iCur, &iHiwt
8ca0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
8cb0: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
8cc0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  t,.            "
8cd0: 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61 74 63  Number of Scratc
8ce0: 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  h Overflow Bytes
8cf0: 3a 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29  :    %d (max %d)
8d00: 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
8d10: 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69         iCur, iHi
8d20: 77 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  wtr);.    iHiwtr
8d30: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
8d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
8d50: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
8d60: 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75  ALLOC_SIZE, &iCu
8d70: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
8d80: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
8d90: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72  (pArg->out, "Lar
8da0: 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a  gest Allocation:
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
8dd0: 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
8de0: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
8df0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
8e00: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
8e10: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
8e20: 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 26 69 43  ECACHE_SIZE, &iC
8e30: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
8e40: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
8e50: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61  f(pArg->out, "La
8e60: 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
8e70: 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20  ocation:        
8e80: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77              iHiw
8ea0: 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  tr);.    iHiwtr 
8eb0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
8ec0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
8ed0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43  SQLITE_STATUS_SC
8ee0: 52 41 54 43 48 5f 53 49 5a 45 2c 20 26 69 43 75  RATCH_SIZE, &iCu
8ef0: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
8f00: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
8f10: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72  (pArg->out, "Lar
8f20: 67 65 73 74 20 53 63 72 61 74 63 68 20 41 6c 6c  gest Scratch All
8f30: 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20  ocation:        
8f40: 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
8f50: 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
8f60: 72 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41  r);.#ifdef YYTRA
8f70: 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a  CKMAXSTACKDEPTH.
8f80: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
8f90: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
8fa0: 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54  te3_status(SQLIT
8fb0: 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f  E_STATUS_PARSER_
8fc0: 53 54 41 43 4b 2c 20 26 69 43 75 72 2c 20 26 69  STACK, &iCur, &i
8fd0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
8fe0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
8ff0: 2d 3e 6f 75 74 2c 20 22 44 65 65 70 65 73 74 20  ->out, "Deepest 
9000: 50 61 72 73 65 72 20 53 74 61 63 6b 3a 20 20 20  Parser Stack:   
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
9020: 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20  (max %d)\n",.   
9030: 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69           iCur, i
9040: 48 69 77 74 72 29 3b 0a 23 65 6e 64 69 66 0a 20  Hiwtr);.#endif. 
9050: 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26   }..  if( pArg &
9060: 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64  & pArg->out && d
9070: 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72  b ){.    if( pAr
9080: 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
9090: 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29  HFLG_Lookaside )
90a0: 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d  {.      iHiwtr =
90b0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
90c0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
90d0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
90e0: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
90f0: 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20  E_USED,.        
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
9120: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66  bReset);.      f
9130: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
9140: 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f  , "Lookaside Slo
9150: 74 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20  ts Used:        
9160: 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
9170: 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %d)\n",.        
9180: 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77        iCur, iHiw
9190: 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
91a0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
91b0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
91c0: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a  _LOOKASIDE_HIT,.
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
91f0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
9200: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
9210: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
9220: 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
9230: 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
9240: 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a  %d\n", iHiwtr);.
9250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
9260: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
9270: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
9280: 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
9290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
92a0: 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
92b0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
92c0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
92d0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
92e0: 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
92f0: 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
9300: 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b   %d\n", iHiwtr);
9310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
9320: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
9330: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
9340: 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c  KASIDE_MISS_FULL
9350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9360: 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
9370: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
9380: 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
9390: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
93a0: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
93b0: 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
93c0: 20 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29    %d\n", iHiwtr)
93d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
93e0: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
93f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
9400: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
9410: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
9420: 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
9430: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
9440: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
9450: 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61  >out, "Pager Hea
9460: 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
9470: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
9480: 79 74 65 73 5c 6e 22 2c 69 43 75 72 29 3b 0a 20  ytes\n",iCur);. 
9490: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
94a0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
94b0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
94c0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
94d0: 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
94e0: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
94f0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
9500: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
9510: 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20  he hits:        
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
9530: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
9540: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
9550: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
9560: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
9570: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
9580: 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20  HE_MISS, &iCur, 
9590: 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
95a0: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
95b0: 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
95c0: 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20  misses:         
95d0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
95e0: 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69 48 69   iCur); .    iHi
95f0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
9600: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
9610: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
9620: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
9630: 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26  _WRITE, &iCur, &
9640: 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
9650: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
9660: 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 77  t, "Page cache w
9670: 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20 20  rites:          
9680: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
9690: 69 43 75 72 29 3b 20 0a 20 20 20 20 69 48 69 77  iCur); .    iHiw
96a0: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
96b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
96c0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
96d0: 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
96e0: 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
96f0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
9700: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
9710: 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48  ->out, "Schema H
9720: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
9740: 62 79 74 65 73 5c 6e 22 2c 69 43 75 72 29 3b 20  bytes\n",iCur); 
9750: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
9760: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
9770: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
9780: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
9790: 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69  US_STMT_USED, &i
97a0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
97b0: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
97c0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
97d0: 74 61 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f  tatement Heap/Lo
97e0: 6f 6b 61 73 69 64 65 20 55 73 61 67 65 3a 20 20  okaside Usage:  
97f0: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
9800: 69 43 75 72 29 3b 20 0a 20 20 7d 0a 0a 20 20 69  iCur); .  }..  i
9810: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
9820: 3e 6f 75 74 20 26 26 20 64 62 20 26 26 20 70 41  >out && db && pA
9830: 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  rg->pStmt ){.   
9840: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
9850: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
9860: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
9870: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
9880: 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20  CAN_STEP,.      
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 20 20 62 52 65 73 65 74 29           bReset)
98b0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
98c0: 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63  rg->out, "Fullsc
98d0: 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  an Steps:       
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
98f0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
9900: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
9910: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
9920: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
9930: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
9940: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
9950: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
9960: 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e   "Sort Operation
9970: 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
9980: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
9990: 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
99a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
99b0: 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
99c0: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
99d0: 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65  US_AUTOINDEX,bRe
99e0: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
99f0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75  f(pArg->out, "Au
9a00: 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a  toindex Inserts:
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
9a30: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
9a40: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
9a50: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
9a60: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56  ITE_STMTSTATUS_V
9a70: 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b  M_STEP, bReset);
9a80: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
9a90: 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c  g->out, "Virtual
9aa0: 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20   Machine Steps: 
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
9ac0: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a  \n", iCur);.  }.
9ad0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 6d  .  /* Do not rem
9ae0: 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69 6e 65  ove this machine
9af0: 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d 65 6e   readable commen
9b00: 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73 2d 6f  t: extra-stats-o
9b10: 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a 0a 20  utput-here */.. 
9b20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9b30: 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63 61 6e  .** Display scan
9b40: 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   stats..*/.stati
9b50: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 5f 73  c void display_s
9b60: 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71 6c 69  canstats(.  sqli
9b70: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9b90: 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
9ba0: 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
9bb0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
9bc0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9bd0: 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
9be0: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
9bf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
9c00: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55 4e 55  SCANSTATUS.  UNU
9c10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
9c20: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
9c30: 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23 65 6c  METER(pArg);.#el
9c40: 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  se.  int i, k, n
9c50: 2c 20 6d 78 3b 0a 20 20 66 70 72 69 6e 74 66 28  , mx;.  fprintf(
9c60: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
9c70: 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d  ---- scanstats -
9c80: 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d  -------\n");.  m
9c90: 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30  x = 0;.  for(k=0
9ca0: 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20  ; k<=mx; k++){. 
9cb0: 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f     double rEstLo
9cc0: 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f  op = 1.0;.    fo
9cd0: 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29  r(i=n=0; 1; i++)
9ce0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9cf0: 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e  stmt *p = pArg->
9d00: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  pStmt;.      sql
9d10: 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70  ite3_int64 nLoop
9d20: 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20  , nVisit;.      
9d30: 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20  double rEst;.   
9d40: 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20     int iSid;.   
9d50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9d60: 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69  Explain;.      i
9d70: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
9d80: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
9d90: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
9da0: 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26  _NLOOP, (void*)&
9db0: 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  nLoop) ){.      
9dc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9de0: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
9df0: 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
9e00: 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28  STAT_SELECTID, (
9e10: 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20  void*)&iSid);.  
9e20: 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20      if( iSid>mx 
9e30: 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20  ) mx = iSid;.   
9e40: 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29     if( iSid!=k )
9e50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9e60: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
9e70: 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20       rEstLoop = 
9e80: 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20  (double)nLoop;. 
9e90: 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29         if( k>0 )
9ea0: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
9eb0: 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
9ec0: 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
9ed0: 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
9ee0: 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
9ef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
9f00: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
9f10: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
9f20: 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
9f30: 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
9f40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
9f50: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
9f60: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
9f70: 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
9f80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9f90: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
9fa0: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
9fb0: 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
9fc0: 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
9fd0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
9fe0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
9ff0: 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
a000: 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
a010: 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
a020: 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
a030: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 0a 20 20 20  (pArg->out, .   
a040: 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
a050: 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52   nLoop=%-8lld nR
a060: 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
a070: 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c  =%-8lld estRow/L
a080: 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20  oop=%-8g\n",.   
a090: 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56         nLoop, nV
a0a0: 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69  isit, (sqlite3_i
a0b0: 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30  nt64)(rEstLoop+0
a0c0: 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20  .5), rEst.      
a0d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
a0e0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
a0f0: 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  , "-------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
a110: 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ");.#endif.}../*
a120: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 7a  .** Parameter az
a130: 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f 20  Array points to 
a140: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
a150: 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e  d array of strin
a160: 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e  gs. zStr.** poin
a170: 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e  ts to a single n
a180: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
a190: 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e  ring. Return non
a1a0: 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a  -zero if zStr.**
a1b0: 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f 72   is equal, accor
a1c0: 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28 29  ding to strcmp()
a1d0: 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 20  , to any of the 
a1e0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
a1f0: 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rray..** Otherwi
a200: 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  se, return zero.
a210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a220: 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73  tr_in_array(cons
a230: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
a240: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 72  nst char **azArr
a250: 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ay){.  int i;.  
a260: 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61 79  for(i=0; azArray
a270: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
a280: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74  f( 0==strcmp(zSt
a290: 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20 29  r, azArray[i]) )
a2a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
a2b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a2c0: 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  .** If compiled 
a2d0: 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20 61  statement pSql a
a2e0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e 20  ppears to be an 
a2f0: 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e  EXPLAIN statemen
a300: 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61  t, allocate.** a
a310: 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
a320: 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64  ShellState.aiInd
a330: 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  ent[] array with
a340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
a350: 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f 70  * spaces each op
a360: 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 69  code should be i
a370: 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20 69  ndented before i
a380: 74 20 69 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2a  t is output. .**
a390: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
a3a0: 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
a3b0: 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
a3c0: 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
a3d0: 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
a3e0: 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
a3f0: 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
a400: 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
a410: 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
a420: 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
a430: 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
a440: 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
a450: 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
a460: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
a470: 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
a480: 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
a490: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
a4a0: 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
a4b0: 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
a4c0: 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
a4d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
a4e0: 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
a4f0: 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
a500: 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
a510: 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
a520: 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
a530: 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
a540: 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
a550: 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
a560: 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
a570: 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
a580: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
a590: 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
a5a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a5b0: 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
a5c0: 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
a5d0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
a5e0: 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
a5f0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
a600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a610: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
a620: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
a630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
a660: 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
a670: 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
a680: 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6a0: 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
a6b0: 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
a6c0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6e0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
a6f0: 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
a700: 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
a710: 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
a740: 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
a750: 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
a760: 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
a770: 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
a780: 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
a790: 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
a7a0: 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22   "NextIfOpen", "
a7d0: 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d  PrevIfOpen", 0 }
a7e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a7f0: 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
a800: 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
a810: 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
a820: 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
a850: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
a860: 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
a870: 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
a880: 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
a890: 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
a8a0: 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
a8b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
a8c0: 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
a8d0: 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
a8e0: 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
a8f0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
a900: 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
a910: 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
a920: 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
a930: 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
a940: 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
a950: 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
a960: 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
a970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
a980: 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
a990: 69 6e 22 2c 20 37 29 20 29 20 72 65 74 75 72 6e  in", 7) ) return
a9a0: 3b 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  ;..  for(iOp=0; 
a9b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
a9c0: 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
a9d0: 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
a9e0: 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
a9f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
aa00: 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
aa10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa20: 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
aa30: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
aa40: 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
aa50: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
aa60: 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
aa70: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
aa80: 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
aa90: 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
aaa0: 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
aab0: 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
aac0: 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
aad0: 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
aae0: 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
aaf0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
ab00: 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
ab10: 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
ab20: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
ab30: 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
ab40: 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
ab50: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
ab60: 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
ab70: 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
ab80: 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
ab90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
aba0: 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
abb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
abc0: 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
abd0: 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
abe0: 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
abf0: 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
ac00: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
ac10: 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
ac20: 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
ac30: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41  lloc ){.      nA
ac40: 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20  lloc += 100;.   
ac50: 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d     p->aiIndent =
ac60: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
ac70: 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e  ealloc64(p->aiIn
ac80: 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  dent, nAlloc*siz
ac90: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
aca0: 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a   abYield = (int*
acb0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
acc0: 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c  64(abYield, nAll
acd0: 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65  .    }.    abYie
acf0: 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e  ld[iOp] = str_in
ad00: 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69  _array(zOp, azYi
ad10: 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49  eld);.    p->aiI
ad20: 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a  ndent[iOp] = 0;.
ad30: 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d      p->nIndent =
ad40: 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28   iOp+1;..    if(
ad50: 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
ad60: 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20  p, azNext) ){.  
ad70: 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20      for(i=p2op; 
ad80: 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61  i<iOp; i++) p->a
ad90: 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b  iIndent[i] += 2;
ada0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
adb0: 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
adc0: 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70   azGoto) && p2op
add0: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20  <p->nIndent.    
ade0: 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f   && (abYield[p2o
adf0: 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f  p] || sqlite3_co
ae00: 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32  lumn_int(pSql, 2
ae10: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
ae20: 66 6f 72 28 69 3d 70 32 6f 70 2b 31 3b 20 69 3c  for(i=p2op+1; i<
ae30: 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49  iOp; i++) p->aiI
ae40: 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20  ndent[i] += 2;. 
ae50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69     }.  }..  p->i
ae60: 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71  Indent = 0;.  sq
ae70: 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69 65  lite3_free(abYie
ae80: 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ld);.  sqlite3_r
ae90: 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f  eset(pSql);.}../
aea0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72  *.** Free the ar
aeb0: 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ray allocated by
aec0: 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
aed0: 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  epare()..*/.stat
aee0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
aef0: 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c  data_delete(Shel
af00: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71  lState *p){.  sq
af10: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
af20: 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69  Indent);.  p->ai
af30: 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  Indent = 0;.  p-
af40: 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >nIndent = 0;.  
af50: 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
af60: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
af70: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
af80: 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
af90: 73 2e 20 20 50 72 69 6e 74 20 0a 2a 2a 20 61 6e  s.  Print .** an
afa0: 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f  y result rows/co
afb0: 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20  lumns depending 
afc0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  on the current m
afd0: 6f 64 65 20 0a 2a 2a 20 73 65 74 20 76 69 61 20  ode .** set via 
afe0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
aff0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
b000: 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
b010: 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
b020: 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
b030: 78 65 63 28 29 20 0a 2a 2a 20 66 75 6e 63 74 69  xec() .** functi
b040: 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b  on except it tak
b050: 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69  es a slightly di
b060: 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b  fferent callback
b070: 20 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63   .** and callbac
b080: 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e  k data argument.
b090: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b0a0: 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c  hell_exec(.  sql
b0b0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
b0e0: 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  n database */.  
b0f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
b100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
b120: 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64   to be evaluated
b130: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
b140: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
b150: 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69  ,char**,char**,i
b160: 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62  nt*),   /* Callb
b170: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
b1b0: 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
b1c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f  sqlite3_exec) */
b1d0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
b1e0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b200: 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
b210: 53 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  State */.  char 
b220: 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
b250: 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
b260: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
b270: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c  tmt *pStmt = NUL
b280: 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  L;     /* Statem
b290: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
b2a0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
b2b0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
b2c0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
b2d0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
b2e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b2f0: 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20  zLeftover;      
b300: 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75      /* Tail of u
b310: 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a  nprocessed SQL *
b320: 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73  /..  if( pzErrMs
b330: 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  g ){.    *pzErrM
b340: 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  sg = NULL;.  }..
b350: 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d    while( zSql[0]
b360: 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d   && (SQLITE_OK =
b370: 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 72 63 20  = rc) ){.    rc 
b380: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
b390: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
b3a0: 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
b3b0: 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
b3c0: 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
b3d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
b3e0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
b3f0: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
b400: 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
b410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b420: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
b430: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
b440: 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
b450: 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
b460: 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
b470: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
b480: 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
b490: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
b4a0: 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
b4b0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
b4c0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
b4d0: 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
b4e0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
b4f0: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
b500: 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
b510: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
b520: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
b530: 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
b540: 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
b550: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
b560: 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
b570: 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
b580: 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
b590: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
b5a0: 26 20 70 41 72 67 2d 3e 65 63 68 6f 4f 6e 20 29  & pArg->echoOn )
b5b0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
b5c0: 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c 20 3d  char *zStmtSql =
b5d0: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
b5e0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  mt);.        fpr
b5f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
b600: 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c  "%s\n", zStmtSql
b610: 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53   ? zStmtSql : zS
b620: 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ql);.      }..  
b630: 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20      /* Show the 
b640: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
b650: 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e  AN if .eqp is on
b660: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
b670: 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f  rg && pArg->auto
b680: 45 51 50 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EQP ){.        s
b690: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
b6a0: 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63  plain;.        c
b6b0: 68 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69  har *zEQP = sqli
b6c0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
b6d0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
b6e0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b710: 33 5f 73 71 6c 28 70 53 74 6d 74 29 29 3b 0a 20  3_sql(pStmt));. 
b720: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
b730: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
b740: 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
b750: 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
b760: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b780: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
b790: 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
b7a0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
b7c0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 2d  ntf(pArg->out,"-
b7d0: 2d 45 51 50 2d 2d 20 25 64 2c 22 2c 20 73 71 6c  -EQP-- %d,", sql
b7e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b7f0: 70 45 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a 20  pExplain, 0));. 
b800: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
b810: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64  tf(pArg->out,"%d
b820: 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,", sqlite3_colu
b830: 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
b840: 20 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   1));.          
b850: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
b860: 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74  out,"%d,", sqlit
b870: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
b880: 78 70 6c 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20  xplain, 2));.   
b890: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
b8a0: 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e  (pArg->out,"%s\n
b8b0: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
b8c0: 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
b8d0: 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3));.          
b8e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b8f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b900: 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
b910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b920: 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
b930: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
b940: 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
b950: 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
b960: 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
b970: 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
b980: 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
b990: 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
b9a0: 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
b9b0: 2e 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41  .*/.      if( pA
b9c0: 72 67 20 26 26 20 70 41 72 67 2d 3e 6d 6f 64 65  rg && pArg->mode
b9d0: 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
b9e0: 7b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  {.        explai
b9f0: 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70  n_data_prepare(p
ba00: 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  Arg, pStmt);.   
ba10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70     }..      /* p
ba20: 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
ba30: 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
ba40: 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
ba50: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20        ** have a 
ba60: 72 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f  result set or no
ba70: 74 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69  t and how wide i
ba80: 74 20 69 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  t is..      */. 
ba90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
baa0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
bab0: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61       /* if we ha
bac0: 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
bad0: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .. */.      if( 
bae0: 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
baf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69   ){.        /* i
bb00: 66 20 77 65 20 68 61 76 65 20 61 20 63 61 6c 6c  f we have a call
bb10: 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  back... */.     
bb20: 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b     if( xCallback
bb30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
bb40: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
bb50: 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72  for col name ptr
bb60: 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64  , value ptr, and
bb70: 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 20   type */.       
bb80: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
bb90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
bba0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
bbb0: 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
bbc0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
bbd0: 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f  c64(3*nCol*sizeo
bbe0: 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b  f(const char*) +
bbf0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
bc00: 66 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20  f( !pData ){.   
bc10: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
bc20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bc30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc40: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a           char **
bc50: 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a  azCols = (char *
bc60: 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  *)pData;      /*
bc70: 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74   Names of result
bc80: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
bc90: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
bca0: 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b  zVals = &azCols[
bcb0: 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20  nCol];       /* 
bcc0: 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  Results */.     
bcd0: 20 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79         int *aiTy
bce0: 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a  pes = (int *)&az
bcf0: 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52  Vals[nCol]; /* R
bd00: 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20  esult types */. 
bd10: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
bd20: 2c 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , x;.           
bd30: 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69   assert(sizeof(i
bd40: 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68  nt) <= sizeof(ch
bd50: 61 72 20 2a 29 29 3b 20 0a 20 20 20 20 20 20 20  ar *)); .       
bd60: 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
bd70: 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20   ptrs to column 
bd80: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  names */.       
bd90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bda0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
bdb0: 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73            azCols
bdc0: 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
bdd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
bde0: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
bdf0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
be00: 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
be10: 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72           /* extr
be20: 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
be30: 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
be50: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
be60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
be70: 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d      aiTypes[i] =
be80: 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   x = sqlite3_col
be90: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
bea0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
beb0: 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54      if( x==SQLIT
bec0: 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26  E_BLOB && pArg &
bed0: 26 20 70 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f  & pArg->mode==MO
bee0: 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20  DE_Insert ){.   
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
bf00: 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20  zVals[i] = "";. 
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
bf20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bf30: 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
bf40: 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  ] = (char*)sqlit
bf50: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
bf60: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
bf70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
bf90: 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61  !azVals[i] && (a
bfa0: 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54  iTypes[i]!=SQLIT
bfb0: 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
bfd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d    break; /* from
c000: 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   for */.        
c010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c020: 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
c030: 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20   for */..       
c040: 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74         /* if dat
c050: 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72  a and types extr
c060: 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  acted successful
c070: 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ly... */.       
c080: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
c090: 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 20 0a  E_ROW == rc ){ .
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70  /* call the supp
c0c0: 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69  lied callback wi
c0d0: 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f  th the result ro
c0e0: 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20  w data */.      
c0f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43            if( xC
c100: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43  allback(pArg, nC
c110: 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f  ol, azVals, azCo
c120: 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a  ls, aiTypes) ){.
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42    rc = SQLITE_AB
c150: 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ORT;.           
c160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
c180: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
c190: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
c1a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c1c0: 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53        } while( S
c1d0: 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
c1e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
c1f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
c200: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  a);.          }.
c210: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c220: 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20           do{.   
c230: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
c240: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
c250: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 77  );.          } w
c260: 68 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49  hile( rc == SQLI
c270: 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20  TE_ROW );.      
c280: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
c290: 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
c2a0: 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a 20  delete(pArg);.. 
c2b0: 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
c2c0: 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
c2d0: 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
c2e0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
c2f0: 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
c300: 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
c310: 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
c320: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c330: 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75  * print loop-cou
c340: 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65  nters if require
c350: 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
c360: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61  Arg && pArg->sca
c370: 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  nstatsOn ){.    
c380: 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e      display_scan
c390: 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b  stats(db, pArg);
c3a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c3b0: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
c3c0: 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65  statement just e
c3d0: 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73  xecuted. If this
c3e0: 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 20 0a   fails, save a .
c3f0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
c400: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
c410: 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
c420: 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
c430: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
c440: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
c450: 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
c460: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
c470: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
c480: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
c490: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
c4a0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
c4b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c4c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
c4d0: 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
c4e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
c4f0: 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
c500: 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
c510: 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
c520: 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
c530: 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
c540: 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
c550: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
c560: 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
c570: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
c580: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
c590: 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
c5a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
c5b0: 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
c5c0: 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
c5d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
c5e0: 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66 65   This is a diffe
c5f0: 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f  rent callback ro
c600: 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64  utine used for d
c610: 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  umping the datab
c620: 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77  ase..** Each row
c630: 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68 69   received by thi
c640: 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  s callback consi
c650: 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  sts of a table n
c660: 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ame,.** the tabl
c670: 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22 20  e type ("index" 
c680: 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20  or "table") and 
c690: 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68  SQL to create th
c6a0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  e table..** This
c6b0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
c6c0: 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66 69  print text suffi
c6d0: 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74  cient to recreat
c6e0: 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e the table..*/.
c6f0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f  static int dump_
c700: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
c710: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
c720: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
c730: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
c740: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
c750: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
c760: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c780: 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Sql;.  const cha
c790: 72 20 2a 7a 50 72 65 70 53 74 6d 74 20 3d 20 30  r *zPrepStmt = 0
c7a0: 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
c7b0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20  p = (ShellState 
c7c0: 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
c7d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 43 6f  D_PARAMETER(azCo
c7e0: 6c 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  l);.  if( nArg!=
c7f0: 33 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  3 ) return 1;.  
c800: 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
c810: 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
c820: 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
c830: 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a 20 20 69  azArg[2];.  .  i
c840: 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
c850: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
c860: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ce")==0 ){.    z
c870: 50 72 65 70 53 74 6d 74 20 3d 20 22 44 45 4c 45  PrepStmt = "DELE
c880: 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  TE FROM sqlite_s
c890: 65 71 75 65 6e 63 65 3b 5c 6e 22 3b 0a 20 20 7d  equence;\n";.  }
c8a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
c8b0: 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74 65  _strglob("sqlite
c8c0: 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65 29  _stat?", zTable)
c8d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
c8e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
c8f0: 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
c900: 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20  r;\n");.  }else 
c910: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62  if( strncmp(zTab
c920: 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  le, "sqlite_", 7
c930: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
c940: 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn 0;.  }else if
c950: 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20  ( strncmp(zSql, 
c960: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
c970: 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29  TABLE", 20)==0 )
c980: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73  {.    char *zIns
c990: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72  ;.    if( !p->wr
c9a0: 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a  itableSchema ){.
c9b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
c9c0: 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
c9d0: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
c9e0: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
c9f0: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
ca00: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
ca10: 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
ca20: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
ca30: 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
ca40: 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
ca50: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
ca60: 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
ca70: 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
ca80: 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
ca90: 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
caa0: 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
cab0: 6c 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  l);.    fprintf(
cac0: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
cad0: 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIns);.    sqlit
cae0: 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20  e3_free(zIns);. 
caf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cb00: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
cb10: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e  f(p->out, "%s;\n
cb20: 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  ", zSql);.  }.. 
cb30: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70   if( strcmp(zTyp
cb40: 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29  e, "table")==0 )
cb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
cb60: 6d 74 20 2a 70 54 61 62 6c 65 49 6e 66 6f 20 3d  mt *pTableInfo =
cb70: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   0;.    char *zS
cb80: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63  elect = 0;.    c
cb90: 68 61 72 20 2a 7a 54 61 62 6c 65 49 6e 66 6f 20  har *zTableInfo 
cba0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
cbb0: 54 6d 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Tmp = 0;.    int
cbc0: 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 0a 20   nRow = 0;.   . 
cbd0: 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20     zTableInfo = 
cbe0: 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c  appendText(zTabl
cbf0: 65 49 6e 66 6f 2c 20 22 50 52 41 47 4d 41 20 74  eInfo, "PRAGMA t
cc00: 61 62 6c 65 5f 69 6e 66 6f 28 22 2c 20 30 29 3b  able_info(", 0);
cc10: 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20  .    zTableInfo 
cc20: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61  = appendText(zTa
cc30: 62 6c 65 49 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c  bleInfo, zTable,
cc40: 20 27 22 27 29 3b 0a 20 20 20 20 7a 54 61 62 6c   '"');.    zTabl
cc50: 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65  eInfo = appendTe
cc60: 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 22  xt(zTableInfo, "
cc70: 29 3b 22 2c 20 30 29 3b 0a 0a 20 20 20 20 72 63  );", 0);..    rc
cc80: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
cc90: 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 54 61  re_v2(p->db, zTa
cca0: 62 6c 65 49 6e 66 6f 2c 20 2d 31 2c 20 26 70 54  bleInfo, -1, &pT
ccb0: 61 62 6c 65 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  ableInfo, 0);.  
ccc0: 20 20 66 72 65 65 28 7a 54 61 62 6c 65 49 6e 66    free(zTableInf
ccd0: 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 54  SQLITE_OK || !pT
ccf0: 61 62 6c 65 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ableInfo ){.    
cd00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cd10: 7d 0a 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d  }..    zSelect =
cd20: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c   appendText(zSel
cd30: 65 63 74 2c 20 22 53 45 4c 45 43 54 20 27 49 4e  ect, "SELECT 'IN
cd40: 53 45 52 54 20 49 4e 54 4f 20 27 20 7c 7c 20 22  SERT INTO ' || "
cd50: 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 41 6c 77  , 0);.    /* Alw
cd60: 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
cd70: 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
cd80: 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
cd90: 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
cda0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
cdb0: 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
cdc0: 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
cdd0: 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
cde0: 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64     zTmp = append
cdf0: 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c  Text(zTmp, zTabl
ce00: 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66 28  e, '"');.    if(
ce10: 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a   zTmp ){.      z
ce20: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
ce30: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d  ext(zSelect, zTm
ce40: 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20  p, '\'');.      
ce50: 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20  free(zTmp);.    
ce60: 7d 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  }.    zSelect = 
ce70: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
ce80: 63 74 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45  ct, " || ' VALUE
ce90: 53 28 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20  S(' || ", 0);.  
cea0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
ceb0: 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  tep(pTableInfo);
cec0: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
ced0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
cee0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cef0: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
cf00: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
cf10: 6c 75 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65  lumn_text(pTable
cf20: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
cf30: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
cf40: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71  Text(zSelect, "q
cf50: 75 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20  uote(", 0);.    
cf60: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
cf70: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
cf80: 7a 54 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20  zText, '"');.   
cf90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
cfa0: 73 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29  step(pTableInfo)
cfb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
cfc0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
cfd0: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
cfe0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
cff0: 63 74 2c 20 22 29 2c 20 22 2c 20 30 29 3b 0a 20  ct, "), ", 0);. 
d000: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d010: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
d020: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
d030: 2c 20 22 29 20 22 2c 20 30 29 3b 0a 20 20 20 20  , ") ", 0);.    
d040: 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b    }.      nRow++
d050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
d060: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
d070: 65 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  e(pTableInfo);. 
d080: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d090: 45 5f 4f 4b 20 7c 7c 20 6e 52 6f 77 3d 3d 30 20  E_OK || nRow==0 
d0a0: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 53  ){.      free(zS
d0b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 72 65  elect);.      re
d0c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
d0d0: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
d0e0: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
d0f0: 22 7c 7c 20 27 29 27 20 46 52 4f 4d 20 20 22 2c  "|| ')' FROM  ",
d100: 20 30 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74   0);.    zSelect
d110: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
d120: 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27  elect, zTable, '
d130: 22 27 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72  "');..    rc = r
d140: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
d150: 65 72 79 28 70 2c 20 7a 53 65 6c 65 63 74 2c 20  ery(p, zSelect, 
d160: 7a 50 72 65 70 53 74 6d 74 29 3b 0a 20 20 20 20  zPrepStmt);.    
d170: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
d180: 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
d190: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
d1a0: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20  Text(zSelect, " 
d1b0: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
d1c0: 45 53 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ESC", 0);.      
d1d0: 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
d1e0: 75 65 72 79 28 70 2c 20 7a 53 65 6c 65 63 74 2c  uery(p, zSelect,
d1f0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
d200: 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20  ree(zSelect);.  
d210: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
d220: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72  ./*.** Run zQuer
d230: 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c  y.  Use dump_cal
d240: 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63  lback() as the c
d250: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
d260: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  so that.** the c
d270: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71  ontents of the q
d280: 75 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20  uery are output 
d290: 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  as SQL statement
d2a0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67  s..**.** If we g
d2b0: 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52  et a SQLITE_CORR
d2c0: 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e  UPT error, rerun
d2d0: 20 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72   the query after
d2e0: 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f   appending.** "O
d2f0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
d300: 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a  SC" to the end..
d310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
d320: 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
d330: 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
d340: 65 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  e *p, .  const c
d350: 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20  har *zQuery.){. 
d360: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
d370: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20  *zErr = 0;.  rc 
d380: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
d390: 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75  ->db, zQuery, du
d3a0: 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  mp_callback, p, 
d3b0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63  &zErr);.  if( rc
d3c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
d3d0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51   ){.    char *zQ
d3e0: 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  2;.    int len =
d3f0: 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79   strlen30(zQuery
d400: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
d410: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
d420: 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52  CORRUPTION ERROR
d430: 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20   *******/\n");. 
d440: 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
d450: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
d460: 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
d470: 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
d480: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d490: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
d4a0: 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
d4b0: 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
d4c0: 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
d4d0: 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
d4e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d4f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d500: 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
d510: 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
d520: 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
d530: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d540: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
d550: 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
d560: 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
d570: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d580: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
d590: 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f  t, "/****** ERRO
d5a0: 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  R: %s ******/\n"
d5b0: 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c  , zErr);.    }el
d5c0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
d5d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
d5e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d5f0: 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
d600: 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a   free(zQ2);.  }.
d610: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d620: 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 61 20  /*.** Text of a 
d630: 68 65 6c 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a  help message.*/.
d640: 73 74 61 74 69 63 20 63 68 61 72 20 7a 48 65 6c  static char zHel
d650: 70 5b 5d 20 3d 0a 20 20 22 2e 62 61 63 6b 75 70  p[] =.  ".backup
d660: 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
d670: 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61 75  Backup DB (defau
d680: 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20  lt \"main\") to 
d690: 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69 6c  FILE\n".  ".bail
d6a0: 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
d6b0: 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69 74    Stop after hit
d6c0: 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20  ting an error.  
d6d0: 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20  Default OFF\n". 
d6e0: 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66   ".binary on|off
d6f0: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69           Turn bi
d700: 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f  nary output on o
d710: 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20  r off.  Default 
d720: 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65  OFF\n".  ".clone
d730: 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20   NEWDB          
d740: 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f   Clone data into
d750: 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20   NEWDB from the 
d760: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
d770: 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73  e\n".  ".databas
d780: 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 4c  es             L
d790: 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69  ist names and fi
d7a0: 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20  les of attached 
d7b0: 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22  databases\n".  "
d7c0: 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20  .dbinfo ?DB?    
d7d0: 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
d7e0: 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
d7f0: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
d800: 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54  e\n".  ".dump ?T
d810: 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44  ABLE? ...      D
d820: 75 6d 70 20 74 68 65 20 64 61 74 61 62 61 73 65  ump the database
d830: 20 69 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20   in an SQL text 
d840: 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20  format\n".  "   
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
d870: 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64  pecified, only d
d880: 75 6d 70 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ump tables match
d890: 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20     LIKE pattern 
d8c0: 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63  TABLE.\n".  ".ec
d8d0: 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ho on|off       
d8e0: 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64      Turn command
d8f0: 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c   echo on or off\
d900: 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66  n".  ".eqp on|of
d910: 66 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61  f            Ena
d920: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61  ble or disable a
d930: 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e  utomatic EXPLAIN
d940: 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20   QUERY PLAN\n". 
d950: 20 22 2e 65 78 69 74 20 20 20 20 20 20 20 20 20   ".exit         
d960: 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
d970: 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
d980: 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66  ".explain ?on|of
d990: 66 3f 20 20 20 20 20 20 54 75 72 6e 20 6f 75 74  f?      Turn out
d9a0: 70 75 74 20 6d 6f 64 65 20 73 75 69 74 61 62 6c  put mode suitabl
d9b0: 65 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e  e for EXPLAIN on
d9c0: 20 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 20   or off.\n".  " 
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 57 69 74 68 20 6e 6f 20          With no 
d9f0: 61 72 67 73 2c 20 69 74 20 74 75 72 6e 73 20 45  args, it turns E
da00: 58 50 4c 41 49 4e 20 6f 6e 2e 5c 6e 22 0a 20 20  XPLAIN on.\n".  
da10: 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 20 20 20  ".fullschema    
da20: 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 63 68          Show sch
da30: 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ema and the cont
da40: 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  ent of sqlite_st
da50: 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22  at tables\n".  "
da60: 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20  .headers on|off 
da70: 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70         Turn disp
da80: 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
da90: 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
daa0: 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20  help            
dab0: 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73 20        Show this 
dac0: 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69  message\n".  ".i
dad0: 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45  mport FILE TABLE
dae0: 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61       Import data
daf0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20   from FILE into 
db00: 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e 64  TABLE\n".  ".ind
db10: 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  exes ?TABLE?    
db20: 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66     Show names of
db30: 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22 0a   all indexes\n".
db40: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
db50: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
db60: 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
db70: 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78 65  only show indexe
db80: 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a  s for tables\n".
db90: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
dbb0: 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
dbc0: 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64  n TABLE.\n".#ifd
dbd0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dbe0: 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74  _IOTRACE.  ".iot
dbf0: 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20 20  race FILE       
dc00: 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69     Enable I/O di
dc10: 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67  agnostic logging
dc20: 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64   to FILE\n".#end
dc30: 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49  if.  ".limit ?LI
dc40: 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69 73  MIT? ?VAL?   Dis
dc50: 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74  play or change t
dc60: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53  he value of an S
dc70: 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a 23  QLITE_LIMIT\n".#
dc80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dc90: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
dca0: 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20  N.  ".load FILE 
dcb0: 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64  ?ENTRY?     Load
dcc0: 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69   an extension li
dcd0: 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a  brary\n".#endif.
dce0: 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66    ".log FILE|off
dcf0: 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c            Turn l
dd00: 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  ogging on or off
dd10: 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73  .  FILE can be s
dd20: 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a  tderr/stdout\n".
dd30: 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54    ".mode MODE ?T
dd40: 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75  ABLE?     Set ou
dd50: 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20  tput mode where 
dd60: 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c  MODE is one of:\
dd70: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
dd90: 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f  scii    Columns/
dda0: 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62  rows delimited b
ddb0: 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c  y 0x1F and 0x1E\
ddc0: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
dde0: 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
ddf0: 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e  parated values\n
de00: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
de20: 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
de30: 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
de40: 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20  ee .width)\n".  
de50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
de60: 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20            html  
de70: 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20     HTML <table> 
de80: 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20  code\n".  "     
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c      insert   SQL
deb0: 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e   insert statemen
dec0: 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a  ts for TABLE\n".
ded0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
def0: 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70       One value p
df00: 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20  er line\n".  "  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20         list     
df30: 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64  Values delimited
df40: 20 62 79 20 2e 73 65 70 61 72 61 74 6f 72 20 73   by .separator s
df50: 74 72 69 6e 67 73 5c 6e 22 0a 20 20 22 20 20 20  trings\n".  "   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54        tabs     T
df80: 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ab-separated val
df90: 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20     tcl      TCL 
dfc0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22  list elements\n"
dfd0: 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53  .  ".nullvalue S
dfe0: 54 52 49 4e 47 20 20 20 20 20 20 55 73 65 20 53  TRING      Use S
dff0: 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
e000: 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22  f NULL values\n"
e010: 0a 20 20 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41  .  ".once FILENA
e020: 4d 45 20 20 20 20 20 20 20 20 20 4f 75 74 70 75  ME         Outpu
e030: 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53  t for the next S
e040: 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20  QL command only 
e050: 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20  to FILENAME\n". 
e060: 20 22 2e 6f 70 65 6e 20 3f 46 49 4c 45 4e 41 4d   ".open ?FILENAM
e070: 45 3f 20 20 20 20 20 20 20 43 6c 6f 73 65 20 65  E?       Close e
e080: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
e090: 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45   and reopen FILE
e0a0: 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70  NAME\n".  ".outp
e0b0: 75 74 20 3f 46 49 4c 45 4e 41 4d 45 3f 20 20 20  ut ?FILENAME?   
e0c0: 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
e0d0: 20 46 49 4c 45 4e 41 4d 45 20 6f 72 20 73 74 64   FILENAME or std
e0e0: 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74  out\n".  ".print
e0f0: 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20   STRING...      
e100: 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53   Print literal S
e110: 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f  TRING\n".  ".pro
e120: 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
e130: 45 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73  E  Replace the s
e140: 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c  tandard prompts\
e150: 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20  n".  ".quit     
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
e170: 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
e180: 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e  ".  ".read FILEN
e190: 41 4d 45 20 20 20 20 20 20 20 20 20 45 78 65 63  AME         Exec
e1a0: 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e  ute SQL in FILEN
e1b0: 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f  AME\n".  ".resto
e1c0: 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
e1d0: 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
e1e0: 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
e1f0: 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
e200: 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20  ILE\n".  ".save 
e210: 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
e220: 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79   Write in-memory
e230: 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46   database into F
e240: 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73  ILE\n".  ".scans
e250: 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  tats on|off     
e260: 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74   Turn sqlite3_st
e270: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
e280: 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66  metrics on or of
e290: 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20  f\n".  ".schema 
e2a0: 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53  ?TABLE?        S
e2b0: 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73  how the CREATE s
e2c0: 74 61 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22  tatements\n".  "
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
e2f0: 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
e300: 79 20 73 68 6f 77 20 74 61 62 6c 65 73 20 6d 61  y show tables ma
e310: 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
e340: 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
e350: 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f  .separator COL ?
e360: 52 4f 57 3f 20 20 20 43 68 61 6e 67 65 20 74 68  ROW?   Change th
e370: 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
e380: 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c  or and optionall
e390: 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22  y the row\n".  "
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 20 20 73 65 70 61 72 61 74           separat
e3c0: 6f 72 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  or for both the 
e3d0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20  output mode and 
e3e0: 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e 73  .import\n".  ".s
e3f0: 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e  hell CMD ARGS...
e400: 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47       Run CMD ARG
e410: 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
e420: 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68   shell\n".  ".sh
e430: 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
e440: 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72      Show the cur
e450: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
e460: 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73  various settings
e470: 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 6f 6e  \n".  ".stats on
e480: 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75  |off          Tu
e490: 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f  rn stats on or o
e4a0: 66 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d  ff\n".  ".system
e4b0: 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
e4c0: 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
e4d0: 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
e4e0: 6c 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20  l\n".  ".tables 
e4f0: 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c  ?TABLE?        L
e500: 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
e510: 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
e540: 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74  ified, only list
e550: 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
e560: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
e590: 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f  LE.\n".  ".timeo
e5a0: 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
e5b0: 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
e5c0: 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
e5d0: 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e  S milliseconds\n
e5e0: 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f  ".  ".timer on|o
e5f0: 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
e600: 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72   SQL timer on or
e610: 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63   off\n".  ".trac
e620: 65 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  e FILE|off      
e630: 20 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51    Output each SQ
e640: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
e650: 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e  t is run\n".  ".
e660: 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20  vfsname ?AUX?   
e670: 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20        Print the 
e680: 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
e690: 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64  stack\n".  ".wid
e6a0: 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
e6b0: 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69     Set column wi
e6c0: 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d  dths for \"colum
e6d0: 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20  n\" mode\n".  " 
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 20 4e 65 67 61 74 69 76 65          Negative
e700: 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
e710: 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46  stify\n".;../* F
e720: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
e730: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
e740: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65  rocess_input(She
e750: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45  llState *p, FILE
e760: 20 2a 69 6e 29 3b 0a 2f 2a 0a 2a 2a 20 49 6d 70   *in);./*.** Imp
e770: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
e780: 68 65 20 22 72 65 61 64 66 69 6c 65 28 58 29 22  he "readfile(X)"
e790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
e7a0: 54 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  The entire conte
e7b0: 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  nt.** of the fil
e7c0: 65 20 6e 61 6d 65 64 20 58 20 69 73 20 72 65 61  e named X is rea
e7d0: 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 61  d and returned a
e7e0: 73 20 61 20 42 4c 4f 42 2e 20 20 4e 55 4c 4c 20  s a BLOB.  NULL 
e7f0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
e800: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
e810: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20  not exist or is 
e820: 75 6e 72 65 61 64 61 62 6c 65 2e 0a 2a 2f 0a 73  unreadable..*/.s
e830: 74 61 74 69 63 20 76 6f 69 64 20 72 65 61 64 66  tatic void readf
e840: 69 6c 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ileFunc(.  sqlit
e850: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
e860: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
e870: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
e880: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
e890: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
e8a0: 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 6c 6f    FILE *in;.  lo
e8b0: 6e 67 20 6e 49 6e 3b 0a 20 20 76 6f 69 64 20 2a  ng nIn;.  void *
e8c0: 70 42 75 66 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  pBuf;..  UNUSED_
e8d0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
e8e0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  .  zName = (cons
e8f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
e900: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
e910: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  0]);.  if( zName
e920: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e930: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65  in = fopen(zName
e940: 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
e950: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
e960: 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45   fseek(in, 0, SE
e970: 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d  EK_END);.  nIn =
e980: 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
e990: 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66  wind(in);.  pBuf
e9a0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
e9b0: 63 36 34 28 20 6e 49 6e 20 29 3b 0a 20 20 69 66  c64( nIn );.  if
e9c0: 28 20 70 42 75 66 20 26 26 20 31 3d 3d 66 72 65  ( pBuf && 1==fre
e9d0: 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c  ad(pBuf, nIn, 1,
e9e0: 20 69 6e 29 20 29 7b 0a 20 20 20 20 73 71 6c 69   in) ){.    sqli
e9f0: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
ea00: 63 6f 6e 74 65 78 74 2c 20 70 42 75 66 2c 20 6e  context, pBuf, n
ea10: 49 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  In, sqlite3_free
ea20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ea30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
ea40: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
ea50: 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  (in);.}../*.** I
ea60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
ea70: 20 74 68 65 20 22 77 72 69 74 65 66 69 6c 65 28   the "writefile(
ea80: 58 2c 59 29 22 20 53 51 4c 20 66 75 6e 63 74 69  X,Y)" SQL functi
ea90: 6f 6e 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  on.  The argumen
eaa0: 74 20 59 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  t Y.** is writte
eab0: 6e 20 69 6e 74 6f 20 66 69 6c 65 20 58 2e 20 20  n into file X.  
eac0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
ead0: 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 20 72  tes written is r
eae0: 65 74 75 72 6e 65 64 2e 20 20 4f 72 0a 2a 2a 20  eturned.  Or.** 
eaf0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
eb00: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
eb10: 65 73 20 77 72 6f 6e 67 2c 20 73 75 63 68 20 61  es wrong, such a
eb20: 73 20 62 65 69 6e 67 20 75 6e 61 62 6c 65 20 74  s being unable t
eb30: 6f 20 6f 70 65 6e 0a 2a 2a 20 66 69 6c 65 20 58  o open.** file X
eb40: 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2f   for writing..*/
eb50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69  .static void wri
eb60: 74 65 66 69 6c 65 46 75 6e 63 28 0a 20 20 73 71  tefileFunc(.  sq
eb70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
eb80: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
eb90: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
eba0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
ebb0: 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 63 6f 6e  FILE *out;.  con
ebc0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71  st char *z;.  sq
ebd0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 63 3b 0a  lite3_int64 rc;.
ebe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
ebf0: 69 6c 65 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  ile;..  UNUSED_P
ec00: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
ec10: 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74    zFile = (const
ec20: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
ec30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
ec40: 5d 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d  ]);.  if( zFile=
ec50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
ec60: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  ut = fopen(zFile
ec70: 2c 20 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  , "wb");.  if( o
ec80: 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ut==0 ) return;.
ec90: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61    z = (const cha
eca0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
ecb0: 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a  _blob(argv[1]);.
ecc0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
ecd0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    rc = 0;.  }els
ece0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 77 72 69  e{.    rc = fwri
ecf0: 74 65 28 7a 2c 20 31 2c 20 73 71 6c 69 74 65 33  te(z, 1, sqlite3
ed00: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
ed10: 76 5b 31 5d 29 2c 20 6f 75 74 29 3b 0a 20 20 7d  v[1]), out);.  }
ed20: 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
ed30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ed40: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
ed50: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  rc);.}../*.** Ma
ed60: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
ed70: 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49  base is open.  I
ed80: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
ed90: 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a  n open it.  If.*
eda0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
edb0: 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72  ails to open, pr
edc0: 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
edd0: 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a  sage and exit..*
ede0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70  /.static void op
edf0: 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65  en_db(ShellState
ee00: 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69   *p, int keepAli
ee10: 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  ve){.  if( p->db
ee20: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ee30: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
ee40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  .    sqlite3_ope
ee50: 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
ee60: 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 67  , &p->db);.    g
ee70: 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b  lobalDb = p->db;
ee80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 26  .    if( p->db &
ee90: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
eea0: 65 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45  e(p->db)==SQLITE
eeb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
eec0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
eed0: 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
eee0: 6c 6c 73 74 61 74 69 63 22 2c 20 30 2c 20 53 51  llstatic", 0, SQ
eef0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
ef00: 20 20 20 20 20 20 20 20 73 68 65 6c 6c 73 74 61          shellsta
ef10: 74 69 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ticFunc, 0, 0);.
ef20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
ef30: 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  >db==0 || SQLITE
ef40: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
ef50: 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
ef60: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
ef70: 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62  err,"Error: unab
ef80: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
ef90: 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e  ase \"%s\": %s\n
efa0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ", .          p-
efb0: 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
efc0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
efd0: 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
efe0: 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75  keepAlive ) retu
eff0: 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  rn;.      exit(1
f000: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
f010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
f020: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
f030: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
f040: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
f050: 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
f060: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
f070: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
f080: 62 2c 20 22 72 65 61 64 66 69 6c 65 22 2c 20 31  b, "readfile", 1
f090: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
f0a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
f0c0: 61 64 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30  adfileFunc, 0, 0
f0d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
f0e0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
f0f0: 2d 3e 64 62 2c 20 22 77 72 69 74 65 66 69 6c 65  ->db, "writefile
f100: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
f110: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 77 72 69 74 65 66 69 6c 65 46 75 6e 63 2c    writefileFunc,
f140: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
f150: 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61  *.** Do C-langua
f160: 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69  ge style dequoti
f170: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20  ng..**.**    \a 
f180: 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20     -> alarm.**  
f190: 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73    \b    -> backs
f1a0: 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20  pace.**    \t   
f1b0: 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e   -> tab.**    \n
f1c0: 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a      -> newline.*
f1d0: 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65  *    \v    -> ve
f1e0: 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20  rtical tab.**   
f1f0: 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66   \f    -> form f
f200: 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20  eed.**    \r    
f210: 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75  -> carriage retu
f220: 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d  rn.**    \s    -
f230: 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22  > space.**    \"
f240: 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c      -> ".**    \
f250: 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20  '    -> '.**    
f260: 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61  \\    -> backsla
f270: 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d  sh.**    \NNN  -
f280: 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65  > ascii characte
f290: 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a  r NNN in octal.*
f2a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
f2b0: 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
f2c0: 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
f2d0: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
f2e0: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26  ;.  while( *z &&
f2f0: 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b   *z!='\\' ) z++;
f300: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
f310: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
f320: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
f330: 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31  c=='\\' && z[i+1
f340: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20  ]!=0 ){.      c 
f350: 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  = z[++i];.      
f360: 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20  if( c=='a' ){.  
f370: 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a        c = '\a';.
f380: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f390: 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  c=='b' ){.      
f3a0: 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20    c = '\b';.    
f3b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
f3c0: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  t' ){.        c 
f3d0: 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65  = '\t';.      }e
f3e0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29  lse if( c=='n' )
f3f0: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
f400: 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n';.      }else 
f410: 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20  if( c=='v' ){.  
f420: 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a        c = '\v';.
f430: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f440: 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
f450: 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
f460: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
f470: 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  r' ){.        c 
f480: 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65  = '\r';.      }e
f490: 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
f4a0: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22  {.        c = '"
f4b0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
f4c0: 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
f4d0: 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a        c = '\'';.
f4e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f4f0: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
f500: 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20     c = '\\';.   
f510: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
f520: 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
f530: 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
f540: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
f550: 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
f560: 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
f570: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
f580: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
f590: 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
f5a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
f5b0: 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
f5c0: 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
f5d0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
f5e0: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
f5f0: 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
f600: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f620: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
f630: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69  c;.  }.  if( j<i
f640: 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a   ) z[j] = 0;.}..
f650: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f660: 20 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61   value of a hexa
f670: 64 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20  decimal digit.  
f680: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
f690: 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74   input.** is not
f6a0: 20 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f   a hex digit..*/
f6b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44  .static int hexD
f6c0: 69 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63  igitValue(char c
f6d0: 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20  ){.  if( c>='0' 
f6e0: 26 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75  && c<='9' ) retu
f6f0: 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66  rn c - '0';.  if
f700: 28 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27  ( c>='a' && c<='
f710: 66 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20  f' ) return c - 
f720: 27 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20  'a' + 10;.  if( 
f730: 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27  c>='A' && c<='F'
f740: 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41   ) return c - 'A
f750: 27 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e  ' + 10;.  return
f760: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   -1;.}../*.** In
f770: 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
f780: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
f790: 2c 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20  , possibly with 
f7a0: 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61  suffixes..*/.sta
f7b0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
f7c0: 34 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63  4 integerValue(c
f7d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
f7e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
f7f0: 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  4 v = 0;.  stati
f800: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
f810: 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20   char *zSuffix; 
f820: 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75  int iMult; } aMu
f830: 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  lt[] = {.    { "
f840: 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20  KiB", 1024 },.  
f850: 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a    { "MiB", 1024*
f860: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47  1024 },.    { "G
f870: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31  iB", 1024*1024*1
f880: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42  024 },.    { "KB
f890: 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ",  1000 },.    
f8a0: 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30  { "MB",  1000000
f8b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20   },.    { "GB", 
f8c0: 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
f8d0: 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30     { "K",   1000
f8e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20   },.    { "M",  
f8f0: 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
f900: 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30  { "G",   1000000
f910: 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  000 },.  };.  in
f920: 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67  t i;.  int isNeg
f930: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67   = 0;.  if( zArg
f940: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
f950: 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a  isNeg = 1;.    z
f960: 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  Arg++;.  }else i
f970: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20  f( zArg[0]=='+' 
f980: 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  ){.    zArg++;. 
f990: 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d   }.  if( zArg[0]
f9a0: 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
f9b0: 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='x' ){.    int
f9c0: 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20   x;.    zArg += 
f9d0: 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78  2;.    while( (x
f9e0: 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65   = hexDigitValue
f9f0: 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b  (zArg[0]))>=0 ){
fa00: 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34  .      v = (v<<4
fa10: 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72  ) + x;.      zAr
fa20: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
fa30: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49  se{.    while( I
fa40: 73 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20  sDigit(zArg[0]) 
fa50: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31  ){.      v = v*1
fa60: 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30  0 + zArg[0] - '0
fa70: 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b  ';.      zArg++;
fa80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
fa90: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
faa0: 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a  e(aMult); i++){.
fab0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
fac0: 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d  stricmp(aMult[i]
fad0: 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d  .zSuffix, zArg)=
fae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d  =0 ){.      v *=
faf0: 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b   aMult[i].iMult;
fb00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fb10: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fb20: 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a   isNeg? -v : v;.
fb30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
fb40: 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
fb50: 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
fb60: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
fb70: 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
fb80: 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
fb90: 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
fba0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
fbb0: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
fbc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
fbd0: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68 61 72  ooleanValue(char
fbe0: 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *zArg){.  int i
fbf0: 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  ;.  if( zArg[0]=
fc00: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
fc10: 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28  ='x' ){.    for(
fc20: 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c  i=2; hexDigitVal
fc30: 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20  ue(zArg[i])>=0; 
fc40: 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a  i++){}.  }else{.
fc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72      for(i=0; zAr
fc60: 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72  g[i]>='0' && zAr
fc70: 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b  g[i]<='9'; i++){
fc80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20  }.  }.  if( i>0 
fc90: 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20  && zArg[i]==0 ) 
fca0: 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74  return (int)(int
fcb0: 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20  egerValue(zArg) 
fcc0: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
fcd0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
fce0: 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29  icmp(zArg, "on")
fcf0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
fd00: 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73  tricmp(zArg,"yes
fd10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
fd20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
fd30: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
fd40: 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30  (zArg, "off")==0
fd50: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
fd60: 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d  cmp(zArg,"no")==
fd70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fd80: 30 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  0;.  }.  fprintf
fd90: 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
fda0: 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76   Not a boolean v
fdb0: 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73  alue: \"%s\". As
fdc0: 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e  suming \"no\".\n
fdd0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72  ",.          zAr
fde0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  g);.  return 0;.
fdf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
fe00: 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61  n output file, a
fe10: 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f  ssuming it is no
fe20: 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f  t stderr or stdo
fe30: 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
fe40: 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c  d output_file_cl
fe50: 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  ose(FILE *f){.  
fe60: 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f  if( f && f!=stdo
fe70: 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20  ut && f!=stderr 
fe80: 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a  ) fclose(f);.}..
fe90: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65  /*.** Try to ope
fea0: 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  n an output file
feb0: 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73  .   The names "s
fec0: 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65  tdout" and "stde
fed0: 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67  rr" are.** recog
fee0: 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65  nized and do the
fef0: 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e   right thing.  N
ff00: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
ff10: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 0a 2a  if the output .*
ff20: 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f  * filename is "o
ff30: 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ff"..*/.static F
ff40: 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65  ILE *output_file
ff50: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
ff60: 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45   *zFile){.  FILE
ff70: 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d   *f;.  if( strcm
ff80: 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22  p(zFile,"stdout"
ff90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
ffa0: 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  stdout;.  }else 
ffb0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ffc0: 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29  , "stderr")==0 )
ffd0: 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72  {.    f = stderr
ffe0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
fff0: 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66  rcmp(zFile, "off
10000 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
10010 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
10020 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65   f = fopen(zFile
10030 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28  , "wb");.    if(
10040 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66   f==0 ){.      f
10050 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10060 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
10070 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
10080 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
10090 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 2f    return f;.}../
100a0 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
100b0 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
100c0 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
100d0 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
100e0 69 63 20 76 6f 69 64 20 73 71 6c 5f 74 72 61 63  ic void sql_trac
100f0 65 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  e_callback(void 
10100 2a 70 41 72 67 2c 20 63 6f 6e 73 74 20 63 68 61  *pArg, const cha
10110 72 20 2a 7a 29 7b 0a 20 20 46 49 4c 45 20 2a 66  r *z){.  FILE *f
10120 20 3d 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a   = (FILE*)pArg;.
10130 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20 69    if( f ){.    i
10140 6e 74 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt i = (int)strl
10150 65 6e 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65  en(z);.    while
10160 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d  ( i>0 && z[i-1]=
10170 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  =';' ){ i--; }. 
10180 20 20 20 66 70 72 69 6e 74 66 28 66 2c 20 22 25     fprintf(f, "%
10190 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a  .*s;\n", i, z);.
101a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e    }.}../*.** A n
101b0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61  o-op routine tha
101c0 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20  t runs with the 
101d0 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f  ".breakpoint" do
101e0 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73  c-command.  This
101f0 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20   is.** a useful 
10200 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65  spot to set a de
10210 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
10220 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
10230 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
10240 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
10250 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b  c int nCall = 0;
10260 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f  .  nCall++;.}../
10270 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75  *.** An object u
10280 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53  sed to read a CS
10290 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65  V and other file
102a0 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f  s for import..*/
102b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
102c0 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74  ImportCtx Import
102d0 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f  Ctx;.struct Impo
102e0 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20  rtCtx {.  const 
102f0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a  char *zFile;  /*
10300 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   Name of the inp
10310 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c  ut file */.  FIL
10320 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
10330 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56   /* Read the CSV
10340 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20   text from this 
10350 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  input stream */.
10360 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
10370 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c        /* Accumul
10380 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20  ated text for a 
10390 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
103a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
103b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
103c0 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20  s in z */.  int 
103d0 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
103e0 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
103f0 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20  ed for z[] */.  
10400 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20  int nLine;      
10410 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
10420 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
10430 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20  int cTerm;      
10440 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72      /* Character
10450 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64   that terminated
10460 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10470 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
10480 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20  cColSep;        
10490 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65  /* The column se
104a0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
104b0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22  r.  (Usually ","
104c0 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53  ) */.  int cRowS
104d0 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
104e0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  e row separator 
104f0 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
10500 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b  ally "\n") */.};
10510 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69  ../* Append a si
10520 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d  ngle byte to z[]
10530 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
10540 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
10550 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c  ar(ImportCtx *p,
10560 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70   int c){.  if( p
10570 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  ->n+1>=p->nAlloc
10580 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
10590 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  c += p->nAlloc +
105a0 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d   100;.    p->z =
105b0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
105c0 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  64(p->z, p->nAll
105d0 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
105e0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  z==0 ){.      fp
105f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
10600 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
10610 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
10620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
10630 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61  z[p->n++] = (cha
10640 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  r)c;.}../* Read 
10650 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
10660 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d  f CSV text.  Com
10670 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63  patible with rfc
10680 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65  4180 and extende
10690 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70  d.** with the op
106a0 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61  tion of having a
106b0 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72   separator other
106c0 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a   than ","..**.**
106d0 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
106e0 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
106f0 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
10700 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
10710 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
10720 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
10730 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
10740 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
10750 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
10760 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
10770 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
10780 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
10790 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20   is ","..**   + 
107a0 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
107b0 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
107c0 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
107d0 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20  is "\n"..**   + 
107e0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
107f0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
10800 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
10810 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
10820 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
10830 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
10840 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
10850 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
10860 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
10870 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
10880 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
10890 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
108a0 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
108b0 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f  CDECL csv_read_o
108c0 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
108d0 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
108e0 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
108f0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
10900 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
10910 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
10920 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
10930 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
10940 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
10950 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
10960 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
10970 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
10980 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
10990 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69  t pc, ppc;.    i
109a0 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70  nt startLine = p
109b0 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74  ->nLine;.    int
109c0 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20   cQuote = c;.   
109d0 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20   pc = ppc = 0;. 
109e0 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
109f0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
10a00 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
10a10 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c   c==rSep ) p->nL
10a20 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
10a30 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20   c==cQuote ){.  
10a40 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
10a50 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
10a60 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    pc = 0;.      
10a70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10a90 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53        if( (c==cS
10aa0 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
10ab0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
10ac0 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  rSep && pc==cQuo
10ad0 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
10ae0 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c  ==rSep && pc=='\
10af0 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74  r' && ppc==cQuot
10b00 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
10b10 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f  =EOF && pc==cQuo
10b20 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  te).      ){.   
10b30 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b       do{ p->n--;
10b40 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d   }while( p->z[p-
10b50 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20  >n]!=cQuote );. 
10b60 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
10b70 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
10b80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10b90 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
10ba0 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20   && c!='\r' ){. 
10bb0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
10bc0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
10bd0 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72  nescaped %c char
10be0 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20  acter\n",.      
10bf0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
10c00 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51  le, p->nLine, cQ
10c10 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uote);.      }. 
10c20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20       if( c==EOF 
10c30 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
10c40 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
10c50 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  d: unterminated 
10c60 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c  %c-quoted field\
10c70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10c80 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74      p->zFile, st
10c90 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  artLine, cQuote)
10ca0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65  ;.        p->cTe
10cb0 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  rm = c;.        
10cc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10cd0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
10ce0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
10cf0 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20       ppc = pc;. 
10d00 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
10d10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10d20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
10d30 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
10d40 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  Sep ){.      imp
10d50 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
10d60 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
10d70 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
10d80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
10d90 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  rSep ){.      p-
10da0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20  >nLine++;.      
10db0 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d  if( p->n>0 && p-
10dc0 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27  >z[p->n-1]=='\r'
10dd0 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d   ) p->n--;.    }
10de0 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
10df0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  c;.  }.  if( p->
10e00 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  z ) p->z[p->n] =
10e10 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
10e20 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
10e30 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
10e40 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
10e50 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
10e60 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
10e70 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
10e80 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
10e90 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
10ea0 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
10eb0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
10ec0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
10ed0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
10ee0 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
10ef0 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
10f00 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
10f10 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
10f20 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
10f30 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
10f40 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
10f50 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
10f60 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
10f70 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
10f80 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
10f90 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
10fa0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
10fb0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
10fc0 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
10fd0 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
10fe0 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
10ff0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
11000 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
11010 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
11020 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
11030 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
11040 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
11050 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
11060 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
11070 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
11080 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
11090 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
110a0 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
110b0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
110c0 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
110d0 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
110e0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
110f0 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
11100 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
11110 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
11120 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
11130 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
11140 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
11150 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
11160 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
11170 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
11180 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
11190 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
111a0 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
111b0 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
111c0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
111d0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
111e0 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
111f0 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
11200 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
11210 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
11220 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
11230 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
11240 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
11250 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
11260 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
11270 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
11280 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
11290 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
112a0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
112b0 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
112c0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
112d0 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
112e0 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
112f0 20 3d 20 30 3b 20 0a 20 20 73 71 6c 69 74 65 33   = 0; .  sqlite3
11300 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
11310 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
11320 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
11330 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  zInsert = 0;.  i
11340 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
11350 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62  j, n;.  int nTab
11360 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  le = (int)strlen
11370 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20  (zTable);.  int 
11380 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74  k = 0;.  int cnt
11390 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e   = 0;.  const in
113a0 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30 30  t spinRate = 100
113b0 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20  00;..  zQuery = 
113c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
113d0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
113e0 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b  "%w\"", zTable);
113f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11400 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
11410 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
11420 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28  Query, 0);.  if(
11430 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e   rc ){.    fprin
11440 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
11450 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
11460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11470 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
11480 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
11490 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
114a0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
114b0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
114c0 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
114d0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
114e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
114f0 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
11500 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
11510 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
11520 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
11530 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
11540 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
11550 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20  stderr, "out of 
11560 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
11570 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66  goto end_data_xf
11580 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  er;.  }.  sqlite
11590 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e  3_snprintf(200+n
115a0 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20  Table,zInsert,. 
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
115d0 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20  ORE INTO \"%s\" 
115e0 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
115f0 65 29 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73  e);.  i = (int)s
11600 74 72 6c 65 6e 28 7a 49 6e 73 65 72 74 29 3b 0a  trlen(zInsert);.
11610 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20    for(j=1; j<n; 
11620 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  j++){.    memcpy
11630 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22  (zInsert+i, ",?"
11640 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32  , 2);.    i += 2
11650 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a  ;.  }.  memcpy(z
11660 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20  Insert+i, ");", 
11670 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  3);.  rc = sqlit
11680 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65  e3_prepare_v2(ne
11690 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31  wDb, zInsert, -1
116a0 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a  , &pInsert, 0);.
116b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
116c0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
116d0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
116e0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
116f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
11700 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
11710 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
11720 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
11730 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
11740 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
11750 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
11760 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
11770 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
11780 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
11790 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
117a0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
117b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
117c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
117d0 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
117e0 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
117f0 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
11800 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
11810 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
11820 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
11830 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
11840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
11850 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
11860 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
11870 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
11880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
11890 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
118a0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
118b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
118c0 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
118d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
118e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
118f0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
11900 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
11910 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11920 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
11930 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
11940 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
11950 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
11960 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11980 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
11990 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
119a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
119b0 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
119c0 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
119f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
11a00 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
11a30 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
11a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11a50 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
11a60 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
11a70 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
11a80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11a90 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
11aa0 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
11ab0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
11ac0 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
11b00 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
11b10 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
11b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11b60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
11b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11b80 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
11b90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11ba0 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
11bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11bc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
11bd0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
11be0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11bf0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
11c00 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
11c10 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69   %d: %s\n", sqli
11c20 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
11c30 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20  code(newDb),.   
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
11c60 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20  msg(newDb));.   
11c70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11c80 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
11c90 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  );.      cnt++;.
11ca0 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73        if( (cnt%s
11cb0 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20  pinRate)==0 ){. 
11cc0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
11cd0 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63  c\b", "|/-\\"[(c
11ce0 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29  nt/spinRate)%4])
11cf0 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
11d00 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
11d10 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77  }.    } /* End w
11d20 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  hile */.    if( 
11d30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
11d40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
11d50 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
11d60 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
11d70 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
11d80 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
11d90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
11da0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
11db0 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77  w\" ORDER BY row
11dc0 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20  id DESC;",.     
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b          zTable);
11df0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11e00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
11e10 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
11e20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
11e30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11e40 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
11e50 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f   "Warning: canno
11e60 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61  t step \"%s\" ba
11e70 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65  ckwards", zTable
11e80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11e90 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
11ea0 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a   for(k=0...) */.
11eb0 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a  .end_data_xfer:.
11ec0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
11ed0 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
11ee0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11ef0 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74  Insert);.  sqlit
11f00 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
11f10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11f20 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a  zInsert);.}.../*
11f30 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73  .** Try to trans
11f40 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  fer all rows of 
11f50 74 68 65 20 73 63 68 65 6d 61 20 74 68 61 74 20  the schema that 
11f60 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46  match zWhere.  F
11f70 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20  or.** each row, 
11f80 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28  invoke xForEach(
11f90 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  ) on the object 
11fa0 64 65 66 69 6e 65 64 20 62 79 20 74 68 61 74 20  defined by that 
11fb0 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  row..** If an er
11fc0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
11fd0 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20  ed while moving 
11fe0 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67 68 20  forward through 
11ff0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  the.** sqlite_ma
12000 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20  ster table, try 
12010 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63  again moving bac
12020 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  kwards..*/.stati
12030 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
12040 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c  eSchema(.  Shell
12050 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
12060 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
12070 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
12080 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45  ,.  void (*xForE
12090 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a  ach)(ShellState*
120a0 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20  ,sqlite3*,const 
120b0 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
120c0 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
120d0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
120e0 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  uery = 0;.  int 
120f0 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  rc;.  const unsi
12100 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65  gned char *zName
12110 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
12120 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  ed char *zSql;. 
12130 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
12140 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20   0;..  zQuery = 
12150 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12160 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
12170 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
12180 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57   " WHERE %s", zW
121b0 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  here);.  rc = sq
121c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
121d0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
121e0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
121f0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12200 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12210 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
12220 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
12250 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
12260 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
12270 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
12290 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
122a0 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
122b0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63    }.  while( (rc
122c0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
122d0 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
122e0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  _ROW ){.    zNam
122f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
12300 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
12310 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0);.    zSql = s
12320 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
12330 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20  xt(pQuery, 1);. 
12340 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
12350 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
12360 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
12370 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
12380 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
12390 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
123a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
123b0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
123c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
123d0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
123e0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
123f0 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
12400 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
12410 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
12420 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
12430 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
12440 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
12450 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
12460 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
12470 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
12480 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
12490 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
124a0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
124b0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
124c0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
124d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
124e0 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
124f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12500 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
12510 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
12520 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
12550 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
12560 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
12570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
12580 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
12590 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
125a0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
125b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70  ( rc ){.      fp
125c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
125d0 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
125e0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
12610 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
12620 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12630 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51                zQ
12650 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74  uery);.      got
12660 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  o end_schema_xfe
12670 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  r;.    }.    whi
12680 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
12690 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
126a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
126b0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
126c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
126d0 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
126e0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
126f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
12700 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  uery, 1);.      
12710 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
12720 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
12730 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73  stdout);.      s
12740 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
12750 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
12760 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
12770 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
12780 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
12790 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
127a0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
127b0 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
127c0 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
127d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
127e0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
127f0 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30       zErrMsg = 0
12800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12810 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
12820 20 20 20 20 20 20 20 20 78 46 6f 72 45 61 63 68          xForEach
12830 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
12840 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
12850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
12860 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a  intf("done\n");.
12870 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63      }.  }.end_sc
12880 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  hema_xfer:.  sql
12890 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
128a0 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
128b0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d  _free(zQuery);.}
128c0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
128d0 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
128e0 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e   named "zNewDb".
128f0 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72    Try to recover
12900 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61   as much informa
12910 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69  tion.** as possi
12920 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ble out of the m
12930 61 69 6e 20 64 61 74 61 62 61 73 65 20 28 77 68  ain database (wh
12940 69 63 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72  ich might be cor
12950 72 75 70 74 29 20 61 6e 64 20 77 72 69 74 65 20  rupt) and write 
12960 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44  it.** into zNewD
12970 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
12980 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65  d tryToClone(She
12990 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
129a0 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b  t char *zNewDb){
129b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
129c0 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b  ite3 *newDb = 0;
129d0 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e  .  if( access(zN
129e0 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  ewDb,0)==0 ){.  
129f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12a00 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61  , "File \"%s\" a
12a10 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e  lready exists.\n
12a20 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20  ", zNewDb);.    
12a30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
12a40 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
12a50 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b  zNewDb, &newDb);
12a60 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12a70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12a80 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
12a90 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
12aa0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
12ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
12ac0 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
12ad0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12ae0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
12af0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
12b00 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
12b10 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12b20 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
12b30 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
12b40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
12b50 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
12b60 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
12b70 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
12b80 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
12b90 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
12ba0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
12bb0 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
12bc0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
12bd0 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
12be0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12bf0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
12c00 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
12c10 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
12c20 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
12c30 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
12c40 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (newDb);.}../*.*
12c50 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74  * Change the out
12c60 70 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  put file back to
12c70 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69   stdout.*/.stati
12c80 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
12c90 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
12ca0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
12cb0 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
12cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12cd0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
12ce0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
12cf0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
12d00 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
12d10 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d  ose(p->out);.  }
12d20 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  .  p->outfile[0]
12d30 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d   = 0;.  p->out =
12d40 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   stdout;.}../*.*
12d50 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d  * Run an SQL com
12d60 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  mand and return 
12d70 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67  the single integ
12d80 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  er result..*/.st
12d90 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28  atic int db_int(
12da0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
12db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
12dc0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12dd0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
12de0 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  es = 0;.  sqlite
12df0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
12e00 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
12e10 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
12e20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
12e30 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
12e40 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
12e50 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  res = sqlite3_co
12e60 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
12e70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12e80 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12e90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
12eb0 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62   a 2-byte or 4-b
12ec0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
12ed0 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61  nteger into a na
12ee0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
12ef0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
12f00 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  2byteInt(unsigne
12f10 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
12f20 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b  turn (a[0]<<8) +
12f30 20 61 5b 31 5d 3b 0a 7d 0a 75 6e 73 69 67 6e 65   a[1];.}.unsigne
12f40 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e  d int get4byteIn
12f50 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t(unsigned char 
12f60 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  *a){.  return (a
12f70 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d  [0]<<24) + (a[1]
12f80 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38  <<16) + (a[2]<<8
12f90 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a  ) + a[3];.}../*.
12fa0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
12fb0 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22  n of the ".info"
12fc0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
12fd0 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f  Return 1 on erro
12fe0 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e  r, 2 to exit, an
12ff0 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  d 0 otherwise..*
13000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
13010 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e  ll_dbinfo_comman
13020 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  d(ShellState *p,
13030 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
13040 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74  **azArg){.  stat
13050 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
13060 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
13070 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d  ame; int ofst; }
13080 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20   aField[] = {.  
13090 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67     { "file chang
130a0 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34  e counter:",  24
130b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74    },.     { "dat
130c0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
130d0 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20  :",  28  },.    
130e0 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61 67   { "freelist pag
130f0 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20  e count:",  36  
13100 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
13110 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20  a cookie:",     
13120 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b     40  },.     {
13130 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a   "schema format:
13140 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c  ",        44  },
13150 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74  .     { "default
13160 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20   cache size:",  
13170 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   48  },.     { "
13180 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72  autovacuum top r
13190 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20  oot:",  52  },. 
131a0 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74      { "increment
131b0 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36  al vacuum:",   6
131c0 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65  4  },.     { "te
131d0 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20  xt encoding:",  
131e0 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20        56  },.   
131f0 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f    { "user versio
13200 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30 20  n:",         60 
13210 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c   },.     { "appl
13220 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20  ication id:",   
13230 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20      68  },.     
13240 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72 73  { "software vers
13250 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d  ion:",     96  }
13260 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
13270 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
13280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
13290 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  ; const char *zS
132a0 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d  ql; } aQuery[] =
132b0 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65   {.     { "numbe
132c0 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20  r of tables:",. 
132d0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
132e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
132f0 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
13300 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
13310 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a  mber of indexes:
13320 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
13330 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
13340 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  %s WHERE type='i
13350 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b  ndex'" },.     {
13360 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67   "number of trig
13370 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  gers:",.       "
13380 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
13390 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
133a0 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c  pe='trigger'" },
133b0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
133c0 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20  of views:",.    
133d0 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
133e0 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
133f0 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d  E type='view'" }
13400 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
13410 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20   size:",.       
13420 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65  "SELECT total(le
13430 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20  ngth(sql)) FROM 
13440 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71  %s" },.  };.  sq
13450 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
13460 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
13470 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
13480 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
13490 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
134a0 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
134b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
134c0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e  Hdr[100];.  open
134d0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  _db(p, 0);.  if(
134e0 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75   p->db==0 ) retu
134f0 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rn 1;.  sqlite3_
13500 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
13510 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
13520 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
13530 45 52 2c 20 26 70 46 69 6c 65 29 3b 0a 20 20 69  ER, &pFile);.  i
13540 66 28 20 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  f( pFile==0 || p
13550 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  File->pMethods==
13560 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74  0 || pFile->pMet
13570 68 6f 64 73 2d 3e 78 52 65 61 64 3d 3d 30 20 29  hods->xRead==0 )
13580 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
13590 20 20 7d 0a 20 20 69 20 3d 20 70 46 69 6c 65 2d    }.  i = pFile-
135a0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64  >pMethods->xRead
135b0 28 70 46 69 6c 65 2c 20 61 48 64 72 2c 20 31 30  (pFile, aHdr, 10
135c0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 69 21 3d  0, 0);.  if( i!=
135d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
135e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
135f0 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
13600 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
13610 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
13620 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65   1;.  }.  i = ge
13630 74 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31  t2byteInt(aHdr+1
13640 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29  6);.  if( i==1 )
13650 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 66 70   i = 65536;.  fp
13660 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
13670 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74  -20s %d\n", "dat
13680 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a  abase page size:
13690 22 2c 20 69 29 3b 0a 20 20 66 70 72 69 6e 74 66  ", i);.  fprintf
136a0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
136b0 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f  %d\n", "write fo
136c0 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d  rmat:", aHdr[18]
136d0 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  );.  fprintf(p->
136e0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
136f0 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a  ", "read format:
13700 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20  ", aHdr[19]);.  
13710 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
13720 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72  "%-20s %d\n", "r
13730 65 73 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c  eserved bytes:",
13740 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f   aHdr[20]);.  fo
13750 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
13760 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29  ze(aField); i++)
13770 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d  {.    int ofst =
13780 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b   aField[i].ofst;
13790 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
137a0 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65  t val = get4byte
137b0 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29  Int(aHdr + ofst)
137c0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
137d0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22  >out, "%-20s %u"
137e0 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d  , aField[i].zNam
137f0 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69  e, val);.    swi
13800 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20  tch( ofst ){.   
13810 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20     case 56: {.  
13820 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31        if( val==1
13830 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
13840 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 20 0a  t, " (utf8)"); .
13850 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
13860 3d 32 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  =2 ) fprintf(p->
13870 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29  out, " (utf16le)
13880 22 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  "); .        if(
13890 20 76 61 6c 3d 3d 33 20 29 20 66 70 72 69 6e 74   val==3 ) fprint
138a0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
138b0 31 36 62 65 29 22 29 3b 20 0a 20 20 20 20 20 20  16be)"); .      
138c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
138d0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
138e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62  );.  }.  if( zDb
138f0 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
13900 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
13910 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71  mprintf("main.sq
13920 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20  lite_master");. 
13930 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13940 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30  p(zDb,"temp")==0
13950 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54   ){.    zSchemaT
13960 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
13970 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69  intf("%s", "sqli
13980 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
13990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
139a0 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
139b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
139c0 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  w\".sqlite_maste
139d0 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  r", zDb);.  }.  
139e0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
139f0 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b  Size(aQuery); i+
13a00 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
13a10 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
13a20 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a  intf(aQuery[i].z
13a30 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29  Sql, zSchemaTab)
13a40 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20  ;.    int val = 
13a50 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b  db_int(p, zSql);
13a60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13a70 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 70 72  e(zSql);.    fpr
13a80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
13a90 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72  20s %d\n", aQuer
13aa0 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29  y[i].zName, val)
13ab0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
13ac0 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29  free(zSchemaTab)
13ad0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
13ae0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
13af0 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
13b00 5f 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20  _errmsg() value 
13b10 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
13b20 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  turn 1..*/.stati
13b30 63 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62  c int shellDatab
13b40 61 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33  aseError(sqlite3
13b50 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
13b60 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69  har *zErr = sqli
13b70 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
13b80 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13b90 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
13ba0 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
13bb0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   1;.}../*.** Pri
13bc0 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  nt an out-of-mem
13bd0 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20 73  ory message to s
13be0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
13bf0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
13c00 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f  t shellNomemErro
13c10 72 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e  r(void){.  fprin
13c20 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
13c30 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
13c40 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  \n");.  return 1
13c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
13c60 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
13c70 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
13c80 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
13c90 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
13ca0 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
13cb0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
13cc0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
13cd0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
13ce0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13cf0 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
13d00 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68  (char *zLine, Sh
13d10 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
13d20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74  int h = 1;.  int
13d30 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
13d40 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
13d50 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
13d60 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61  rg[50];..  /* Pa
13d70 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69  rse the input li
13d80 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a  ne into tokens..
13d90 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c    */.  while( zL
13da0 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41  ine[h] && nArg<A
13db0 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
13dc0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  ){.    while( Is
13dd0 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
13de0 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ h++; }.    if
13df0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20  ( zLine[h]==0 ) 
13e00 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a  break;.    if( z
13e10 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c  Line[h]=='\'' ||
13e20 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29   zLine[h]=='"' )
13e30 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69  {.      int deli
13e40 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a  m = zLine[h++];.
13e50 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
13e60 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
13e70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
13e80 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[h] && zLine[
13e90 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 0a 20 20  h]!=delim ){ .  
13ea0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
13eb0 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69  h]=='\\' && deli
13ec0 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b  m=='"' && zLine[
13ed0 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20  h+1]!=0 ) h++;. 
13ee0 20 20 20 20 20 20 20 68 2b 2b 3b 20 0a 20 20 20         h++; .   
13ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
13f00 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
13f10 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
13f20 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
13f30 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
13f40 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
13f50 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
13f60 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
13f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
13f80 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
13f90 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
13fa0 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
13fb0 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
13fc0 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
13fd0 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
13fe0 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
13ff0 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
14000 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
14010 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
14020 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
14030 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
14040 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
14050 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
14060 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
14070 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
14080 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
14090 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
140a0 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69 66  zArg[0][0];.  if
140b0 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  ( (c=='b' && n>=
140c0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
140d0 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c  rg[0], "backup",
140e0 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63   n)==0).   || (c
140f0 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='s' && n>=3 &&
14100 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
14110 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30  ], "save", n)==0
14120 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
14130 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65   char *zDestFile
14140 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
14150 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
14160 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
14170 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
14180 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
14190 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
141a0 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20  or(j=1; j<nArg; 
141b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  j++){.      cons
141c0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
141d0 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[j];.      if( 
141e0 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d       while( z[0]
14200 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
14210 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69 6f       /* No optio
14220 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 61 74  ns to process at
14230 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
14240 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
14250 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14260 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "unknown optio
14270 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  n: %s\n", azArg[
14280 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  j]);.          r
14290 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
142a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
142b0 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
142c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  ){.        zDest
142d0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
142e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
142f0 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zDb==0 ){.     
14300 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69     zDb = zDestFi
14310 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73  le;.        zDes
14320 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d  tFile = azArg[j]
14330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14340 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
14350 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79  tderr, "too many
14360 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62   arguments to .b
14370 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20  ackup\n");.     
14380 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
143a0 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
143b0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
143c0 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e  (stderr, "missin
143d0 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d  g FILENAME argum
143e0 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e  ent on .backup\n
143f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14400 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
14410 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d  ( zDb==0 ) zDb =
14420 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20   "main";.    rc 
14430 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
14440 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
14450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14470 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14480 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
14490 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
144a0 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20   zDestFile);.   
144b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
144c0 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
144d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
144e0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
144f0 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  ;.    pBackup = 
14500 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
14510 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
14520 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a  ", p->db, zDb);.
14530 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
14540 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
14550 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
14560 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
14570 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
14580 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14590 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
145a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
145b0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
145c0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62   (rc = sqlite3_b
145d0 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b  ackup_step(pBack
145e0 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45  up,100))==SQLITE
145f0 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69  _OK ){}.    sqli
14600 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
14610 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
14620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14630 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
14640 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
14650 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14660 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
14670 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
14680 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
14690 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
146a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
146b0 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  se(pDest);.  }el
146c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
146d0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
146e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
146f0 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
14700 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
14710 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
14720 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
14730 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
14740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14750 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14760 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f   "Usage: .bail o
14770 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
14780 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
14790 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
147a0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
147b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
147c0 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d  , "binary", n)==
147d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
147e0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g==2 ){.      if
147f0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
14800 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
14810 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
14820 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20  e(p->out);.     
14830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14840 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f  setTextMode(p->o
14850 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
14860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
14870 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
14880 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e  sage: .binary on
14890 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
148a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
148b0 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20  }else..  /* The 
148c0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62  undocumented ".b
148d0 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61  reakpoint" comma
148e0 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c  nd causes a call
148f0 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20   to the no-op.  
14900 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64  ** routine named
14910 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
14920 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ()..  */.  if( c
14930 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
14940 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
14950 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c  ], "breakpoint",
14960 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65   n)==0 ){.    te
14970 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  st_breakpoint();
14980 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
14990 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  c=='c' && strncm
149a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f  p(azArg[0], "clo
149b0 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ne", n)==0 ){.  
149c0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
149d0 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  .      tryToClon
149e0 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  e(p, azArg[1]);.
149f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a00 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14a10 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20   "Usage: .clone 
14a20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
14a30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
14a40 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
14a50 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26   c=='d' && n>1 &
14a60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
14a70 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c  0], "databases",
14a80 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
14a90 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
14aa0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
14ab0 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
14ac0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d  b(p, 0);.    mem
14ad0 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
14ae0 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
14af0 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
14b00 20 3d 20 31 3b 0a 20 20 20 20 64 61 74 61 2e 6d   = 1;.    data.m
14b10 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d  ode = MODE_Colum
14b20 6e 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57  n;.    data.colW
14b30 69 64 74 68 5b 30 5d 20 3d 20 33 3b 0a 20 20 20  idth[0] = 3;.   
14b40 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 31   data.colWidth[1
14b50 5d 20 3d 20 31 35 3b 0a 20 20 20 20 64 61 74 61  ] = 15;.    data
14b60 2e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20 35  .colWidth[2] = 5
14b70 38 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20  8;.    data.cnt 
14b80 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
14b90 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
14ba0 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69  AGMA database_li
14bb0 73 74 3b 20 22 2c 20 63 61 6c 6c 62 61 63 6b 2c  st; ", callback,
14bc0 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
14bd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
14be0 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
14bf0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
14c00 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
14c10 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
14c20 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
14c30 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
14c40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
14c50 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
14c60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
14c70 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20  "dbinfo", n)==0 
14c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c  ){.    rc = shel
14c90 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64  l_dbinfo_command
14ca0 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29  (p, nArg, azArg)
14cb0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
14cc0 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63   c=='d' && strnc
14cd0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75  mp(azArg[0], "du
14ce0 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  mp", n)==0 ){.  
14cf0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
14d00 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  .    /* When pla
14d10 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d  ying back a "dum
14d20 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  p", the content 
14d30 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
14d40 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  an order.    ** 
14d50 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d  which causes imm
14d60 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
14d70 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
14d80 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20  o be violated.. 
14d90 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65     ** So disable
14da0 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e   foreign-key con
14db0 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d  straint enforcem
14dc0 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70  ent to prevent p
14dd0 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20  roblems. */.    
14de0 69 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e  if( nArg!=1 && n
14df0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
14e00 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
14e10 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f 4c  "Usage: .dump ?L
14e20 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
14e30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
14e40 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
14e50 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
14e60 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
14e70 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
14e80 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
14e90 3b 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  ;\n");.    fprin
14ea0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
14eb0 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
14ec0 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
14ed0 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
14ee0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
14ef0 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  p->db, "SAVEPOIN
14f00 54 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77  T dump; PRAGMA w
14f10 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
14f20 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
14f30 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20    p->nErr = 0;. 
14f40 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29     if( nArg==1 )
14f50 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  {.      run_sche
14f60 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
14f70 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
14f80 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
14f90 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
14fa0 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
14fb0 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
14fc0 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  LL AND type=='ta
14fd0 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27  ble' AND name!='
14fe0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
14ff0 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
15000 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
15010 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20 20 20  _query(p, .     
15020 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
15030 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
15040 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
15050 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6e          "WHERE n
15060 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71  ame=='sqlite_seq
15070 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b  uence'".      );
15080 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65  .      run_table
15090 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
150a0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
150b0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
150c0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
150d0 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e  "WHERE sql NOT N
150e0 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20  ULL AND type IN 
150f0 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
15100 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20  r','view')", 0. 
15110 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
15120 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
15130 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
15140 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
15150 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
15160 63 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  c = azArg[i];.  
15170 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
15180 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
15190 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
151a0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
151b0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
151c0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ter ".          
151d0 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20  "WHERE tbl_name 
151e0 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
151f0 28 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  () AND type=='ta
15200 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20 20  ble'".          
15210 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e  "  AND sql NOT N
15220 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ULL");.        r
15230 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
15240 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20  ery(p,.         
15250 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
15260 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15270 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
15280 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
15290 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
152a0 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
152b0 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
152c0 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
152d0 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20  "  AND tbl_name 
152e0 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
152f0 28 29 22 2c 20 30 0a 20 20 20 20 20 20 20 20 29  ()", 0.        )
15300 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
15310 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
15320 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15330 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68  ( p->writableSch
15340 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ema ){.      fpr
15350 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
15360 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
15370 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  hema=OFF;\n");. 
15380 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
15390 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
153a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
153b0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
153c0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
153d0 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
153e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
153f0 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
15400 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30  ASE dump;", 0, 0
15410 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
15420 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72  f(p->out, p->nEr
15430 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d  r ? "ROLLBACK; -
15440 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c  - due to errors\
15450 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22  n" : "COMMIT;\n"
15460 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
15470 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
15480 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
15490 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  cho", n)==0 ){. 
154a0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
154b0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 63 68 6f 4f  {.      p->echoO
154c0 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
154d0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
154e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
154f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
15500 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66  age: .echo on|of
15510 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
15520 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15530 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
15540 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
15550 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d  g[0], "eqp", n)=
15560 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
15570 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
15580 2d 3e 61 75 74 6f 45 51 50 20 3d 20 62 6f 6f 6c  ->autoEQP = bool
15590 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
155a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
155b0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
155c0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71  err, "Usage: .eq
155d0 70 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  p on|off\n");.  
155e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
155f0 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  }   .  }else..  
15600 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
15610 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
15620 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
15630 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
15640 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
15650 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
15660 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
15670 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
15680 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
15690 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
156a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
156b0 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
156c0 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 6e 41      int val = nA
156d0 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56  rg>=2 ? booleanV
156e0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a  alue(azArg[1]) :
156f0 20 31 3b 0a 20 20 20 20 69 66 28 76 61 6c 20 3d   1;.    if(val =
15700 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69 66 28  = 1) {.      if(
15710 21 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 76  !p->normalMode.v
15720 61 6c 69 64 29 20 7b 0a 20 20 20 20 20 20 20 20  alid) {.        
15730 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 76 61  p->normalMode.va
15740 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
15750 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 6d   p->normalMode.m
15760 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
15770 20 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c         p->normal
15780 4d 6f 64 65 2e 73 68 6f 77 48 65 61 64 65 72 20  Mode.showHeader 
15790 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
157a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
157b0 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 63 6f  p->normalMode.co
157c0 6c 57 69 64 74 68 2c 70 2d 3e 63 6f 6c 57 69 64  lWidth,p->colWid
157d0 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  th,sizeof(p->col
157e0 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20 20 7d  Width));.      }
157f0 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 63 6f 75  .      /* We cou
15800 6c 64 20 70 75 74 20 74 68 69 73 20 63 6f 64 65  ld put this code
15810 20 75 6e 64 65 72 20 74 68 65 20 21 70 2d 3e 65   under the !p->e
15820 78 70 6c 61 69 6e 56 61 6c 69 64 0a 20 20 20 20  xplainValid.    
15830 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 73    ** condition s
15840 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
15850 6f 74 20 65 78 65 63 75 74 65 20 69 66 20 77 65  ot execute if we
15860 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
15870 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 61 69 6e        ** explain
15880 20 6d 6f 64 65 2e 20 48 6f 77 65 76 65 72 2c 20   mode. However, 
15890 61 6c 77 61 79 73 20 65 78 65 63 75 74 69 6e 67  always executing
158a0 20 69 74 20 61 6c 6c 6f 77 73 20 75 73 20 61 6e   it allows us an
158b0 20 65 61 73 79 0a 20 20 20 20 20 20 2a 2a 20 77   easy.      ** w
158c0 61 73 20 74 6f 20 72 65 73 65 74 20 74 6f 20 65  as to reset to e
158d0 78 70 6c 61 69 6e 20 6d 6f 64 65 20 69 6e 20 63  xplain mode in c
158e0 61 73 65 20 74 68 65 20 75 73 65 72 20 70 72 65  ase the user pre
158f0 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 2a 2a  viously.      **
15900 20 64 69 64 20 61 6e 20 2e 65 78 70 6c 61 69 6e   did an .explain
15910 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 2e   followed by a .
15920 77 69 64 74 68 2c 20 2e 6d 6f 64 65 20 6f 72 20  width, .mode or 
15930 2e 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a  .header.      **
15940 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 20   command..      
15950 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  */.      p->mode
15960 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
15970 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
15980 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
15990 6d 65 6d 73 65 74 28 70 2d 3e 63 6f 6c 57 69 64  memset(p->colWid
159a0 74 68 2c 30 2c 73 69 7a 65 6f 66 28 70 2d 3e 63  th,0,sizeof(p->c
159b0 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20  olWidth));.     
159c0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 30 5d 20   p->colWidth[0] 
159d0 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 4;            
159e0 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2a 2f        /* addr */
159f0 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
15a00 74 68 5b 31 5d 20 3d 20 31 33 3b 20 20 20 20 20  th[1] = 13;     
15a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
15a20 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 70  pcode */.      p
15a30 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20  ->colWidth[2] = 
15a40 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4;              
15a50 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
15a60 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 33     p->colWidth[3
15a70 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20  ] = 4;          
15a80 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
15a90 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
15aa0 74 68 5b 34 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[4] = 4;      
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15ac0 33 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  3 */.      p->co
15ad0 6c 57 69 64 74 68 5b 35 5d 20 3d 20 31 33 3b 20  lWidth[5] = 13; 
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70  /* P4 */.      p
15b00 2d 3e 63 6f 6c 57 69 64 74 68 5b 36 5d 20 3d 20  ->colWidth[6] = 
15b10 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
15b20 20 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20      /* P5 */.   
15b30 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 37     p->colWidth[7
15b40 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20  ] = 13;         
15b50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
15b60 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ent */.    }else
15b70 20 69 66 20 28 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f   if (p->normalMo
15b80 64 65 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20 20  de.valid) {.    
15b90 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e    p->normalMode.
15ba0 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  valid = 0;.     
15bb0 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f   p->mode = p->no
15bc0 72 6d 61 6c 4d 6f 64 65 2e 6d 6f 64 65 3b 0a 20  rmalMode.mode;. 
15bd0 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64       p->showHead
15be0 65 72 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  er = p->normalMo
15bf0 64 65 2e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  de.showHeader;. 
15c00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63       memcpy(p->c
15c10 6f 6c 57 69 64 74 68 2c 70 2d 3e 6e 6f 72 6d 61  olWidth,p->norma
15c20 6c 4d 6f 64 65 2e 63 6f 6c 57 69 64 74 68 2c 73  lMode.colWidth,s
15c30 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74  izeof(p->colWidt
15c40 68 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  h));.    }.  }el
15c50 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  se..  if( c=='f'
15c60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
15c70 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
15c80 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
15c90 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
15ca0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
15cb0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
15cc0 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
15cd0 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b    if( nArg!=1 ){
15ce0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
15cf0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
15d00 66 75 6c 6c 73 63 68 65 6d 61 5c 6e 22 29 3b 0a  fullschema\n");.
15d10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
15d20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
15d30 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
15d40 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
15d50 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   0);.    memcpy(
15d60 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
15d70 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
15d80 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
15d90 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20  ;.    data.mode 
15da0 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
15db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
15dc0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
15dd0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
15de0 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45  M".       "  (SE
15df0 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
15e00 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
15e10 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
15e20 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
15e30 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f         "     FRO
15e40 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15e50 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
15e60 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
15e70 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
15e80 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52  , name, rowid FR
15e90 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
15ea0 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
15eb0 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
15ec0 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
15ed0 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
15ee0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
15ef0 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52   ".       "ORDER
15f00 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
15f10 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
15f20 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
15f30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
15f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15f50 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
15f60 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63  *pStmt;.      rc
15f70 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
15f80 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
15f90 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
15fa0 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
15fb0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
15fd0 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
15fe0 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
15ff0 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
16000 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
16010 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73  );.      doStats
16020 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
16030 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
16040 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OW;.      sqlite
16050 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
16060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16070 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20   doStats==0 ){. 
16080 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
16090 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54  out, "/* No STAT
160a0 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c   tables availabl
160b0 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  e */\n");.    }e
160c0 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
160d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
160e0 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
160f0 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  r;\n");.      sq
16100 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
16110 2c 20 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59  , "SELECT 'ANALY
16120 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
16130 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
16140 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
16150 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
16160 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  );.      data.mo
16170 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
16180 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
16190 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
161a0 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20  e_stat1";.      
161b0 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
161c0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
161d0 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 0a   sqlite_stat1",.
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
16200 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29   &data,&zErrMsg)
16210 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
16220 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
16230 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20  e_stat3";.      
16240 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
16250 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
16260 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a   sqlite_stat3",.
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
16290 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29   &data,&zErrMsg)
162a0 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
162b0 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
162c0 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20  e_stat4";.      
162d0 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
162e0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
162f0 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a   sqlite_stat4",.
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
16320 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
16330 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
16340 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
16350 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
16360 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  \n");.    }.  }e
16370 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68  lse..  if( c=='h
16380 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
16390 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22  rg[0], "headers"
163a0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
163b0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
163c0 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
163d0 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
163e0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
163f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
16400 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
16410 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e  age: .headers on
16420 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
16430 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
16440 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
16450 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
16460 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c  zArg[0], "help",
16470 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   n)==0 ){.    fp
16480 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
16490 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65  s", zHelp);.  }e
164a0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
164b0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
164c0 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c  rg[0], "import",
164d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
164e0 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
164f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
16500 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
16510 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
16520 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
16530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16540 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65  ame of file to e
16550 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f  xtra content fro
16560 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  m */.    sqlite3
16570 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
16580 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d  ULL; /* A statem
16590 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ent */.    int n
165a0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
165b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
165c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
165d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
165e0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
165f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16600 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
16610 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
16620 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16650 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
16660 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20  eedCommit;      
16670 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
16680 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  o COMMIT or ROLL
16690 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20  BACK at end */. 
166a0 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
166d0 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72  s in p->colSepar
166e0 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  ator[] */.    ch
166f0 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
16700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16710 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
16720 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73  .    ImportCtx s
16730 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ctx;            
16740 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65   /* Reader conte
16750 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  xt */.    char *
16760 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
16770 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a  Read)(ImportCtx*
16780 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65  ); /* Func to re
16790 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a  ad one value */.
167a0 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f      int (SQLITE_
167b0 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28  CDECL *xCloser)(
167c0 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20  FILE*);      /* 
167d0 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69  Func to close fi
167e0 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e  le */..    if( n
167f0 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
16800 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
16810 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20  "Usage: .import 
16820 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a  FILE TABLE\n");.
16830 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
16840 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
16850 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
16860 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54  azArg[1];.    zT
16870 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  able = azArg[2];
16880 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75  .    seenInterru
16890 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  pt = 0;.    mems
168a0 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
168b0 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
168c0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
168d0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
168e0 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
168f0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
16900 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  p==0 ){.      fp
16910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
16920 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63  rror: non-null c
16930 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
16940 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
16950 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
16960 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16970 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
16980 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
16990 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
169a0 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63  ulti-character c
169b0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
169c0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
169f0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
16a00 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
16a10 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
16a20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
16a30 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
16a40 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
16a50 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
16a60 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20  r: non-null row 
16a70 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
16a80 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22  ed for import\n"
16a90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16aa0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
16ab0 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d   nSep==2 && p->m
16ac0 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26  ode==MODE_Csv &&
16ad0 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65   strcmp(p->rowSe
16ae0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c  parator, SEP_CrL
16af0 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  f)==0 ){.      /
16b00 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67  * When importing
16b10 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20   CSV (only), if 
16b20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
16b30 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  r is set to the.
16b40 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74        ** default
16b50 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61   output row sepa
16b60 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74  rator, change it
16b70 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
16b80 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72  input.      ** r
16b90 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
16ba0 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e  his avoids havin
16bb0 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69  g to maintain di
16bc0 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20  fferent input.  
16bd0 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75      ** and outpu
16be0 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  t row separators
16bf0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
16c00 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
16c10 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
16c20 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
16c30 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
16c40 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72        nSep = str
16c50 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61  len30(p->rowSepa
16c60 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  rator);.    }.  
16c70 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a    if( nSep>1 ){.
16c80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
16c90 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
16ca0 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f  lti-character ro
16cb0 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  w separators not
16cc0 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
16cf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
16d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78  ;.    }.    sCtx
16d10 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  .zFile = zFile;.
16d20 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d      sCtx.nLine =
16d30 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78   1;.    if( sCtx
16d40 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29  .zFile[0]=='|' )
16d50 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
16d60 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20  OMIT_POPEN.     
16d70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
16d80 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61   "Error: pipes a
16d90 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
16da0 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b   in this OS\n");
16db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16dc0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74  .#else.      sCt
16dd0 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74  x.in = popen(sCt
16de0 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b  x.zFile+1, "r");
16df0 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c  .      sCtx.zFil
16e00 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20  e = "<pipe>";.  
16e10 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63      xCloser = pc
16e20 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  lose;.#endif.   
16e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43   }else{.      sC
16e40 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43  tx.in = fopen(sC
16e50 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  tx.zFile, "rb");
16e60 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
16e70 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20   fclose;.    }. 
16e80 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
16e90 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20  MODE_Ascii ){.  
16ea0 20 20 20 20 78 52 65 61 64 20 3d 20 61 73 63 69      xRead = asci
16eb0 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
16ec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16ed0 20 20 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72     xRead = csv_r
16ee0 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
16ef0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74     }.    if( sCt
16f00 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x.in==0 ){.     
16f10 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
16f20 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
16f30 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
16f40 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  zFile);.      re
16f50 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
16f60 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d    sCtx.cColSep =
16f70 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
16f80 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52  [0];.    sCtx.cR
16f90 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
16fa0 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
16fb0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
16fc0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
16fd0 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c   FROM %s", zTabl
16fe0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  e);.    if( zSql
16ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
17000 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
17010 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
17020 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43  ry\n");.      xC
17030 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
17040 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
17050 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
17060 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
17070 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17080 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
17090 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
170a0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
170b0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
170c0 72 28 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20  r(&sCtx, 0);    
170d0 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74  /* To ensure sCt
170e0 78 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  x.z is allocated
170f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26   */.    if( rc &
17100 26 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  & sqlite3_strglo
17110 62 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  b("no such table
17120 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  : *", sqlite3_er
17130 72 6d 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20  rmsg(p->db))==0 
17140 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
17150 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
17160 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45  _mprintf("CREATE
17170 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62   TABLE %s", zTab
17180 6c 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  le);.      char 
17190 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20  cSep = '(';.    
171a0 20 20 77 68 69 6c 65 28 20 78 52 65 61 64 28 26    while( xRead(&
171b0 73 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20  sCtx) ){.       
171c0 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
171d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63  e3_mprintf("%z%c
171e0 5c 6e 20 20 5c 22 25 73 5c 22 20 54 45 58 54 22  \n  \"%s\" TEXT"
171f0 2c 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c  , zCreate, cSep,
17200 20 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20   sCtx.z);.      
17210 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
17220 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63        if( sCtx.c
17230 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53  Term!=sCtx.cColS
17240 65 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ep ) break;.    
17250 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53    }.      if( cS
17260 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  ep=='(' ){.     
17270 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17280 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
17290 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
172a0 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
172b0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
172c0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
172d0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
172e0 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74  pty file\n", sCt
172f0 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  x.zFile);.      
17300 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17310 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
17320 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
17330 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
17340 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
17350 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
17360 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
17370 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
17380 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
17390 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
173a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  rc ){.        fp
173b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
173c0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e  REATE TABLE %s(.
173d0 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ..) failed: %s\n
173e0 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20  ", zTable,.     
173f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17400 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
17410 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17420 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
17430 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
17440 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
17450 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17460 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
17470 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17480 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
17490 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
174a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
174b0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
174c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
174d0 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
174e0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
174f0 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 70 72 69  tmt);.      fpri
17500 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
17510 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
17520 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
17530 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
17540 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
17550 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
17560 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
17570 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
17580 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
17590 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
175a0 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
175b0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   0;.    if( nCol
175c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
175d0 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e  /* no columns, n
175e0 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a  o error */.    z
175f0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Sql = sqlite3_ma
17600 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20  lloc64( nByte*2 
17610 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 20 + nCol*2 );
17620 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
17630 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
17640 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
17650 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
17660 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  n");.      xClos
17670 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
17680 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17690 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
176a0 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30  nprintf(nByte+20
176b0 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
176c0 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55  INTO \"%w\" VALU
176d0 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
176e0 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30      j = strlen30
176f0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
17700 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
17710 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
17720 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
17730 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
17740 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
17750 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
17760 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
17770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17780 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
17790 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
177a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
177b0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
177c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
177d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
177e0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
177f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
17800 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
17810 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
17820 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17830 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
17840 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
17850 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
17860 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20  .    needCommit 
17870 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  = sqlite3_get_au
17880 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b  tocommit(p->db);
17890 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
178a0 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
178b0 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e  ec(p->db, "BEGIN
178c0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
178d0 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73   do{.      int s
178e0 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e  tartLine = sCtx.
178f0 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  nLine;.      for
17900 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
17910 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
17920 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43 74   *z = xRead(&sCt
17930 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  x);.        /*. 
17940 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65         ** Did we
17950 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
17960 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  le before findin
17970 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20  g any columns?. 
17980 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c         ** If so,
17990 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66   stop instead of
179a0 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68   NULL filling th
179b0 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75  e remaining colu
179c0 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  mns..        */.
179d0 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
179e0 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
179f0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ;.        /*.   
17a00 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72       ** Did we r
17a10 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  each end-of-file
17a20 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   OR end-of-line 
17a30 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61  before finding a
17a40 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  ny.        ** co
17a50 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20 6d  lumns in ASCII m
17a60 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f  ode?  If so, sto
17a70 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
17a80 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  L filling.      
17a90 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e 69    ** the remaini
17aa0 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
17ab0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
17ac0 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
17ad0 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30 20  _Ascii && (z==0 
17ae0 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69  || z[0]==0) && i
17af0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17b00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
17b10 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
17b20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
17b30 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
17b40 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d       if( i<nCol-
17b50 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d 21  1 && sCtx.cTerm!
17b60 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b  =sCtx.cColSep ){
17b70 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
17b80 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
17b90 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
17ba0 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
17bb0 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72    "filling the r
17be0 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22  est with NULL\n"
17bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17c00 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
17c10 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
17c20 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  e, nCol, i+1);. 
17c30 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b           i += 2;
17c40 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
17c50 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c  ( i<=nCol ){ sql
17c60 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
17c70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d  Stmt, i); i++; }
17c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17c90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43 74   }.      if( sCt
17ca0 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
17cb0 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
17cc0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78   do{.          x
17cd0 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20  Read(&sCtx);.   
17ce0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
17cf0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78      }while( sCtx
17d00 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f  .cTerm==sCtx.cCo
17d10 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20  lSep );.        
17d20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
17d30 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
17d40 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
17d50 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
17d80 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
17db0 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
17dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17dd0 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
17de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
17df0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
17e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17e10 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
17e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17e40 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
17e50 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e  derr, "%s:%d: IN
17e60 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c  SERT failed: %s\
17e70 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20  n", sCtx.zFile, 
17e80 73 74 61 72 74 4c 69 6e 65 2c 0a 20 20 20 20 20  startLine,.     
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17ea0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
17eb0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  b));.        }. 
17ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
17ed0 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 45  e( sCtx.cTerm!=E
17ee0 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73  OF );..    xClos
17ef0 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
17f00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
17f10 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  tx.z);.    sqlit
17f20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17f30 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  t);.    if( need
17f40 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
17f50 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f  _exec(p->db, "CO
17f60 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
17f70 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
17f80 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e 63  c=='i' && (strnc
17f90 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e  mp(azArg[0], "in
17fa0 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20 20  dices", n)==0.  
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17fc0 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  | strncmp(azArg[
17fd0 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20 6e  0], "indexes", n
17fe0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 53 68 65  )==0) ){.    She
17ff0 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
18000 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
18010 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
18020 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
18030 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
18040 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
18050 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
18060 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f  = 0;.    data.mo
18070 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
18080 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
18090 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
180a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
180b0 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
180c0 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
180d0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
180e0 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d      "WHERE type=
180f0 27 69 6e 64 65 78 27 20 41 4e 44 20 6e 61 6d 65  'index' AND name
18100 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
18110 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 20 22  e_%' ".        "
18120 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20  UNION ALL ".    
18130 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
18140 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
18150 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  p_master ".     
18160 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
18170 69 6e 64 65 78 27 20 22 0a 20 20 20 20 20 20 20  index' ".       
18180 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20   "ORDER BY 1",. 
18190 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
181a0 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
181b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
181c0 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 32 20  lse if( nArg==2 
181d0 29 7b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  ){.      zShellS
181e0 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d  tatic = azArg[1]
181f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18200 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
18210 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
18220 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
18230 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
18240 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
18250 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
18260 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74  ame LIKE shellst
18270 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20 20  atic() ".       
18280 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
18290 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
182a0 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  me FROM sqlite_t
182b0 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  emp_master ".   
182c0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
182d0 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c  ='index' AND tbl
182e0 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
182f0 73 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20  static() ".     
18300 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c     "ORDER BY 1",
18310 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
18320 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
18330 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
18340 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d    zShellStatic =
18350 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
18360 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
18370 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6e  err, "Usage: .in
18380 64 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41 54 54  dexes ?LIKE-PATT
18390 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ERN?\n");.      
183a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
183b0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
183c0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
183d0 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
183e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
183f0 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
18400 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
18410 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18420 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
18430 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
18440 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49  e if( rc != SQLI
18450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
18460 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
18470 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73  rror: querying s
18480 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
18490 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
184a0 74 65 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ter\n");.      r
184b0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
184c0 65 6c 73 65 0a 0a 23 69 66 64 65 66 20 53 51 4c  else..#ifdef SQL
184d0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
184e0 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  CE.  if( c=='i' 
184f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
18500 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20  [0], "iotrace", 
18510 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c  n)==0 ){.    SQL
18520 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76  ITE_API extern v
18530 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43  oid (SQLITE_CDEC
18540 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63  L *sqlite3IoTrac
18550 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  e)(const char*, 
18560 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f  ...);.    if( io
18570 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65  trace && iotrace
18580 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73  !=stdout ) fclos
18590 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20  e(iotrace);.    
185a0 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  iotrace = 0;.   
185b0 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
185c0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
185d0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ace = 0;.    }el
185e0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
185f0 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20  Arg[1], "-")==0 
18600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18610 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63  IoTrace = iotrac
18620 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69  ePrintf;.      i
18630 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  otrace = stdout;
18640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18650 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65    iotrace = fope
18660 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29  n(azArg[1], "w")
18670 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72  ;.      if( iotr
18680 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ace==0 ){.      
18690 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
186a0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
186b0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
186c0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
186d0 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
186e0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
186f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
18700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
18710 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
18720 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
18730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
18740 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
18750 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26  c=='l' && n>=5 &
18760 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
18770 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29  0], "limits", n)
18780 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
18790 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
187a0 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  .       const ch
187b0 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20  ar *zLimitName; 
187c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c    /* Name of a l
187d0 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69  imit */.       i
187e0 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20  nt limitCode;   
187f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
18800 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61  ger code for tha
18810 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d  t limit */.    }
18820 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20   aLimit[] = {.  
18830 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20      { "length", 
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18850 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
18860 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
18870 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
18880 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20   "sql_length",  
18890 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
188a0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
188b0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
188c0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c   },.      { "col
188d0 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  umn",           
188e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
188f0 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20  T_COLUMN        
18900 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
18910 20 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70       { "expr_dep
18920 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
18930 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
18940 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20  R_DEPTH         
18950 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
18960 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65  { "compound_sele
18970 63 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  ct",       SQLIT
18980 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
18990 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
189a0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64    },.      { "vd
189b0 62 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20  be_op",         
189c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
189d0 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20  IT_VDBE_OP      
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
189f0 20 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f        { "functio
18a00 6e 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20 20  n_arg",         
18a10 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55   SQLITE_LIMIT_FU
18a20 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20  NCTION_ARG      
18a30 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
18a40 20 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20 20   { "attached",  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18a60 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
18a70 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
18a80 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c     },.      { "l
18a90 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67  ike_pattern_leng
18aa0 74 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49  th",   SQLITE_LI
18ab0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
18ac0 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c  _LENGTH       },
18ad0 0a 20 20 20 20 20 20 7b 20 22 76 61 72 69 61 62  .      { "variab
18ae0 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20  le_number",     
18af0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
18b00 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20  ARIABLE_NUMBER  
18b10 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
18b20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70    { "trigger_dep
18b30 74 68 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c  th",         SQL
18b40 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
18b50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20  R_DEPTH         
18b60 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
18b70 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c  worker_threads",
18b80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
18b90 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
18ba0 41 44 53 20 20 20 20 20 20 20 20 20 20 20 20 7d  ADS            }
18bb0 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
18bc0 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e   i, n2;.    open
18bd0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
18be0 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
18bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
18c00 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29  rraySize(aLimit)
18c10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18c20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c  printf("%20s %d\
18c30 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  n", aLimit[i].zL
18c40 69 6d 69 74 4e 61 6d 65 2c 20 0a 20 20 20 20 20  imitName, .     
18c50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18c60 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
18c70 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f  Limit[i].limitCo
18c80 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  de, -1));.      
18c90 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
18ca0 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20  nArg>3 ){.      
18cb0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
18cc0 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e  "Usage: .limit N
18cd0 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c  AME ?NEW-VALUE?\
18ce0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
18cf0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
18d00 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
18d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d    int iLimit = -
18d30 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74  1;.      n2 = st
18d40 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
18d50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
18d60 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
18d70 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
18d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
18d90 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b  strnicmp(aLimit[
18da0 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61  i].zLimitName, a
18db0 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20  zArg[1], n2)==0 
18dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18dd0 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
18de0 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20           iLimit 
18df0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
18e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18e10 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
18e20 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d  , "ambiguous lim
18e30 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  it: \"%s\"\n", a
18e40 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
18e50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
18e60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
18e70 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
18e80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18ea0 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
18eb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  <0 ){.        fp
18ec0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
18ed0 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22  nknown limit: \"
18ee0 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20  %s\"\n".        
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73  "enter \".limits
18f10 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  \" with no argum
18f20 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e  ents for a list.
18f30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
18f50 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
18f60 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
18f70 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
18f80 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
18f90 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d  .      if( nArg=
18fa0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
18fb0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
18fc0 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
18fd0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20  ].limitCode,.   
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56     (int)integerV
19000 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b  alue(azArg[2]));
19010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19020 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
19030 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  ", aLimit[iLimit
19040 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20  ].zLimitName,.  
19050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19060 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
19070 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
19080 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
19090 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
190a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
190b0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
190c0 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  N.  if( c=='l' &
190d0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
190e0 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d  0], "load", n)==
190f0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
19100 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72  har *zFile, *zPr
19110 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  oc;.    char *zE
19120 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
19130 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
19140 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
19150 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
19160 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
19170 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
19180 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
19190 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
191a0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
191b0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
191c0 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
191d0 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
191e0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
191f0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
19200 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
19210 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
19220 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
19230 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
19240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19250 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
19260 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
19270 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
19280 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19290 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
192a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
192b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
192c0 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
192d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
192e0 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29  , "log", n)==0 )
192f0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
19300 32 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  2 ){.      fprin
19310 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
19320 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45  e: .log FILENAME
19330 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
19340 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
19350 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
19360 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  *zFile = azArg[1
19370 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  ];.      output_
19380 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c  file_close(p->pL
19390 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  og);.      p->pL
193a0 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  og = output_file
193b0 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20  _open(zFile);.  
193c0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
193d0 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72  f( c=='m' && str
193e0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
193f0 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mode", n)==0 ){.
19400 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19410 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zMode = nArg>=2 
19420 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b  ? azArg[1] : "";
19430 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 28 69  .    int n2 = (i
19440 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29  nt)strlen(zMode)
19450 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a  ;.    int c2 = z
19460 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Mode[0];.    if(
19470 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32   c2=='l' && n2>2
19480 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
19490 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29  g[1],"lines",n2)
194a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
194b0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65  mode = MODE_Line
194c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
194d0 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
194e0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c  mp(azArg[1],"col
194f0 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  umns",n2)==0 ){.
19500 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
19510 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  MODE_Column;.   
19520 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
19530 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
19540 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
19550 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
19560 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
19570 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
19580 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27  else if( c2=='h'
19590 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
195a0 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d  g[1],"html",n2)=
195b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
195c0 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b  ode = MODE_Html;
195d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
195e0 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
195f0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22  p(azArg[1],"tcl"
19600 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
19610 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
19620 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tcl;.      sqlit
19630 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
19640 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
19650 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
19660 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29  ator, SEP_Space)
19670 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19680 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
19690 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76  mp(azArg[1],"csv
196a0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
196b0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
196c0 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Csv;.      sqli
196d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
196e0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
196f0 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
19700 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
19710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19720 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
19730 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
19740 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
19750 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20  or, SEP_CrLf);. 
19760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
19770 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
19780 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c  azArg[1],"tabs",
19790 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
197a0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
197b0 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
197c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
197d0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
197e0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
197f0 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a  ator, SEP_Tab);.
19800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
19810 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
19820 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72  (azArg[1],"inser
19830 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
19840 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
19850 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
19860 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
19870 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  , nArg>=3 ? azAr
19880 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b  g[2] : "table");
19890 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
198a0 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  2=='a' && strncm
198b0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69  p(azArg[1],"asci
198c0 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  i",n2)==0 ){.   
198d0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
198e0 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73  E_Ascii;.      s
198f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19900 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
19910 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
19920 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e  eparator, SEP_Un
19930 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
19940 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
19950 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
19960 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
19970 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64  ator, SEP_Record
19980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20  );.    }else {. 
19990 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
199a0 65 72 72 2c 22 45 72 72 6f 72 3a 20 6d 6f 64 65  err,"Error: mode
199b0 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
199c0 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 61  f: ".         "a
199d0 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20  scii column csv 
199e0 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
199f0 20 6c 69 73 74 20 74 61 62 73 20 74 63 6c 5c 6e   list tabs tcl\n
19a00 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
19a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
19a20 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26  .  if( c=='n' &&
19a30 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
19a40 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20  ], "nullvalue", 
19a50 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
19a60 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
19a70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
19a80 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c  tf(sizeof(p->nul
19a90 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c  lValue), p->null
19aa0 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  Value,.         
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
19ac0 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79  .*s", (int)Array
19ad0 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  Size(p->nullValu
19ae0 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  e)-1, azArg[1]);
19af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19b00 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19b10 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76  , "Usage: .nullv
19b20 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b  alue STRING\n");
19b30 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
19b40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
19b50 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74  if( c=='o' && st
19b60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
19b70 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26  "open", n)==0 &&
19b80 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c   n>=2 ){.    sql
19b90 69 74 65 33 20 2a 73 61 76 65 64 44 62 20 3d 20  ite3 *savedDb = 
19ba0 70 2d 3e 64 62 3b 0a 20 20 20 20 63 6f 6e 73 74  p->db;.    const
19bb0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 46 69 6c   char *zSavedFil
19bc0 65 6e 61 6d 65 20 3d 20 70 2d 3e 7a 44 62 46 69  ename = p->zDbFi
19bd0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  lename;.    char
19be0 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d   *zNewFilename =
19bf0 20 30 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20   0;.    p->db = 
19c00 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  0;.    if( nArg>
19c10 3d 32 20 29 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  =2 ) zNewFilenam
19c20 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
19c30 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
19c40 31 5d 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46  1]);.    p->zDbF
19c50 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69  ilename = zNewFi
19c60 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6f 70 65 6e  lename;.    open
19c70 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20 69  _db(p, 1);.    i
19c80 66 28 20 70 2d 3e 64 62 21 3d 30 20 29 7b 0a 20  f( p->db!=0 ){. 
19c90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
19ca0 73 65 28 73 61 76 65 64 44 62 29 3b 0a 20 20 20  se(savedDb);.   
19cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19cc0 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29  p->zFreeOnClose)
19cd0 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65  ;.      p->zFree
19ce0 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69  OnClose = zNewFi
19cf0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7d 65 6c 73  lename;.    }els
19d00 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
19d10 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
19d20 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62  me);.      p->db
19d30 20 3d 20 73 61 76 65 64 44 62 3b 0a 20 20 20 20   = savedDb;.    
19d40 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
19d50 20 3d 20 7a 53 61 76 65 64 46 69 6c 65 6e 61 6d   = zSavedFilenam
19d60 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
19d70 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 0a 20  ..  if( c=='o'. 
19d80 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a    && (strncmp(az
19d90 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22  Arg[0], "output"
19da0 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63  , n)==0 || strnc
19db0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e  mp(azArg[0], "on
19dc0 63 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b  ce", n)==0).  ){
19dd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19de0 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32  *zFile = nArg>=2
19df0 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73   ? azArg[1] : "s
19e00 74 64 6f 75 74 22 3b 0a 20 20 20 20 69 66 28 20  tdout";.    if( 
19e10 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
19e20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
19e30 22 55 73 61 67 65 3a 20 2e 25 73 20 46 49 4c 45  "Usage: .%s FILE
19e40 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
19e50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
19e60 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
19e70 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
19e80 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26  }.    if( n>1 &&
19e90 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
19ea0 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30  ], "once", n)==0
19eb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41   ){.      if( nA
19ec0 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
19ed0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
19ee0 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49  "Usage: .once FI
19ef0 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
19f00 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
19f10 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
19f20 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
19f30 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e        p->outCoun
19f40 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 2;.    }else
19f50 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  {.      p->outCo
19f60 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  unt = 0;.    }. 
19f70 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
19f80 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  p);.    if( zFil
19f90 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
19fa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19fb0 50 4f 50 45 4e 0a 20 20 20 20 20 20 66 70 72 69  POPEN.      fpri
19fc0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
19fd0 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74  r: pipes are not
19fe0 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68   supported in th
19ff0 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20  is OS\n");.     
1a000 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70   rc = 1;.      p
1a010 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
1a020 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f  #else.      p->o
1a030 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65  ut = popen(zFile
1a040 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20   + 1, "w");.    
1a050 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
1a060 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1a070 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1a080 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69  : cannot open pi
1a090 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  pe \"%s\"\n", zF
1a0a0 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ile + 1);.      
1a0b0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
1a0c0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1a0d0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1a0e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a0f0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1a100 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
1a110 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
1a120 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  File);.      }.#
1a130 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1a140 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
1a150 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
1a160 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (zFile);.      i
1a170 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
1a180 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
1a190 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21  mp(zFile,"off")!
1a1a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a1b0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1a1c0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
1a1d0 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
1a1e0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
1a1f0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f    }.        p->o
1a200 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
1a210 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
1a220 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1a230 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1a240 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
1a250 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
1a260 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
1a270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a280 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
1a290 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26  c=='p' && n>=3 &
1a2a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
1a2b0 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d  0], "print", n)=
1a2c0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1a2d0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1a2e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
1a2f0 20 20 69 66 28 20 69 3e 31 20 29 20 66 70 72 69    if( i>1 ) fpri
1a300 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29  ntf(p->out, " ")
1a310 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1a320 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a  p->out, "%s", az
1a330 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[i]);.    }. 
1a340 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
1a350 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  t, "\n");.  }els
1a360 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
1a370 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
1a380 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e  [0], "prompt", n
1a390 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
1a3a0 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20  nArg >= 2) {.   
1a3b0 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50     strncpy(mainP
1a3c0 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28  rompt,azArg[1],(
1a3d0 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61  int)ArraySize(ma
1a3e0 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20  inPrompt)-1);.  
1a3f0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
1a400 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73   >= 3) {.      s
1a410 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50  trncpy(continueP
1a420 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28  rompt,azArg[2],(
1a430 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f  int)ArraySize(co
1a440 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29  ntinuePrompt)-1)
1a450 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1a460 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26  .  if( c=='q' &&
1a470 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
1a480 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30  ], "quit", n)==0
1a490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a   ){.    rc = 2;.
1a4a0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
1a4b0 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='r' && n>=3 &&
1a4c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
1a4d0 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30  ], "read", n)==0
1a4e0 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c   ){.    FILE *al
1a4f0 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  t;.    if( nArg!
1a500 3d 32 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =2 ){.      fpri
1a510 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
1a520 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e  ge: .read FILE\n
1a530 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
1a540 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
1a550 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
1a560 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20      }.    alt = 
1a570 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
1a580 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61  "rb");.    if( a
1a590 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  lt==0 ){.      f
1a5a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1a5b0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
1a5c0 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  n \"%s\"\n", azA
1a5d0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
1a5e0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1a5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63  .      rc = proc
1a600 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74  ess_input(p, alt
1a610 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
1a620 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  alt);.    }.  }e
1a630 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72  lse..  if( c=='r
1a640 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
1a650 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
1a660 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20  restore", n)==0 
1a670 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1a680 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20  r *zSrcFile;.   
1a690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
1a6b0 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Src;.    sqlite3
1a6c0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
1a6d0 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f  ;.    int nTimeo
1a6e0 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ut = 0;..    if(
1a6f0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
1a700 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41    zSrcFile = azA
1a710 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62  rg[1];.      zDb
1a720 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d   = "main";.    }
1a730 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 33  else if( nArg==3
1a740 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69   ){.      zSrcFi
1a750 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
1a760 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67       zDb = azArg
1a770 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [1];.    }else{.
1a780 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1a790 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
1a7a0 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
1a7b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
1a7c0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
1a7d0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
1a7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a7f0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53   sqlite3_open(zS
1a800 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a  rcFile, &pSrc);.
1a810 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
1a830 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1a840 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
1a850 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53  en \"%s\"\n", zS
1a860 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  rcFile);.      s
1a870 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
1a880 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
1a890 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
1a8a0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
1a8b0 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
1a8c0 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
1a8d0 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c  ->db, zDb, pSrc,
1a8e0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
1a8f0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
1a900 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1a910 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1a920 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
1a930 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
1a940 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1a950 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
1a960 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a970 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
1a980 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
1a990 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
1a9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
1a9b0 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
1a9c0 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20  ITE_BUSY  ){.   
1a9d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a9e0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
1a9f0 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
1aa00 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
1aa10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
1aa20 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
1aa30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1aa40 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
1aa50 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
1aa60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aa70 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
1aa80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1aa90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
1aaa0 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
1aab0 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
1aac0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1aad0 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65  , "Error: source
1aae0 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73   database is bus
1aaf0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  y\n");.      rc 
1ab00 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1ab10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1ab20 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1ab30 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
1ab40 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
1ab50 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
1ab60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
1ab70 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73  se(pSrc);.  }els
1ab80 65 0a 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  e...  if( c=='s'
1ab90 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
1aba0 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73  g[0], "scanstats
1abb0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
1abc0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
1abd0 20 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74       p->scanstat
1abe0 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  sOn = booleanVal
1abf0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  ue(azArg[1]);.#i
1ac00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
1ac10 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
1ac20 54 55 53 0a 20 20 20 20 20 20 66 70 72 69 6e 74  TUS.      fprint
1ac30 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69  f(stderr, "Warni
1ac40 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e  ng: .scanstats n
1ac50 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
1ac60 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b  this build.\n");
1ac70 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1ac80 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
1ac90 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
1aca0 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f   .scanstats on|o
1acb0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
1acc0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
1acd0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
1ace0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
1acf0 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c  rg[0], "schema",
1ad00 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
1ad10 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
1ad20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
1ad30 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
1ad40 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d  b(p, 0);.    mem
1ad50 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
1ad60 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
1ad70 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
1ad80 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d   = 0;.    data.m
1ad90 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b  ode = MODE_Semi;
1ada0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
1adb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1adc0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1add0 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b  azArg[1][i]; i++
1ade0 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20 3d 20  ) azArg[1][i] = 
1adf0 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d  ToLower(azArg[1]
1ae00 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
1ae10 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
1ae20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  "sqlite_master")
1ae30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
1ae40 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d  har *new_argv[2]
1ae50 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a  , *new_colv[2];.
1ae60 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
1ae70 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41  [0] = "CREATE TA
1ae80 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  BLE sqlite_maste
1ae90 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  r (\n".         
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
1aeb0 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
1aee0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
1aef0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
1af00 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
1af30 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
1af60 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
1af70 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20           ")";.  
1af80 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
1af90 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
1afa0 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
1afb0 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
1afc0 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
1afd0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
1afe0 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
1aff0 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
1b000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b010 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
1b020 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
1b030 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d  g[1],"sqlite_tem
1b040 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  p_master")==0 ){
1b050 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
1b060 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
1b070 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
1b080 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
1b090 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
1b0a0 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  LE sqlite_temp_m
1b0b0 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20  aster (\n".     
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
1b0e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1b0f0 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
1b100 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b120 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
1b130 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
1b140 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
1b150 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
1b160 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1b170 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
1b180 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
1b1a0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
1b1b0 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
1b1c0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
1b1d0 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
1b1e0 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
1b1f0 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
1b200 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
1b210 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
1b220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1b240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53  else{.        zS
1b250 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41  hellStatic = azA
1b260 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72  rg[1];.        r
1b270 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1b280 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
1b290 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
1b2a0 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  OM ".          "
1b2b0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
1b2c0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
1b2d0 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
1b2e0 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
1b2f0 64 20 78 22 0a 20 20 20 20 20 20 20 20 20 20 22  d x".          "
1b300 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
1b310 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
1b320 4c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  L".          "  
1b330 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70   SELECT sql, typ
1b340 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
1b350 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71  e, rowid FROM sq
1b360 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
1b370 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57  ) ".          "W
1b380 48 45 52 45 20 6c 6f 77 65 72 28 74 62 6c 5f 6e  HERE lower(tbl_n
1b390 61 6d 65 29 20 4c 49 4b 45 20 73 68 65 6c 6c 73  ame) LIKE shells
1b3a0 74 61 74 69 63 28 29 22 0a 20 20 20 20 20 20 20  tatic()".       
1b3b0 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 21 3d     "  AND type!=
1b3c0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
1b3d0 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20  OTNULL ".       
1b3e0 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77     "ORDER BY row
1b3f0 69 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63  id",.          c
1b400 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
1b410 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
1b420 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20     zShellStatic 
1b430 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b440 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
1b450 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
1b460 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1b470 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 53  >db,.         "S
1b480 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22  ELECT sql FROM "
1b490 0a 20 20 20 20 20 20 20 20 20 22 20 20 28 53 45  .         "  (SE
1b4a0 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
1b4b0 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
1b4c0 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
1b4d0 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
1b4e0 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 46           "     F
1b4f0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1b500 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
1b510 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54        "   SELECT
1b520 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f   sql, type, tbl_
1b530 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69  name, name, rowi
1b540 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65  d FROM sqlite_te
1b550 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20  mp_master) ".   
1b560 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
1b570 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
1b580 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61  l NOTNULL AND na
1b590 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
1b5a0 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20  ite_%' ".       
1b5b0 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
1b5c0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 63 61 6c  d",.         cal
1b5d0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
1b5e0 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a  ErrMsg.      );.
1b5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b600 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1b610 20 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61   "Usage: .schema
1b620 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
1b630 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
1b640 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
1b650 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
1b660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
1b670 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1b680 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1b690 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
1b6a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
1b6b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1b6c0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
1b6d0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1b6e0 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
1b6f0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1b700 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1b710 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61   querying schema
1b720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29   information\n")
1b730 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
1b740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b750 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
1b760 20 7d 65 6c 73 65 0a 0a 0a 23 69 66 20 64 65 66   }else...#if def
1b770 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1b780 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
1b790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
1b7a0 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63  CTTRACE).  if( c
1b7b0 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26  =='s' && n==11 &
1b7c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
1b7d0 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65  0], "selecttrace
1b7e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
1b7f0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1b800 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20  e3SelectTrace;. 
1b810 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1b820 54 72 61 63 65 20 3d 20 69 6e 74 65 67 65 72 56  Trace = integerV
1b830 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
1b840 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
1b850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b860 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75  EBUG.  /* Undocu
1b870 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  mented commands 
1b880 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  for internal tes
1b890 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74  ting.  Subject t
1b8a0 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69  o change.  ** wi
1b8b0 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f  thout notice. */
1b8c0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
1b8d0 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d   n>=10 && strncm
1b8e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
1b8f0 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29  ftest-", 9)==0 )
1b900 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
1b910 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62  p(azArg[0]+9, "b
1b920 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30  oolean", n-9)==0
1b930 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
1b940 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
1b950 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
1b960 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f  .        v = boo
1b970 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
1b980 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  i]);.        fpr
1b990 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
1b9a0 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a  : %d 0x%x\n", az
1b9b0 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20  Arg[i], v, v);. 
1b9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b9d0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
1b9e0 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65  rg[0]+9, "intege
1b9f0 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20  r", n-9)==0 ){. 
1ba00 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69       int i; sqli
1ba10 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20  te3_int64 v;.   
1ba20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
1ba30 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1ba40 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
1ba50 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e  ;.        v = in
1ba60 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
1ba70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1ba80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1ba90 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
1baa0 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c  ,"%s: %lld 0x%ll
1bab0 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76  x\n", azArg[i],v
1bac0 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ,v);.        fpr
1bad0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
1bae0 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ", zBuf);.      
1baf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
1bb00 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
1bb10 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
1bb20 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72  azArg[0], "separ
1bb30 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ator", n)==0 ){.
1bb40 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c      if( nArg<2 |
1bb50 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  | nArg>3 ){.    
1bb60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1bb70 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72  , "Usage: .separ
1bb80 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e  ator COL ?ROW?\n
1bb90 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
1bba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bbb0 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20  nArg>=2 ){.     
1bbc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1bbd0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
1bbe0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
1bbf0 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20  lSeparator,.    
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29     "%.*s", (int)
1bc20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
1bc30 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a  Separator)-1, az
1bc40 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[1]);.    }. 
1bc50 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
1bc60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1bc70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1bc80 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
1bc90 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
1bca0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1bcb0 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
1bcc0 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
1bcd0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
1bce0 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  )-1, azArg[2]);.
1bcf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
1bd00 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20 20 26   if( c=='s'.   &
1bd10 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
1bd20 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29  [0], "shell", n)
1bd30 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61  ==0 || strncmp(a
1bd40 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22  zArg[0],"system"
1bd50 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ,n)==0).  ){.   
1bd60 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
1bd70 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 69   int i, x;.    i
1bd80 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
1bd90 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1bda0 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 79 73 74  r, "Usage: .syst
1bdb0 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a  em COMMAND\n");.
1bdc0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
1bdd0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
1bde0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
1bdf0 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c  }.    zCmd = sql
1be00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72  ite3_mprintf(str
1be10 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20 27  chr(azArg[1],' '
1be20 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73 5c  )==0?"%s":"\"%s\
1be30 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  "", azArg[1]);. 
1be40 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41     for(i=2; i<nA
1be50 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1be60 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zCmd = sqlite3_m
1be70 70 72 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a  printf(strchr(az
1be80 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f 22  Arg[i],' ')==0?"
1be90 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25 73 5c  %z %s":"%z \"%s\
1bea0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d 29   zCmd, azArg[i])
1bed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20  ;.    }.    x = 
1bee0 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20  system(zCmd);.  
1bef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1bf00 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 78 20  Cmd);.    if( x 
1bf10 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ) fprintf(stderr
1bf20 2c 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61 6e  , "System comman
1bf30 64 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  d returns %d\n",
1bf40 20 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20   x);.  }else..  
1bf50 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
1bf60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
1bf70 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b  "show", n)==0 ){
1bf80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bf90 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20  if( nArg!=1 ){. 
1bfa0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1bfb0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 68  err, "Usage: .sh
1bfc0 6f 77 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ow\n");.      rc
1bfd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
1bfe0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
1bff0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  it;.    }.    fp
1c000 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31  rintf(p->out,"%1
1c010 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63  2.12s: %s\n","ec
1c020 68 6f 22 2c 20 70 2d 3e 65 63 68 6f 4f 6e 20 3f  ho", p->echoOn ?
1c030 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
1c040 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
1c050 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  ut,"%12.12s: %s\
1c060 6e 22 2c 22 65 71 70 22 2c 20 70 2d 3e 61 75 74  n","eqp", p->aut
1c070 6f 45 51 50 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  oEQP ? "on" : "o
1c080 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
1c090 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
1c0a0 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22   %s\n","explain"
1c0b0 2c 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e  , p->normalMode.
1c0c0 76 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a 22 6f  valid ? "on" :"o
1c0d0 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
1c0e0 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
1c0f0 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72  s: %s\n","header
1c100 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  s", p->showHeade
1c110 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22  r ? "on" : "off"
1c120 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
1c130 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
1c140 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
1c150 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
1c160 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
1c170 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
1c180 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b  ", "nullvalue");
1c190 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
1c1a0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
1c1b0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
1c1c0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
1c1d0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ut, "\n");.    f
1c1e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
1c1f0 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6f  12.12s: %s\n","o
1c200 75 74 70 75 74 22 2c 0a 20 20 20 20 20 20 20 20  utput",.        
1c210 20 20 20 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e      strlen30(p->
1c220 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75  outfile) ? p->ou
1c230 74 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22  tfile : "stdout"
1c240 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
1c250 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
1c260 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72  ", "colseparator
1c270 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
1c280 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
1c290 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
1c2a0 72 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  r);.      fprint
1c2b0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
1c2c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
1c2d0 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c  out,"%12.12s: ",
1c2e0 20 22 72 6f 77 73 65 70 61 72 61 74 6f 72 22 29   "rowseparator")
1c2f0 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
1c300 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
1c310 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
1c320 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1c330 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
1c340 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
1c350 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  t,"%12.12s: %s\n
1c360 22 2c 22 73 74 61 74 73 22 2c 20 70 2d 3e 73 74  ","stats", p->st
1c370 61 74 73 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22  atsOn ? "on" : "
1c380 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  off");.    fprin
1c390 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
1c3a0 32 73 3a 20 22 2c 22 77 69 64 74 68 22 29 3b 0a  2s: ","width");.
1c3b0 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28      for (i=0;i<(
1c3c0 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
1c3d0 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d  >colWidth) && p-
1c3e0 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20  >colWidth[i] != 
1c3f0 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66  0;i++) {.      f
1c400 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
1c410 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b  d ",p->colWidth[
1c420 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
1c430 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
1c440 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
1c450 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
1c460 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
1c470 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29  "stats", n)==0 )
1c480 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
1c490 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74  2 ){.      p->st
1c4a0 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56  atsOn = booleanV
1c4b0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
1c4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c4d0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c4e0 20 22 55 73 61 67 65 3a 20 2e 73 74 61 74 73 20   "Usage: .stats 
1c4f0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
1c500 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
1c510 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
1c520 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20  =='t' && n>1 && 
1c530 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
1c540 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d 3d  , "tables", n)==
1c550 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1c560 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1c570 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c    char **azResul
1c580 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c  t;.    int nRow,
1c590 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 63 68 61   nAlloc;.    cha
1c5a0 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20  r *zSql = 0;.   
1c5b0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 6f 70 65   int ii;.    ope
1c5c0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
1c5d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1c5e0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
1c5f0 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
1c600 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d  list", -1, &pStm
1c610 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
1c620 63 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  c ) return shell
1c630 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d  DatabaseError(p-
1c640 3e 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  >db);..    /* Cr
1c650 65 61 74 65 20 61 6e 20 53 51 4c 20 73 74 61 74  eate an SQL stat
1c660 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79 20 66  ement to query f
1c670 6f 72 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  or the list of t
1c680 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 20  ables in the.   
1c690 20 2a 2a 20 6d 61 69 6e 20 61 6e 64 20 61 6c 6c   ** main and all
1c6a0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1c6b0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 74 61  ses where the ta
1c6c0 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  ble name matches
1c6d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 4c 49 4b 45   the.    ** LIKE
1c6e0 20 70 61 74 74 65 72 6e 20 62 6f 75 6e 64 20 74   pattern bound t
1c6f0 6f 20 76 61 72 69 61 62 6c 65 20 22 3f 31 22 2e  o variable "?1".
1c700 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   */.    zSql = s
1c710 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1c720 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1c730 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
1c740 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
1c750 20 22 20 57 48 45 52 45 20 74 79 70 65 20 49 4e   " WHERE type IN
1c760 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
1c770 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 41  )".        "   A
1c780 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
1c790 20 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20   'sqlite_%%'".  
1c7a0 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61        "   AND na
1c7b0 6d 65 20 4c 49 4b 45 20 3f 31 22 29 3b 0a 20 20  me LIKE ?1");.  
1c7c0 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 20 26 26    while( zSql &&
1c7d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1c7e0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1c7f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1c800 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
1c810 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1c820 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1c830 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
1c840 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30    if( zDbName==0
1c850 20 7c 7c 20 73 74 72 63 6d 70 28 7a 44 62 4e 61   || strcmp(zDbNa
1c860 6d 65 2c 22 6d 61 69 6e 22 29 3d 3d 30 20 29 20  me,"main")==0 ) 
1c870 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c880 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 4e 61  if( strcmp(zDbNa
1c890 6d 65 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b  me,"temp")==0 ){
1c8a0 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
1c8b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1c8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c8d0 20 20 22 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c 20    "%z UNION ALL 
1c8e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1c8f0 20 20 20 22 53 45 4c 45 43 54 20 27 74 65 6d 70     "SELECT 'temp
1c900 2e 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20  .' || name FROM 
1c910 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
1c920 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1c930 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
1c940 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76  e IN ('table','v
1c950 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20  iew')".         
1c960 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
1c970 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
1c980 71 6c 69 74 65 5f 25 25 27 22 0a 20 20 20 20 20  qlite_%%'".     
1c990 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
1c9a0 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31  AND name LIKE ?1
1c9b0 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
1c9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
1c9d0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1c9e0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1c9f0 20 20 20 20 20 20 20 20 22 25 7a 20 55 4e 49 4f          "%z UNIO
1ca00 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20  N ALL ".        
1ca10 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
1ca20 20 27 25 71 2e 27 20 7c 7c 20 6e 61 6d 65 20 46   '%q.' || name F
1ca30 52 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74  ROM \"%w\".sqlit
1ca40 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
1ca50 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
1ca60 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
1ca70 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  le','view')".   
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1ca90 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c    AND name NOT L
1caa0 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 25 27 22  IKE 'sqlite_%%'"
1cab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cac0 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c    "   AND name L
1cad0 49 4b 45 20 3f 31 22 2c 20 7a 53 71 6c 2c 20 7a  IKE ?1", zSql, z
1cae0 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  DbName, zDbName)
1caf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cb00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cb10 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1cb20 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 26  ;.    if( zSql &
1cb30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1cb40 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
1cb50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1cb60 22 25 7a 20 4f 52 44 45 52 20 42 59 20 31 22 2c  "%z ORDER BY 1",
1cb70 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66   zSql);.      if
1cb80 28 20 7a 53 71 6c 20 29 20 72 63 20 3d 20 73 71  ( zSql ) rc = sq
1cb90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1cba0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
1cbb0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1cbc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1cbd0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1cbe0 69 66 28 20 21 7a 53 71 6c 20 29 20 72 65 74 75  if( !zSql ) retu
1cbf0 72 6e 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72  rn shellNomemErr
1cc00 6f 72 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63  or();.    if( rc
1cc10 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
1cc20 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
1cc30 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  db);..    /* Run
1cc40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1cc50 6e 74 20 70 72 65 70 61 72 65 64 20 62 79 20 74  nt prepared by t
1cc60 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
1cc70 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
1cc80 73 0a 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 61  s.    ** as an a
1cc90 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d  rray of nul-term
1cca0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 20 69  inated strings i
1ccb0 6e 20 61 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a  n azResult[].  *
1ccc0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c  /.    nRow = nAl
1ccd0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52  loc = 0;.    azR
1cce0 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69  esult = 0;.    i
1ccf0 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  f( nArg>1 ){.   
1cd00 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1cd10 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61  text(pStmt, 1, a
1cd20 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c  zArg[1], -1, SQL
1cd30 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1cd40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1cd60 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22  xt(pStmt, 1, "%"
1cd70 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
1cd80 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
1cd90 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
1cda0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1cdb0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
1cdc0 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63  if( nRow>=nAlloc
1cdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1cde0 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   **azNew;.      
1cdf0 20 20 69 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f    int n2 = nAllo
1ce00 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  c*2 + 10;.      
1ce10 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65    azNew = sqlite
1ce20 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65  3_realloc64(azRe
1ce30 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52  sult, sizeof(azR
1ce40 65 73 75 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20  esult[0])*n2);. 
1ce50 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77         if( azNew
1ce60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1ce70 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d   rc = shellNomem
1ce80 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1ce90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cea0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c    }.        nAll
1ceb0 6f 63 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20  oc = n2;.       
1cec0 20 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65   azResult = azNe
1ced0 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
1cee0 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20   azResult[nRow] 
1cef0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1cf00 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
1cf10 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
1cf20 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66  t, 0));.      if
1cf30 28 20 30 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52  ( 0==azResult[nR
1cf40 6f 77 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ow] ){.        r
1cf50 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  c = shellNomemEr
1cf60 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
1cf70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1cf80 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20      nRow++;.    
1cf90 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1cfa0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1cfb0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
1cfc0 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
1cfd0 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d  DatabaseError(p-
1cfe0 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >db);.    }..   
1cff0 20 2f 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74   /* Pretty-print
1d000 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d010 20 61 72 72 61 79 20 61 7a 52 65 73 75 6c 74 5b   array azResult[
1d020 5d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  ] to the output 
1d030 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  */.    if( rc==0
1d040 20 26 26 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20   && nRow>0 ){.  
1d050 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78      int len, max
1d060 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  len = 0;.      i
1d070 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69  nt i, j;.      i
1d080 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50  nt nPrintCol, nP
1d090 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66  rintRow;.      f
1d0a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20  or(i=0; i<nRow; 
1d0b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  i++){.        le
1d0c0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52  n = strlen30(azR
1d0d0 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20  esult[i]);.     
1d0e0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
1d0f0 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
1d100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d110 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28  nPrintCol = 80/(
1d120 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20  maxlen+2);.     
1d130 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31   if( nPrintCol<1
1d140 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31   ) nPrintCol = 1
1d150 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f  ;.      nPrintRo
1d160 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69  w = (nRow + nPri
1d170 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e  ntCol - 1)/nPrin
1d180 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  tCol;.      for(
1d190 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77  i=0; i<nPrintRow
1d1a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d1b0 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b  for(j=i; j<nRow;
1d1c0 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a   j+=nPrintRow){.
1d1d0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1d1e0 7a 53 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f  zSp = j<nPrintRo
1d1f0 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20  w ? "" : "  ";. 
1d200 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1d210 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73  (p->out, "%s%-*s
1d220 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20  ", zSp, maxlen, 
1d230 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a  azResult[j] ? az
1d240 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20  Result[j]:"");. 
1d250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d260 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
1d270 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
1d280 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
1d290 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69  i=0; ii<nRow; ii
1d2a0 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ++) sqlite3_free
1d2b0 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a  (azResult[ii]);.
1d2c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d2d0 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65  (azResult);.  }e
1d2e0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74  lse..  if( c=='t
1d2f0 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73 74 72  ' && n>=8 && str
1d300 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
1d310 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d 30  testctrl", n)==0
1d320 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
1d330 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1d340 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
1d350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72  const char *zCtr
1d360 6c 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  lName;   /* Name
1d370 20 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72   of a test-contr
1d380 6f 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ol option */.   
1d390 20 20 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65      int ctrlCode
1d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d3b0 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72  Integer code for
1d3c0 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a   that option */.
1d3d0 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20      } aCtrl[] = 
1d3e0 7b 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f  {.      { "prng_
1d3f0 73 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  save",          
1d400 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
1d410 52 4c 5f 50 52 4e 47 5f 53 41 56 45 20 20 20 20  RL_PRNG_SAVE    
1d420 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1d430 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f     { "prng_resto
1d440 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  re",          SQ
1d450 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1d460 4e 47 5f 52 45 53 54 4f 52 45 20 20 20 20 20 20  NG_RESTORE      
1d470 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
1d480 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20 20 20  "prng_reset",   
1d490 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1d4a0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1d4b0 53 45 54 20 20 20 20 20 20 20 20 20 20 20 20 20  SET             
1d4c0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 69 74 76  },.      { "bitv
1d4d0 65 63 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  ec_test",       
1d4e0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
1d4f0 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 20  TRL_BITVEC_TEST 
1d500 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1d510 20 20 20 20 7b 20 22 66 61 75 6c 74 5f 69 6e 73      { "fault_ins
1d520 74 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 53  tall",         S
1d530 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
1d540 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 20 20 20 20  AULT_INSTALL    
1d550 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
1d560 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f   "benign_malloc_
1d570 68 6f 6f 6b 73 22 2c 20 20 20 53 51 4c 49 54 45  hooks",   SQLITE
1d580 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
1d590 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 20 20 20  _MALLOC_HOOKS   
1d5a0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 65 6e   },.      { "pen
1d5b0 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20 20 20  ding_byte",     
1d5c0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
1d5d0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1d5e0 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  E           },. 
1d5f0 20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c       { "assert",
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d620 41 53 53 45 52 54 20 20 20 20 20 20 20 20 20 20  ASSERT          
1d630 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
1d640 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20  { "always",     
1d650 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1d660 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1d670 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1d680 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65    },.      { "re
1d690 73 65 72 76 65 22 2c 20 20 20 20 20 20 20 20 20  serve",         
1d6a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
1d6b0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 20 20 20  TCTRL_RESERVE   
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1d6d0 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a        { "optimiz
1d6e0 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20 20 20  ations",        
1d6f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d700 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 20 20  _OPTIMIZATIONS  
1d710 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
1d720 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20   { "iskeyword", 
1d730 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1d740 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1d750 59 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20  YWORD           
1d760 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
1d770 63 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c 20 20  cratchmalloc",  
1d780 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
1d790 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1d7a0 4c 4c 4f 43 20 20 20 20 20 20 20 20 20 20 7d 2c  LLOC          },
1d7b0 0a 20 20 20 20 20 20 7b 20 22 62 79 74 65 6f 72  .      { "byteor
1d7c0 64 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  der",           
1d7d0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
1d7e0 4c 5f 42 59 54 45 4f 52 44 45 52 20 20 20 20 20  L_BYTEORDER     
1d7f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1d800 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72 72 75    { "never_corru
1d810 70 74 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c  pt",         SQL
1d820 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1d830 45 52 5f 43 4f 52 52 55 50 54 20 20 20 20 20 20  ER_CORRUPT      
1d840 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
1d850 69 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20  imposter",      
1d860 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
1d870 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d890 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
1d8a0 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a   testctrl = -1;.
1d8b0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 30 3b      int rc2 = 0;
1d8c0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a  .    int i, n2;.
1d8d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
1d8e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76 65  );..    /* conve
1d8f0 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78 74  rt testctrl text
1d900 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65   option to value
1d910 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69 71  . allow any uniq
1d920 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a 2a  ue prefix.    **
1d930 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 6e   of the option n
1d940 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72 69  ame, or a numeri
1d950 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  cal value. */.  
1d960 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28    n2 = strlen30(
1d970 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
1d980 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1d990 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29  ize(aCtrl); i++)
1d9a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
1d9b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43  cmp(azArg[1], aC
1d9c0 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
1d9d0 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
1d9e0 20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c      if( testctrl
1d9f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1da00 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c  testctrl = aCtrl
1da10 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20  [i].ctrlCode;.  
1da20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1da30 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1da40 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75  tderr, "ambiguou
1da50 73 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c  s option name: \
1da60 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
1da70 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  1]);.          t
1da80 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20  estctrl = -1;.  
1da90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1daa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
1dac0 65 73 74 63 74 72 6c 3c 30 20 29 20 74 65 73 74  estctrl<0 ) test
1dad0 63 74 72 6c 20 3d 20 28 69 6e 74 29 69 6e 74 65  ctrl = (int)inte
1dae0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
1daf0 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 74 65 73  ]);.    if( (tes
1db00 74 63 74 72 6c 3c 53 51 4c 49 54 45 5f 54 45 53  tctrl<SQLITE_TES
1db10 54 43 54 52 4c 5f 46 49 52 53 54 29 20 7c 7c 20  TCTRL_FIRST) || 
1db20 28 74 65 73 74 63 74 72 6c 3e 53 51 4c 49 54 45  (testctrl>SQLITE
1db30 5f 54 45 53 54 43 54 52 4c 5f 4c 41 53 54 29 20  _TESTCTRL_LAST) 
1db40 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1db50 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
1db60 69 6e 76 61 6c 69 64 20 74 65 73 74 63 74 72 6c  invalid testctrl
1db70 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
1db80 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
1db90 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74  else{.      swit
1dba0 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20  ch(testctrl){.. 
1dbb0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1dbc0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1dbd0 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a  nt, db, int) */.
1dbe0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1dbf0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
1dc00 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20  IMIZATIONS:.    
1dc10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dc20 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1dc30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  :             . 
1dc40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
1dc50 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
1dc60 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 28 69      int opt = (i
1dc70 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b  nt)strtol(azArg[
1dc80 32 5d 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 20  2], 0, 0);      
1dc90 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72    .            r
1dca0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
1dcb0 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
1dcc0 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b  rl, p->db, opt);
1dcd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
1dce0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
1dcf0 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63   (0x%08x)\n", rc
1dd00 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20  2, rc2);.       
1dd10 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1dd20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1dd30 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74  stderr,"Error: t
1dd40 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73  estctrl %s takes
1dd50 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70   a single int op
1dd60 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  tion\n",.       
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
1dd80 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
1dd90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
1dda0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  eak;..        /*
1ddb0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ddc0 6e 74 72 6f 6c 28 69 6e 74 29 20 2a 2f 0a 20 20  ntrol(int) */.  
1ddd0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1dde0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1ddf0 53 41 56 45 3a 0a 20 20 20 20 20 20 20 20 63 61  SAVE:.        ca
1de00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1de10 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
1de20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1de30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1de40 4e 47 5f 52 45 53 45 54 3a 0a 20 20 20 20 20 20  NG_RESET:.      
1de50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1de60 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
1de70 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
1de80 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
1de90 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
1dea0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1deb0 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a 20 20 20  l(testctrl);.   
1dec0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1ded0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78  (p->out, "%d (0x
1dee0 25 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72  %08x)\n", rc2, r
1def0 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  c2);.          }
1df00 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1df10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1df20 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63  rr,"Error: testc
1df30 74 72 6c 20 25 73 20 74 61 6b 65 73 20 6e 6f 20  trl %s takes no 
1df40 6f 70 74 69 6f 6e 73 5c 6e 22 2c 20 61 7a 41 72  options\n", azAr
1df50 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
1df60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
1df70 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ak;..        /* 
1df80 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1df90 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20  trol(int, uint) 
1dfa0 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
1dfb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1dfc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 20 20  PENDING_BYTE:   
1dfd0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1dfe0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
1dff0 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
1e000 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20 28 75  ned int opt = (u
1e010 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e 74 65  nsigned int)inte
1e020 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  gerValue(azArg[2
1e030 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1e040 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
1e050 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
1e060 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  trl, opt);.     
1e070 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
1e080 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30  ->out, "%d (0x%0
1e090 38 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32  8x)\n", rc2, rc2
1e0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  );.          } e
1e0b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
1e0c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1e0d0 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72  ,"Error: testctr
1e0e0 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e  l %s takes a sin
1e0f0 67 6c 65 20 75 6e 73 69 67 6e 65 64 22 0a 20 20  gle unsigned".  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 20 20 20 22 20 69 6e 74 20 6f           " int o
1e120 70 74 69 6f 6e 5c 6e 22 2c 20 61 7a 41 72 67 5b  ption\n", azArg[
1e130 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  1]);.          }
1e140 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1e150 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
1e160 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1e170 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
1e180 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
1e190 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e1a0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 20  STCTRL_ASSERT:  
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
1e1c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1e1d0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1e1e0 3a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  :      .        
1e1f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e200 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1e210 50 54 3a 20 20 20 20 20 20 20 20 0a 20 20 20 20  PT:        .    
1e220 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
1e230 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
1e240 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65   int opt = boole
1e250 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  anValue(azArg[2]
1e260 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  );        .     
1e270 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
1e280 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e290 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
1e2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
1e2b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1e2c0 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72  d (0x%08x)\n", r
1e2d0 63 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20  c2, rc2);.      
1e2e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1e2f0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1e300 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
1e310 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65  testctrl %s take
1e320 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 20 6f  s a single int o
1e330 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20  ption\n",.      
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b        azArg[1]);
1e360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e370 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
1e380 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1e390 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1e3a0 6e 74 2c 20 63 68 61 72 20 2a 29 20 2a 2f 0a 23  nt, char *) */.#
1e3b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
1e3c0 45 59 57 4f 52 44 0a 20 20 20 20 20 20 20 20 63  EYWORD.        c
1e3d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e3e0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 20  TRL_ISKEYWORD:  
1e3f0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1e400 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
1e410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1e420 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 20 3d  onst char *opt =
1e430 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20   azArg[2];      
1e440 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72    .            r
1e450 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
1e460 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
1e470 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
1e480 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
1e490 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38  >out, "%d (0x%08
1e4a0 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29  x)\n", rc2, rc2)
1e4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
1e4c0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1e4d0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1e4e0 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c  "Error: testctrl
1e4f0 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67   %s takes a sing
1e500 6c 65 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e  le char * option
1e510 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
1e540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e550 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
1e560 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1e570 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
1e580 50 4f 53 54 45 52 3a 0a 20 20 20 20 20 20 20 20  POSTER:.        
1e590 20 20 69 66 28 20 6e 41 72 67 3d 3d 35 20 29 7b    if( nArg==5 ){
1e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32  .            rc2
1e5b0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
1e5c0 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
1e5d0 2c 20 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  , p->db, .      
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20      azArg[2],.  
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 56          integerV
1e620 61 6c 75 65 28 61 7a 41 72 67 5b 33 5d 29 2c 0a  alue(azArg[3]),.
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 65            intege
1e650 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29  rValue(azArg[4])
1e660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
1e670 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1e680 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20  %d (0x%08x)\n", 
1e690 72 63 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20  rc2, rc2);.     
1e6a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e6b0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1e6c0 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20 2e  stderr,"Usage: .
1e6d0 74 65 73 74 63 74 72 6c 20 69 6d 70 6f 73 74 65  testctrl imposte
1e6e0 72 20 64 62 4e 61 6d 65 20 6f 6e 6f 66 66 20 74  r dbName onoff t
1e6f0 6e 75 6d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  num\n");.       
1e700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
1e710 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63  reak;..        c
1e720 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e730 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
1e740 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1e750 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e760 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
1e770 54 41 4c 4c 3a 20 20 20 20 20 20 20 0a 20 20 20  TALL:       .   
1e780 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1e790 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
1e7a0 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 0a  _MALLOC_HOOKS: .
1e7b0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1e7c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
1e7d0 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 20 20 20 20  ATCHMALLOC:     
1e7e0 20 20 0a 20 20 20 20 20 20 20 20 64 65 66 61 75    .        defau
1e7f0 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 66 70  lt:.          fp
1e800 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
1e810 72 6f 72 3a 20 43 4c 49 20 73 75 70 70 6f 72 74  ror: CLI support
1e820 20 66 6f 72 20 74 65 73 74 63 74 72 6c 20 25 73   for testctrl %s
1e830 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   not implemented
1e840 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e850 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
1e860 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e870 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1e880 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
1e890 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26 26  c=='t' && n>4 &&
1e8a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
1e8b0 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29  ], "timeout", n)
1e8c0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
1e8d0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  db(p, 0);.    sq
1e8e0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
1e8f0 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72 67 3e 3d  ut(p->db, nArg>=
1e900 32 20 3f 20 28 69 6e 74 29 69 6e 74 65 67 65 72  2 ? (int)integer
1e910 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
1e920 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  : 0);.  }else.  
1e930 20 20 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20    .  if( c=='t' 
1e940 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
1e950 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
1e960 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mer", n)==0 ){. 
1e970 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
1e980 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69  {.      enableTi
1e990 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  mer = booleanVal
1e9a0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
1e9b0 20 20 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69      if( enableTi
1e9c0 6d 65 72 20 26 26 20 21 48 41 53 5f 54 49 4d 45  mer && !HAS_TIME
1e9d0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  R ){.        fpr
1e9e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1e9f0 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f 74 20 61  ror: timer not a
1ea00 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73  vailable on this
1ea10 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b 0a 20 20   system.\n");.  
1ea20 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65        enableTime
1ea30 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1ea40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ea50 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1ea60 22 55 73 61 67 65 3a 20 2e 74 69 6d 65 72 20 6f  "Usage: .timer o
1ea70 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
1ea80 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
1ea90 20 7d 65 6c 73 65 0a 20 20 0a 20 20 69 66 28 20   }else.  .  if( 
1eaa0 63 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  c=='t' && strncm
1eab0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 72 61  p(azArg[0], "tra
1eac0 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
1ead0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
1eae0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
1eaf0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1eb00 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
1eb10 3a 20 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66  : .trace FILE|of
1eb20 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
1eb30 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
1eb40 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
1eb50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  t;.    }.    out
1eb60 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70  put_file_close(p
1eb70 2d 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20  ->traceOut);.   
1eb80 20 70 2d 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f   p->traceOut = o
1eb90 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
1eba0 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21  azArg[1]);.#if !
1ebb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ebc0 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
1ebd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ebe0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1ebf0 54 29 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72  T).    if( p->tr
1ec00 61 63 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  aceOut==0 ){.   
1ec10 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
1ec20 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1ec30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec40 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 2d  sqlite3_trace(p-
1ec50 3e 64 62 2c 20 73 71 6c 5f 74 72 61 63 65 5f 63  >db, sql_trace_c
1ec60 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 74 72 61 63  allback, p->trac
1ec70 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  eOut);.    }.#en
1ec80 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  dif.  }else..#if
1ec90 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1eca0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 69 66  HENTICATION.  if
1ecb0 28 20 63 3d 3d 27 75 27 20 26 26 20 73 74 72 6e  ( c=='u' && strn
1ecc0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 75  cmp(azArg[0], "u
1ecd0 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ser", n)==0 ){. 
1ece0 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
1ecf0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
1ed00 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
1ed10 75 73 65 72 20 53 55 42 43 4f 4d 4d 41 4e 44 20  user SUBCOMMAND 
1ed20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ...\n");.      r
1ed30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
1ed40 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
1ed50 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
1ed60 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
1ed70 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41    if( strcmp(azA
1ed80 72 67 5b 31 5d 2c 22 6c 6f 67 69 6e 22 29 3d 3d  rg[1],"login")==
1ed90 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
1eda0 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  Arg!=4 ){.      
1edb0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1edc0 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
1edd0 6c 6f 67 69 6e 20 55 53 45 52 20 50 41 53 53 57  login USER PASSW
1ede0 4f 52 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ORD\n");.       
1edf0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
1ee00 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
1ee10 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
1ee20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ee30 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
1ee40 69 63 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41  icate(p->db, azA
1ee50 72 67 5b 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c  rg[2], azArg[3],
1ee60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 28 69 6e 74 29 73 74 72 6c 65 6e       (int)strlen
1ee90 28 61 7a 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20  (azArg[3]));.   
1eea0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1eeb0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1eec0 65 72 72 2c 20 22 41 75 74 68 65 6e 74 69 63 61  err, "Authentica
1eed0 74 69 6f 6e 20 66 61 69 6c 65 64 20 66 6f 72 20  tion failed for 
1eee0 75 73 65 72 20 25 73 5c 6e 22 2c 20 61 7a 41 72  user %s\n", azAr
1eef0 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[2]);.        r
1ef00 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
1ef10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1ef20 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 64  cmp(azArg[1],"ad
1ef30 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
1ef40 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20  if( nArg!=5 ){. 
1ef50 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1ef60 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
1ef70 75 73 65 72 20 61 64 64 20 55 53 45 52 20 50 41  user add USER PA
1ef80 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e  SSWORD ISADMIN\n
1ef90 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
1efa0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
1efb0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
1efc0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
1efd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
1efe0 73 65 72 5f 61 64 64 28 70 2d 3e 64 62 2c 20 61  ser_add(p->db, a
1eff0 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20  zArg[2],.       
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20 28       azArg[3], (
1f020 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67  int)strlen(azArg
1f030 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [3]),.          
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61    booleanValue(a
1f060 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20  zArg[4]));.     
1f070 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f080 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1f090 72 2c 20 22 55 73 65 72 2d 41 64 64 20 66 61 69  r, "User-Add fai
1f0a0 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b  led: %d\n", rc);
1f0b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
1f0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1f0d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
1f0e0 41 72 67 5b 31 5d 2c 22 65 64 69 74 22 29 3d 3d  Arg[1],"edit")==
1f0f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
1f100 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg!=5 ){.      
1f110 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1f120 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
1f130 65 64 69 74 20 55 53 45 52 20 50 41 53 53 57 4f  edit USER PASSWO
1f140 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22 29 3b 0a  RD ISADMIN\n");.
1f150 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
1f160 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
1f170 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
1f180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1f190 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
1f1a0 63 68 61 6e 67 65 28 70 2d 3e 64 62 2c 20 61 7a  change(p->db, az
1f1b0 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20  Arg[2],.        
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20        azArg[3], 
1f1e0 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72  (int)strlen(azAr
1f1f0 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  g[3]),.         
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75       booleanValu
1f220 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20  e(azArg[4]));.  
1f230 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f240 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1f250 64 65 72 72 2c 20 22 55 73 65 72 2d 45 64 69 74  derr, "User-Edit
1f260 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20   failed: %d\n", 
1f270 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rc);.        rc 
1f280 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1f290 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1f2a0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65  p(azArg[1],"dele
1f2b0 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
1f2c0 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
1f2d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1f2e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
1f2f0 2e 75 73 65 72 20 64 65 6c 65 74 65 20 55 53 45  .user delete USE
1f300 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  R\n");.        r
1f310 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
1f320 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
1f330 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
1f340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f350 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 70 2d  3_user_delete(p-
1f360 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  >db, azArg[2]);.
1f370 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1f380 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1f390 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d 44 65  stderr, "User-De
1f3a0 6c 65 74 65 20 66 61 69 6c 65 64 3a 20 25 64 5c  lete failed: %d\
1f3b0 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
1f3c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
1f3d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f3e0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1f3f0 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
1f400 6c 6f 67 69 6e 7c 61 64 64 7c 65 64 69 74 7c 64  login|add|edit|d
1f410 65 6c 65 74 65 20 2e 2e 2e 5c 6e 22 29 3b 0a 20  elete ...\n");. 
1f420 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
1f430 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
1f440 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
1f450 20 20 20 20 0a 20 20 7d 65 6c 73 65 0a 23 65 6e      .  }else.#en
1f460 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
1f470 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
1f480 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27  N */..  if( c=='
1f490 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  v' && strncmp(az
1f4a0 41 72 67 5b 30 5d 2c 20 22 76 65 72 73 69 6f 6e  Arg[0], "version
1f4b0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
1f4c0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
1f4d0 22 53 51 4c 69 74 65 20 25 73 20 25 73 5c 6e 22  "SQLite %s %s\n"
1f4e0 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69 6f 6e   /*extra-version
1f4f0 2d 69 6e 66 6f 2a 2f 2c 0a 20 20 20 20 20 20 20  -info*/,.       
1f500 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
1f510 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73  ion(), sqlite3_s
1f520 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 7d 65  ourceid());.  }e
1f530 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76  lse..  if( c=='v
1f540 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
1f550 72 67 5b 30 5d 2c 20 22 76 66 73 6e 61 6d 65 22  rg[0], "vfsname"
1f560 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
1f570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1f580 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61  me = nArg==2 ? a
1f590 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
1f5a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73  ;.    char *zVfs
1f5b0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Name = 0;.    if
1f5c0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20  ( p->db ){.     
1f5d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1f5e0 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62  ntrol(p->db, zDb
1f5f0 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
1f600 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 56 66  TL_VFSNAME, &zVf
1f610 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  sName);.      if
1f620 28 20 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20  ( zVfsName ){.  
1f630 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
1f640 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 56  >out, "%s\n", zV
1f650 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  fsName);.       
1f660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56   sqlite3_free(zV
1f670 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  fsName);.      }
1f680 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
1f690 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1f6a0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
1f6b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1f6c0 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20  LE_WHERETRACE). 
1f6d0 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73   if( c=='w' && s
1f6e0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
1f6f0 20 22 77 68 65 72 65 74 72 61 63 65 22 2c 20 6e   "wheretrace", n
1f700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  )==0 ){.    exte
1f710 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
1f720 65 72 65 54 72 61 63 65 3b 0a 20 20 20 20 73 71  ereTrace;.    sq
1f730 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
1f740 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c  = nArg>=2 ? bool
1f750 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
1f760 5d 29 20 3a 20 30 78 66 66 3b 0a 20 20 7d 65 6c  ]) : 0xff;.  }el
1f770 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
1f780 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63   c=='w' && strnc
1f790 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69  mp(azArg[0], "wi
1f7a0 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  dth", n)==0 ){. 
1f7b0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73     int j;.    as
1f7c0 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61  sert( nArg<=Arra
1f7d0 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a  ySize(azArg) );.
1f7e0 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e      for(j=1; j<n
1f7f0 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69  Arg && j<ArraySi
1f800 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b  ze(p->colWidth);
1f810 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   j++){.      p->
1f820 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20  colWidth[j-1] = 
1f830 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
1f840 65 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  e(azArg[j]);.   
1f850 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 0a   }.  }else..  {.
1f860 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1f870 72 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e  rr, "Error: unkn
1f880 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69  own command or i
1f890 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
1f8a0 3a 20 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73  : ".      " \"%s
1f8b0 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c  \". Enter \".hel
1f8c0 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c  p\" for help\n",
1f8d0 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
1f8e0 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 6d 65 74  rc = 1;.  }..met
1f8f0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3a 0a  a_command_exit:.
1f900 20 20 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e    if( p->outCoun
1f910 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 75 74 43  t ){.    p->outC
1f920 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ount--;.    if( 
1f930 70 2d 3e 6f 75 74 43 6f 75 6e 74 3d 3d 30 20 29  p->outCount==0 )
1f940 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
1f950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1f970 72 6e 20 54 52 55 45 20 69 66 20 61 20 73 65 6d  rn TRUE if a sem
1f980 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73 20 61 6e  icolon occurs an
1f990 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 66 69  ywhere in the fi
1f9a0 72 73 74 20 4e 20 63 68 61 72 61 63 74 65 72 73  rst N characters
1f9b0 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 20 7a 5b  .** of string z[
1f9c0 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ]..*/.static int
1f9d0 20 6c 69 6e 65 5f 63 6f 6e 74 61 69 6e 73 5f 73   line_contains_s
1f9e0 65 6d 69 63 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63  emicolon(const c
1f9f0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a  har *z, int N){.
1fa00 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1fa10 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20  =0; i<N; i++){  
1fa20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20  if( z[i]==';' ) 
1fa30 72 65 74 75 72 6e 20 31 3b 20 7d 0a 20 20 72 65  return 1; }.  re
1fa40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1fa50 20 54 65 73 74 20 74 6f 20 73 65 65 20 69 66 20   Test to see if 
1fa60 61 20 6c 69 6e 65 20 63 6f 6e 73 69 73 74 73 20  a line consists 
1fa70 65 6e 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74  entirely of whit
1fa80 65 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  espace..*/.stati
1fa90 63 20 69 6e 74 20 5f 61 6c 6c 5f 77 68 69 74 65  c int _all_white
1faa0 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72  space(const char
1fab0 20 2a 7a 29 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a   *z){.  for(; *z
1fac0 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; z++){.    if( 
1fad0 49 73 53 70 61 63 65 28 7a 5b 30 5d 29 20 29 20  IsSpace(z[0]) ) 
1fae0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1faf0 28 20 2a 7a 3d 3d 27 2f 27 20 26 26 20 7a 5b 31  ( *z=='/' && z[1
1fb00 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  ]=='*' ){.      
1fb10 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68  z += 2;.      wh
1fb20 69 6c 65 28 20 2a 7a 20 26 26 20 28 2a 7a 21 3d  ile( *z && (*z!=
1fb30 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2f 27  '*' || z[1]!='/'
1fb40 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
1fb50 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65    if( *z==0 ) re
1fb60 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b  turn 0;.      z+
1fb70 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
1fb80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1fb90 20 2a 7a 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d   *z=='-' && z[1]
1fba0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='-' ){.      z
1fbb0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69   += 2;.      whi
1fbc0 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
1fbd0 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  n' ){ z++; }.   
1fbe0 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72     if( *z==0 ) r
1fbf0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 63  eturn 1;.      c
1fc00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1fc10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1fc20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1fc30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1fc40 45 20 69 66 20 74 68 65 20 6c 69 6e 65 20 74 79  E if the line ty
1fc50 70 65 64 20 69 6e 20 69 73 20 61 6e 20 53 51 4c  ped in is an SQL
1fc60 20 63 6f 6d 6d 61 6e 64 20 74 65 72 6d 69 6e 61   command termina
1fc70 74 6f 72 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  tor other.** tha
1fc80 6e 20 61 20 73 65 6d 69 2d 63 6f 6c 6f 6e 2e 20  n a semi-colon. 
1fc90 20 54 68 65 20 53 51 4c 20 53 65 72 76 65 72 20   The SQL Server 
1fca0 73 74 79 6c 65 20 22 67 6f 22 20 63 6f 6d 6d 61  style "go" comma
1fcb0 6e 64 20 69 73 20 75 6e 64 65 72 73 74 6f 6f 64  nd is understood
1fcc0 0a 2a 2a 20 61 73 20 69 73 20 74 68 65 20 4f 72  .** as is the Or
1fcd0 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f 0a 73 74 61  acle "/"..*/.sta
1fce0 74 69 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f  tic int line_is_
1fcf0 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
1fd00 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
1fd10 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  Line){.  while( 
1fd20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 30 5d  IsSpace(zLine[0]
1fd30 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b  ) ){ zLine++; };
1fd40 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
1fd50 3d 27 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69  ='/' && _all_whi
1fd60 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31  tespace(&zLine[1
1fd70 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
1fd80 20 31 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a   1;  /* Oracle *
1fd90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 54 6f 4c 6f  /.  }.  if( ToLo
1fda0 77 65 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27  wer(zLine[0])=='
1fdb0 67 27 20 26 26 20 54 6f 4c 6f 77 65 72 28 7a 4c  g' && ToLower(zL
1fdc0 69 6e 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20  ine[1])=='o'.   
1fdd0 20 20 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68        && _all_wh
1fde0 69 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b  itespace(&zLine[
1fdf0 32 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  2]) ){.    retur
1fe00 6e 20 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72  n 1;  /* SQL Ser
1fe10 76 65 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ver */.  }.  ret
1fe20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1fe30 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a  Return true if z
1fe40 53 71 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  Sql is a complet
1fe50 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
1fe60 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
1fe70 66 20 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20  f it.** ends in 
1fe80 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  the middle of a 
1fe90 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f  string literal o
1fea0 72 20 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  r C-style commen
1feb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1fec0 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74   line_is_complet
1fed0 65 28 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e  e(char *zSql, in
1fee0 74 20 6e 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72  t nSql){.  int r
1fef0 63 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  c;.  if( zSql==0
1ff00 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a   ) return 1;.  z
1ff10 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 27 3b 27 3b  Sql[nSql] = ';';
1ff20 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 31 5d 20  .  zSql[nSql+1] 
1ff30 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
1ff40 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71  te3_complete(zSq
1ff50 6c 29 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d  l);.  zSql[nSql]
1ff60 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1ff70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
1ff80 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 69 6e 20   input from *in 
1ff90 61 6e 64 20 70 72 6f 63 65 73 73 20 69 74 2e 20  and process it. 
1ffa0 20 49 66 20 2a 69 6e 3d 3d 30 20 74 68 65 6e 20   If *in==0 then 
1ffb0 69 6e 70 75 74 0a 2a 2a 20 69 73 20 69 6e 74 65  input.** is inte
1ffc0 72 61 63 74 69 76 65 20 2d 20 74 68 65 20 75 73  ractive - the us
1ffd0 65 72 20 69 73 20 74 79 70 69 6e 67 20 69 74 20  er is typing it 
1ffe0 69 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  it.  Otherwise, 
1fff0 69 6e 70 75 74 0a 2a 2a 20 69 73 20 63 6f 6d 69  input.** is comi
20000 6e 67 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 6f  ng from a file o
20010 72 20 64 65 76 69 63 65 2e 20 20 41 20 70 72 6f  r device.  A pro
20020 6d 70 74 20 69 73 20 69 73 73 75 65 64 20 61 6e  mpt is issued an
20030 64 20 68 69 73 74 6f 72 79 0a 2a 2a 20 69 73 20  d history.** is 
20040 73 61 76 65 64 20 6f 6e 6c 79 20 69 66 20 69 6e  saved only if in
20050 70 75 74 20 69 73 20 69 6e 74 65 72 61 63 74 69  put is interacti
20060 76 65 2e 20 20 41 6e 20 69 6e 74 65 72 72 75 70  ve.  An interrup
20070 74 20 73 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a 2a  t signal will.**
20080 20 63 61 75 73 65 20 74 68 69 73 20 72 6f 75 74   cause this rout
20090 69 6e 65 20 74 6f 20 65 78 69 74 20 69 6d 6d 65  ine to exit imme
200a0 64 69 61 74 65 6c 79 2c 20 75 6e 6c 65 73 73 20  diately, unless 
200b0 69 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61 63  input is interac
200c0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tive..**.** Retu
200d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
200e0 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
200f0 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
20100 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20  nput(ShellState 
20110 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20  *p, FILE *in){. 
20120 20 63 68 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 30   char *zLine = 0
20130 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
20140 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 6c 69 6e  single input lin
20150 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  e */.  char *zSq
20160 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
20170 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20   /* Accumulated 
20180 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  SQL text */.  in
20190 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  t nLine;        
201a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
201b0 68 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 69 6e  h of current lin
201c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20  e */.  int nSql 
201d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
201e0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71   /* Bytes of zSq
201f0 6c 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e  l[] used */.  in
20200 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
20210 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
20220 61 74 65 64 20 7a 53 71 6c 5b 5d 20 73 70 61 63  ated zSql[] spac
20230 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 50  e */.  int nSqlP
20240 72 69 6f 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rior = 0;       
20250 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71   /* Bytes of zSq
20260 6c 5b 5d 20 75 73 65 64 20 62 79 20 70 72 69 6f  l[] used by prio
20270 72 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  r line */.  char
20280 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20   *zErrMsg;      
20290 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
202a0 65 73 73 61 67 65 20 72 65 74 75 72 6e 65 64 20  essage returned 
202b0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
202d0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
202e0 20 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30    int errCnt = 0
202f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
20300 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
20310 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  seen */.  int li
20320 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
20330 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
20340 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
20350 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20  int startline = 
20360 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  0;        /* Lin
20370 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
20380 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20 69 6e  rt of current in
20390 70 75 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  put */..  while(
203a0 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62   errCnt==0 || !b
203b0 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20  ail_on_error || 
203c0 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f  (in==0 && stdin_
203d0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29 20  is_interactive) 
203e0 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70 2d  ){.    fflush(p-
203f0 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c 69 6e 65  >out);.    zLine
20400 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e   = one_input_lin
20410 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71  e(in, zLine, nSq
20420 6c 3e 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  l>0);.    if( zL
20430 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
20440 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20  /* End of input 
20450 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 64  */.      if( std
20460 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
20470 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  e ) printf("\n")
20480 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65     }.    if( see
204a0 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  nInterrupt ){.  
204b0 20 20 20 20 69 66 28 20 69 6e 21 3d 30 20 29 20      if( in!=0 ) 
204c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 73 65 65  break;.      see
204d0 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
204e0 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f      }.    lineno
204f0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c  ++;.    if( nSql
20500 3d 3d 30 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74  ==0 && _all_whit
20510 65 73 70 61 63 65 28 7a 4c 69 6e 65 29 20 29 7b  espace(zLine) ){
20520 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63  .      if( p->ec
20530 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25  hoOn ) printf("%
20540 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  s\n", zLine);.  
20550 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
20560 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e    }.    if( zLin
20570 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  e && zLine[0]=='
20580 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b  .' && nSql==0 ){
20590 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63  .      if( p->ec
205a0 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25  hoOn ) printf("%
205b0 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  s\n", zLine);.  
205c0 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61      rc = do_meta
205d0 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20  _command(zLine, 
205e0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
205f0 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20 72  ==2 ){ /* exit r
20600 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  equested */.    
20610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20620 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b   }else if( rc ){
20630 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e 74 2b  .        errCnt+
20640 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
20650 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
20660 0a 20 20 20 20 69 66 28 20 6c 69 6e 65 5f 69 73  .    if( line_is
20670 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61  _command_termina
20680 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 6c 69  tor(zLine) && li
20690 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28 7a  ne_is_complete(z
206a0 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a 20 20  Sql, nSql) ){.  
206b0 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
206c0 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d 0a 20  ,";",2);.    }. 
206d0 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65     nLine = strle
206e0 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n30(zLine);.    
206f0 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b 32  if( nSql+nLine+2
20700 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >=nAlloc ){.    
20710 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71 6c 2b    nAlloc = nSql+
20720 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20 20 20  nLine+100;.     
20730 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28   zSql = realloc(
20740 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  zSql, nAlloc);. 
20750 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30       if( zSql==0
20760 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
20770 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
20780 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
20790 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  y\n");.        e
207a0 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
207b0 20 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72      }.    nSqlPr
207c0 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20  ior = nSql;.    
207d0 69 66 28 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( nSql==0 ){. 
207e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
207f0 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65    for(i=0; zLine
20800 5b 69 5d 20 26 26 20 49 73 53 70 61 63 65 28 7a  [i] && IsSpace(z
20810 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  Line[i]); i++){}
20820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
20830 41 6c 6c 6f 63 3e 30 20 26 26 20 7a 53 71 6c 21  Alloc>0 && zSql!
20840 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
20850 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2b 69  py(zSql, zLine+i
20860 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b 0a 20 20  , nLine+1-i);.  
20870 20 20 20 20 73 74 61 72 74 6c 69 6e 65 20 3d 20      startline = 
20880 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 6e 53  lineno;.      nS
20890 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b 0a 20 20  ql = nLine-i;.  
208a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
208b0 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c  Sql[nSql++] = '\
208c0 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  n';.      memcpy
208d0 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a 4c 69 6e  (zSql+nSql, zLin
208e0 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a 20 20 20  e, nLine+1);.   
208f0 20 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c 69 6e 65     nSql += nLine
20900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20910 6e 53 71 6c 20 26 26 20 6c 69 6e 65 5f 63 6f 6e  nSql && line_con
20920 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28  tains_semicolon(
20930 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69 6f 72 5d  &zSql[nSqlPrior]
20940 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72 69 6f 72  , nSql-nSqlPrior
20950 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
20960 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d    && sqlite3_com
20970 70 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20  plete(zSql) ){. 
20980 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d 20 30 3b       p->cnt = 0;
20990 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
209a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
209b0 70 2d 3e 62 61 63 6b 73 6c 61 73 68 4f 6e 20 29  p->backslashOn )
209c0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
209d0 73 68 65 73 28 7a 53 71 6c 29 3b 0a 20 20 20 20  shes(zSql);.    
209e0 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20    BEGIN_TIMER;. 
209f0 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f       rc = shell_
20a00 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  exec(p->db, zSql
20a10 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  , shell_callback
20a20 2c 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , p, &zErrMsg);.
20a30 20 20 20 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b        END_TIMER;
20a40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c  .      if( rc ||
20a50 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
20a60 20 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78      char zPrefix
20a70 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  [100];.        i
20a80 66 28 20 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64  f( in!=0 || !std
20a90 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
20aa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
20ab0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
20ac0 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
20ad0 20 7a 50 72 65 66 69 78 2c 20 0a 20 20 20 20 20   zPrefix, .     
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 65        "Error: ne
20b00 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74  ar line %d:", st
20b10 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20  artline);.      
20b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20b30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
20b40 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66  ntf(sizeof(zPref
20b50 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 45  ix), zPrefix, "E
20b60 72 72 6f 72 3a 22 29 3b 0a 20 20 20 20 20 20 20  rror:");.       
20b70 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
20b80 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20  ErrMsg!=0 ){.   
20b90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
20ba0 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22  tderr, "%s %s\n"
20bb0 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72 72 4d  , zPrefix, zErrM
20bc0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  sg);.          s
20bd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
20be0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
20bf0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
20c00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20c10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
20c20 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c  derr, "%s %s\n",
20c30 20 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74 65   zPrefix, sqlite
20c40 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
20c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20c60 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20      errCnt++;.  
20c70 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 53 71 6c      }.      nSql
20c80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
20c90 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 29 7b 0a 20  p->outCount ){. 
20ca0 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 72 65         output_re
20cb0 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
20cc0 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b  p->outCount = 0;
20cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20ce0 73 65 20 69 66 28 20 6e 53 71 6c 20 26 26 20 5f  se if( nSql && _
20cf0 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
20d00 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sql) ){.      if
20d10 28 20 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72  ( p->echoOn ) pr
20d20 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 53 71  intf("%s\n", zSq
20d30 6c 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d  l);.      nSql =
20d40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
20d50 69 66 28 20 6e 53 71 6c 20 29 7b 0a 20 20 20 20  if( nSql ){.    
20d60 69 66 28 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73  if( !_all_whites
20d70 70 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20  pace(zSql) ){.  
20d80 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
20d90 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 63 6f  rr, "Error: inco
20da0 6d 70 6c 65 74 65 20 53 51 4c 3a 20 25 73 5c 6e  mplete SQL: %s\n
20db0 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
20dc0 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  errCnt++;.    }.
20dd0 20 20 7d 0a 20 20 66 72 65 65 28 7a 53 71 6c 29    }.  free(zSql)
20de0 3b 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b  ;.  free(zLine);
20df0 0a 20 20 72 65 74 75 72 6e 20 65 72 72 43 6e 74  .  return errCnt
20e00 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  >0;.}../*.** Ret
20e10 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77  urn a pathname w
20e20 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72  hich is the user
20e30 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  's home director
20e40 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72  y.  A.** 0 retur
20e50 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65  n indicates an e
20e60 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  rror of some kin
20e70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
20e80 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72  r *find_home_dir
20e90 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
20ea0 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20   char *home_dir 
20eb0 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 68 6f  = NULL;.  if( ho
20ec0 6d 65 5f 64 69 72 20 29 20 72 65 74 75 72 6e 20  me_dir ) return 
20ed0 68 6f 6d 65 5f 64 69 72 3b 0a 0a 23 69 66 20 21  home_dir;..#if !
20ee0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
20ef0 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33  && !defined(WIN3
20f00 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  2) && !defined(_
20f10 57 49 4e 33 32 5f 57 43 45 29 20 5c 0a 20 20 20  WIN32_WCE) \.   
20f20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f    && !defined(__
20f30 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
20f40 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
20f50 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 70    {.    struct p
20f60 61 73 73 77 64 20 2a 70 77 65 6e 74 3b 0a 20 20  asswd *pwent;.  
20f70 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20 67 65    uid_t uid = ge
20f80 74 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28 20  tuid();.    if( 
20f90 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28  (pwent=getpwuid(
20fa0 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  uid)) != NULL) {
20fb0 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  .      home_dir 
20fc0 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b  = pwent->pw_dir;
20fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
20fe0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
20ff0 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 2f 2a 20  WIN32_WCE).  /* 
21000 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d  Windows CE (arm-
21010 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d  wince-mingw32ce-
21020 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72  gcc) does not pr
21030 6f 76 69 64 65 20 67 65 74 65 6e 76 28 29 0a 20  ovide getenv(). 
21040 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f 64 69 72 20    */.  home_dir 
21050 3d 20 22 2f 22 3b 0a 23 65 6c 73 65 0a 0a 23 69  = "/";.#else..#i
21060 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
21070 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
21080 33 32 29 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f  32).  if (!home_
21090 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  dir) {.    home_
210a0 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 55 53  dir = getenv("US
210b0 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 7d  ERPROFILE");.  }
210c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 20 28 21  .#endif..  if (!
210d0 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20  home_dir) {.    
210e0 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e  home_dir = geten
210f0 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d 0a 0a  v("HOME");.  }..
21100 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
21110 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
21120 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f 6d  IN32).  if (!hom
21130 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 63 68 61  e_dir) {.    cha
21140 72 20 2a 7a 44 72 69 76 65 2c 20 2a 7a 50 61 74  r *zDrive, *zPat
21150 68 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  h;.    int n;.  
21160 20 20 7a 44 72 69 76 65 20 3d 20 67 65 74 65 6e    zDrive = geten
21170 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29 3b 0a  v("HOMEDRIVE");.
21180 20 20 20 20 7a 50 61 74 68 20 3d 20 67 65 74 65      zPath = gete
21190 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29 3b 0a  nv("HOMEPATH");.
211a0 20 20 20 20 69 66 28 20 7a 44 72 69 76 65 20 26      if( zDrive &
211b0 26 20 7a 50 61 74 68 20 29 7b 0a 20 20 20 20 20  & zPath ){.     
211c0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 44   n = strlen30(zD
211d0 72 69 76 65 29 20 2b 20 73 74 72 6c 65 6e 33 30  rive) + strlen30
211e0 28 7a 50 61 74 68 29 20 2b 20 31 3b 0a 20 20 20  (zPath) + 1;.   
211f0 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 6d 61     home_dir = ma
21200 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 20  lloc( n );.     
21210 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30   if( home_dir==0
21220 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
21230 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21240 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f 64 69 72 2c  ntf(n, home_dir,
21250 20 22 25 73 25 73 22 2c 20 7a 44 72 69 76 65 2c   "%s%s", zDrive,
21260 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72   zPath);.      r
21270 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a  eturn home_dir;.
21280 20 20 20 20 7d 0a 20 20 20 20 68 6f 6d 65 5f 64      }.    home_d
21290 69 72 20 3d 20 22 63 3a 5c 5c 22 3b 0a 20 20 7d  ir = "c:\\";.  }
212a0 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
212b0 2f 2a 20 21 5f 57 49 4e 33 32 5f 57 43 45 20 2a  /* !_WIN32_WCE *
212c0 2f 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64 69  /..  if( home_di
212d0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  r ){.    int n =
212e0 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d 65 5f 64   strlen30(home_d
212f0 69 72 29 20 2b 20 31 3b 0a 20 20 20 20 63 68 61  ir) + 1;.    cha
21300 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  r *z = malloc( n
21310 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 20   );.    if( z ) 
21320 6d 65 6d 63 70 79 28 7a 2c 20 68 6f 6d 65 5f 64  memcpy(z, home_d
21330 69 72 2c 20 6e 29 3b 0a 20 20 20 20 68 6f 6d 65  ir, n);.    home
21340 5f 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a 20  _dir = z;.  }.. 
21350 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72   return home_dir
21360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
21370 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
21380 69 6c 65 20 67 69 76 65 6e 20 62 79 20 73 71 6c  ile given by sql
21390 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 2e 20  iterc_override. 
213a0 20 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a 20 70   Or if that.** p
213b0 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c  arameter is NULL
213c0 2c 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  , take input fro
213d0 6d 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a 2a 2a  m ~/.sqliterc.**
213e0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
213f0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
21400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21410 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72   process_sqliter
21420 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  c(.  ShellState 
21430 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21440 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
21450 61 74 69 6f 6e 20 64 61 74 61 20 2a 2f 0a 20 20  ation data */.  
21460 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
21470 74 65 72 63 5f 6f 76 65 72 72 69 64 65 20 20 20  terc_override   
21480 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 66 69  /* Name of confi
21490 67 20 66 69 6c 65 2e 20 4e 55 4c 4c 20 74 6f 20  g file. NULL to 
214a0 75 73 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 29  use default */.)
214b0 7b 0a 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64  {.  char *home_d
214c0 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 6e  ir = NULL;.  con
214d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72  st char *sqliter
214e0 63 20 3d 20 73 71 6c 69 74 65 72 63 5f 6f 76 65  c = sqliterc_ove
214f0 72 72 69 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a  rride;.  char *z
21500 42 75 66 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  Buf = 0;.  FILE 
21510 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 69  *in = NULL;..  i
21520 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e  f (sqliterc == N
21530 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
21540 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f  dir = find_home_
21550 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68  dir();.    if( h
21560 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 20 20  ome_dir==0 ){.  
21570 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
21580 72 72 2c 20 22 2d 2d 20 77 61 72 6e 69 6e 67 3a  rr, "-- warning:
21590 20 63 61 6e 6e 6f 74 20 66 69 6e 64 20 68 6f 6d   cannot find hom
215a0 65 20 64 69 72 65 63 74 6f 72 79 3b 22 0a 20 20  e directory;".  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 22 20 63 61 6e 6e 6f 74 20 72 65 61      " cannot rea
215d0 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63 5c 6e 22  d ~/.sqliterc\n"
215e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
215f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21600 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
21610 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  .    zBuf = sqli
21620 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
21630 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
21640 64 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dir);.    sqlite
21650 72 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  rc = zBuf;.  }. 
21660 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
21670 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
21680 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
21690 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
216a0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66 70  tive ){.      fp
216b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d 2d  rintf(stderr,"--
216c0 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72 63   Loading resourc
216d0 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73 71  es from %s\n",sq
216e0 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a 20  literc);.    }. 
216f0 20 20 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74     process_input
21700 28 70 2c 69 6e 29 3b 0a 20 20 20 20 66 63 6c 6f  (p,in);.    fclo
21710 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  se(in);.  }.  sq
21720 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
21730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  ;.}../*.** Show 
21740 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e  available comman
21750 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a  d line options.*
21760 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
21770 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d  har zOptions[] =
21780 20 0a 20 20 22 20 20 20 2d 61 73 63 69 69 20 20   .  "   -ascii  
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
217a0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
217b0 27 61 73 63 69 69 27 5c 6e 22 0a 20 20 22 20 20  'ascii'\n".  "  
217c0 20 2d 62 61 69 6c 20 20 20 20 20 20 20 20 20 20   -bail          
217d0 20 20 20 20 20 20 73 74 6f 70 20 61 66 74 65 72        stop after
217e0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
217f0 72 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63  r\n".  "   -batc
21800 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
21810 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c  force batch I/O\
21820 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e  n".  "   -column
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
21840 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
21850 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22   'column'\n".  "
21860 20 20 20 2d 63 6d 64 20 43 4f 4d 4d 41 4e 44 20     -cmd COMMAND 
21870 20 20 20 20 20 20 20 20 72 75 6e 20 5c 22 43 4f          run \"CO
21880 4d 4d 41 4e 44 5c 22 20 62 65 66 6f 72 65 20 72  MMAND\" before r
21890 65 61 64 69 6e 67 20 73 74 64 69 6e 5c 6e 22 0a  eading stdin\n".
218a0 20 20 22 20 20 20 2d 63 73 76 20 20 20 20 20 20    "   -csv      
218b0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
218c0 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63  utput mode to 'c
218d0 73 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63  sv'\n".  "   -ec
218e0 68 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ho              
218f0 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73    print commands
21900 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f   before executio
21910 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 69 74  n\n".  "   -init
21920 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
21930 72 65 61 64 2f 70 72 6f 63 65 73 73 20 6e 61 6d  read/process nam
21940 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20  ed file\n".  "  
21950 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20 20 20   -[no]header    
21960 20 20 20 20 20 20 74 75 72 6e 20 68 65 61 64 65        turn heade
21970 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  rs on or off\n".
21980 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
21990 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
219a0 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
219b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
219c0 59 53 35 29 0a 20 20 22 20 20 20 2d 68 65 61 70  YS5).  "   -heap
219d0 20 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20   SIZE           
219e0 53 69 7a 65 20 6f 66 20 68 65 61 70 20 66 6f 72  Size of heap for
219f0 20 6d 65 6d 73 79 73 33 20 6f 72 20 6d 65 6d 73   memsys3 or mems
21a00 79 73 35 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ys5\n".#endif.  
21a10 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20  "   -help       
21a20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
21a30 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
21a40 22 20 20 20 2d 68 74 6d 6c 20 20 20 20 20 20 20  "   -html       
21a50 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
21a60 70 75 74 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c  put mode to HTML
21a70 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72  \n".  "   -inter
21a80 61 63 74 69 76 65 20 20 20 20 20 20 20 20 20 66  active         f
21a90 6f 72 63 65 20 69 6e 74 65 72 61 63 74 69 76 65  orce interactive
21aa0 20 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 6c   I/O\n".  "   -l
21ab0 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
21ac0 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
21ad0 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
21ae0 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
21af0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
21b00 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
21b10 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  ist'\n".  "   -l
21b20 6f 6f 6b 61 73 69 64 65 20 53 49 5a 45 20 4e 20  ookaside SIZE N 
21b30 20 20 20 75 73 65 20 4e 20 65 6e 74 72 69 65 73     use N entries
21b40 20 6f 66 20 53 5a 20 62 79 74 65 73 20 66 6f 72   of SZ bytes for
21b50 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
21b60 79 5c 6e 22 0a 20 20 22 20 20 20 2d 6d 6d 61 70  y\n".  "   -mmap
21b70 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
21b80 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
21b90 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22 0a 23 69  e set to N\n".#i
21ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21bb0 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22  LE_MULTIPLEX.  "
21bc0 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20     -multiplex   
21bd0 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74          enable t
21be0 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56  he multiplexor V
21bf0 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  FS\n".#endif.  "
21c00 20 20 20 2d 6e 65 77 6c 69 6e 65 20 53 45 50 20     -newline SEP 
21c10 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
21c20 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
21c30 2e 20 44 65 66 61 75 6c 74 3a 20 27 5c 5c 6e 27  . Default: '\\n'
21c40 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c 76  \n".  "   -nullv
21c50 61 6c 75 65 20 54 45 58 54 20 20 20 20 20 20 73  alue TEXT      s
21c60 65 74 20 74 65 78 74 20 73 74 72 69 6e 67 20 66  et text string f
21c70 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  or NULL values. 
21c80 44 65 66 61 75 6c 74 20 27 27 5c 6e 22 0a 20 20  Default ''\n".  
21c90 22 20 20 20 2d 70 61 67 65 63 61 63 68 65 20 53  "   -pagecache S
21ca0 49 5a 45 20 4e 20 20 20 20 75 73 65 20 4e 20 73  IZE N    use N s
21cb0 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65 73  lots of SZ bytes
21cc0 20 65 61 63 68 20 66 6f 72 20 70 61 67 65 20 63   each for page c
21cd0 61 63 68 65 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20  ache memory\n". 
21ce0 20 22 20 20 20 2d 73 63 72 61 74 63 68 20 53 49   "   -scratch SI
21cf0 5a 45 20 4e 20 20 20 20 20 20 75 73 65 20 4e 20  ZE N      use N 
21d00 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65  slots of SZ byte
21d10 73 20 65 61 63 68 20 66 6f 72 20 73 63 72 61 74  s each for scrat
21d20 63 68 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20 20 22  ch memory\n".  "
21d30 20 20 20 2d 73 65 70 61 72 61 74 6f 72 20 53 45     -separator SE
21d40 50 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70  P       set outp
21d50 75 74 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ut column separa
21d60 74 6f 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 7c  tor. Default: '|
21d70 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73 74 61 74  '\n".  "   -stat
21d80 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
21d90 70 72 69 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61  print memory sta
21da0 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66  ts before each f
21db0 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20  inalize\n".  "  
21dc0 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20   -version       
21dd0 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74        show SQLit
21de0 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22  e version\n".  "
21df0 20 20 20 2d 76 66 73 20 4e 41 4d 45 20 20 20 20     -vfs NAME    
21e00 20 20 20 20 20 20 20 20 75 73 65 20 4e 41 4d 45          use NAME
21e10 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   as the default 
21e20 56 46 53 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  VFS\n".#ifdef SQ
21e30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54  LITE_ENABLE_VFST
21e40 52 41 43 45 0a 20 20 22 20 20 20 2d 76 66 73 74  RACE.  "   -vfst
21e50 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20  race            
21e60 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 6f  enable tracing o
21e70 66 20 61 6c 6c 20 56 46 53 20 63 61 6c 6c 73 5c  f all VFS calls\
21e80 6e 22 0a 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74  n".#endif.;.stat
21e90 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e  ic void usage(in
21ea0 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20  t showDetail){. 
21eb0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
21ec0 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a 20 25  .      "Usage: %
21ed0 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45  s [OPTIONS] FILE
21ee0 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a  NAME [SQL]\n"  .
21ef0 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20        "FILENAME 
21f00 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
21f10 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
21f20 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73  e. A new databas
21f30 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a  e is created\n".
21f40 20 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69        "if the fi
21f50 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  le does not prev
21f60 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22  iously exist.\n"
21f70 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20  , Argv0);.  if( 
21f80 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20  showDetail ){.  
21f90 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
21fa0 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63 6c 75  , "OPTIONS inclu
21fb0 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f  de:\n%s", zOptio
21fc0 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ns);.  }else{.  
21fd0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
21fe0 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70  , "Use the -help
21ff0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69   option for addi
22000 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22010 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78  on\n");.  }.  ex
22020 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
22030 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
22040 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
22050 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74   in data.*/.stat
22060 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69  ic void main_ini
22070 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 64 61  t(ShellState *da
22080 74 61 29 20 7b 0a 20 20 6d 65 6d 73 65 74 28 64  ta) {.  memset(d
22090 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ata, 0, sizeof(*
220a0 64 61 74 61 29 29 3b 0a 20 20 64 61 74 61 2d 3e  data));.  data->
220b0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
220c0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d  ;.  memcpy(data-
220d0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 53 45  >colSeparator,SE
220e0 50 5f 43 6f 6c 75 6d 6e 2c 20 32 29 3b 0a 20 20  P_Column, 2);.  
220f0 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e 72 6f 77  memcpy(data->row
22100 53 65 70 61 72 61 74 6f 72 2c 53 45 50 5f 52 6f  Separator,SEP_Ro
22110 77 2c 20 32 29 3b 0a 20 20 64 61 74 61 2d 3e 73  w, 2);.  data->s
22120 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
22130 20 64 61 74 61 2d 3e 73 68 65 6c 6c 46 6c 67 73   data->shellFlgs
22140 20 3d 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   = SHFLG_Lookasi
22150 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  de;.  sqlite3_co
22160 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
22170 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20 20 73 71  IG_URI, 1);.  sq
22180 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
22190 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
221a0 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74 61 29 3b  shellLog, data);
221b0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
221c0 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
221d0 4d 55 4c 54 49 54 48 52 45 41 44 29 3b 0a 20 20  MULTITHREAD);.  
221e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
221f0 28 73 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d  (sizeof(mainProm
22200 70 74 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c  pt), mainPrompt,
22210 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73  "sqlite> ");.  s
22220 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22230 73 69 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50  sizeof(continueP
22240 72 6f 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65  rompt), continue
22250 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20  Prompt,"   ...> 
22260 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ");.}../*.** Out
22270 70 75 74 20 74 65 78 74 20 74 6f 20 74 68 65 20  put text to the 
22280 63 6f 6e 73 6f 6c 65 20 69 6e 20 61 20 66 6f 6e  console in a fon
22290 74 20 74 68 61 74 20 61 74 74 72 61 63 74 73 20  t that attracts 
222a0 65 78 74 72 61 20 61 74 74 65 6e 74 69 6f 6e 2e  extra attention.
222b0 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  .*/.#ifdef _WIN3
222c0 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  2.static void pr
222d0 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
222e0 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 48 41  ar *zText){.  HA
222f0 4e 44 4c 45 20 6f 75 74 20 3d 20 47 65 74 53 74  NDLE out = GetSt
22300 64 48 61 6e 64 6c 65 28 53 54 44 5f 4f 55 54 50  dHandle(STD_OUTP
22310 55 54 5f 48 41 4e 44 4c 45 29 3b 0a 20 20 43 4f  UT_HANDLE);.  CO
22320 4e 53 4f 4c 45 5f 53 43 52 45 45 4e 5f 42 55 46  NSOLE_SCREEN_BUF
22330 46 45 52 5f 49 4e 46 4f 20 64 65 66 61 75 6c 74  FER_INFO default
22340 53 63 72 65 65 6e 49 6e 66 6f 3b 0a 20 20 47 65  ScreenInfo;.  Ge
22350 74 43 6f 6e 73 6f 6c 65 53 63 72 65 65 6e 42 75  tConsoleScreenBu
22360 66 66 65 72 49 6e 66 6f 28 6f 75 74 2c 20 26 64  fferInfo(out, &d
22370 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e 66 6f  efaultScreenInfo
22380 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65 54  );.  SetConsoleT
22390 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75 74  extAttribute(out
223a0 2c 0a 20 20 20 20 20 20 20 20 20 46 4f 52 45 47  ,.         FOREG
223b0 52 4f 55 4e 44 5f 52 45 44 7c 46 4f 52 45 47 52  ROUND_RED|FOREGR
223c0 4f 55 4e 44 5f 49 4e 54 45 4e 53 49 54 59 0a 20  OUND_INTENSITY. 
223d0 20 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73   );.  printf("%s
223e0 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 53 65 74  ", zText);.  Set
223f0 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72 69  ConsoleTextAttri
22400 62 75 74 65 28 6f 75 74 2c 20 64 65 66 61 75 6c  bute(out, defaul
22410 74 53 63 72 65 65 6e 49 6e 66 6f 2e 77 41 74 74  tScreenInfo.wAtt
22420 72 69 62 75 74 65 73 29 3b 0a 7d 0a 23 65 6c 73  ributes);.}.#els
22430 65 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  e.static void pr
22440 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
22450 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 70 72  ar *zText){.  pr
22460 69 6e 74 66 28 22 5c 30 33 33 5b 31 6d 25 73 5c  intf("\033[1m%s\
22470 30 33 33 5b 30 6d 22 2c 20 7a 54 65 78 74 29 3b  033[0m", zText);
22480 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22490 20 47 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e   Get the argumen
224a0 74 20 74 6f 20 61 6e 20 2d 2d 6f 70 74 69 6f 6e  t to an --option
224b0 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  .  Throw an erro
224c0 72 20 61 6e 64 20 64 69 65 20 69 66 20 6e 6f 20  r and die if no 
224d0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
224e0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  vailable..*/.sta
224f0 74 69 63 20 63 68 61 72 20 2a 63 6d 64 6c 69 6e  tic char *cmdlin
22500 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 69  e_option_value(i
22510 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
22520 61 72 67 76 2c 20 69 6e 74 20 69 29 7b 0a 20 20  argv, int i){.  
22530 69 66 28 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20  if( i==argc ){. 
22540 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
22550 72 2c 20 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d  r, "%s: Error: m
22560 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
22570 74 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  to %s\n",.      
22580 20 20 20 20 20 20 61 72 67 76 5b 30 5d 2c 20 61        argv[0], a
22590 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20  rgv[argc-1]);.  
225a0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
225b0 20 72 65 74 75 72 6e 20 61 72 67 76 5b 69 5d 3b   return argv[i];
225c0 0a 7d 0a 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43  .}..int SQLITE_C
225d0 44 45 43 4c 20 6d 61 69 6e 28 69 6e 74 20 61 72  DECL main(int ar
225e0 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
225f0 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  {.  char *zErrMs
22600 67 20 3d 20 30 3b 0a 20 20 53 68 65 6c 6c 53 74  g = 0;.  ShellSt
22610 61 74 65 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73  ate data;.  cons
22620 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c  t char *zInitFil
22630 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
22640 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
22650 69 6e 74 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79  int warnInmemory
22660 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
22670 61 64 53 74 64 69 6e 20 3d 20 31 3b 0a 20 20 69  adStdin = 1;.  i
22680 6e 74 20 6e 43 6d 64 20 3d 20 30 3b 0a 20 20 63  nt nCmd = 0;.  c
22690 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 30 3b  har **azCmd = 0;
226a0 0a 0a 23 69 66 20 55 53 45 5f 53 59 53 54 45 4d  ..#if USE_SYSTEM
226b0 5f 53 51 4c 49 54 45 2b 30 21 3d 31 0a 20 20 69  _SQLITE+0!=1.  i
226c0 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65  f( strcmp(sqlite
226d0 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 53 51 4c  3_sourceid(),SQL
226e0 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 21 3d  ITE_SOURCE_ID)!=
226f0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
22700 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65  (stderr, "SQLite
22710 20 68 65 61 64 65 72 20 61 6e 64 20 73 6f 75 72   header and sour
22720 63 65 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61  ce version misma
22730 74 63 68 5c 6e 25 73 5c 6e 25 73 5c 6e 22 2c 0a  tch\n%s\n%s\n",.
22740 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22750 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20  te3_sourceid(), 
22760 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
22770 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
22780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 65 74    }.#endif.  set
22790 42 69 6e 61 72 79 4d 6f 64 65 28 73 74 64 69 6e  BinaryMode(stdin
227a0 29 3b 0a 20 20 73 65 74 76 62 75 66 28 73 74 64  );.  setvbuf(std
227b0 65 72 72 2c 20 30 2c 20 5f 49 4f 4e 42 46 2c 20  err, 0, _IONBF, 
227c0 30 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  0); /* Make sure
227d0 20 73 74 64 65 72 72 20 69 73 20 75 6e 62 75 66   stderr is unbuf
227e0 66 65 72 65 64 20 2a 2f 0a 20 20 41 72 67 76 30  fered */.  Argv0
227f0 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6d 61   = argv[0];.  ma
22800 69 6e 5f 69 6e 69 74 28 26 64 61 74 61 29 3b 0a  in_init(&data);.
22810 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
22820 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79 28  active = isatty(
22830 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
22840 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
22850 6c 69 64 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c  lid signal handl
22860 65 72 20 65 61 72 6c 79 2c 20 62 65 66 6f 72 65  er early, before
22870 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 65   anything.  ** e
22880 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  lse is done..  *
22890 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  /.#ifdef SIGINT.
228a0 20 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c    signal(SIGINT,
228b0 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c   interrupt_handl
228c0 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  er);.#endif..#if
228d0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c  def SQLITE_SHELL
228e0 5f 44 42 4e 41 4d 45 5f 50 52 4f 43 0a 20 20 7b  _DBNAME_PROC.  {
228f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53  .    /* If the S
22900 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41  QLITE_SHELL_DBNA
22910 4d 45 5f 50 52 4f 43 20 6d 61 63 72 6f 20 69 73  ME_PROC macro is
22920 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69   defined, then i
22930 74 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 20 20  t is the name.  
22940 20 20 2a 2a 20 6f 66 20 61 20 43 2d 66 75 6e 63    ** of a C-func
22950 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
22960 72 6f 76 69 64 65 20 74 68 65 20 6e 61 6d 65 20  rovide the name 
22970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22980 66 69 6c 65 2e 20 20 55 73 65 0a 20 20 20 20 2a  file.  Use.    *
22990 2a 20 74 68 69 73 20 63 6f 6d 70 69 6c 65 2d 74  * this compile-t
229a0 69 6d 65 20 6f 70 74 69 6f 6e 20 74 6f 20 65 6d  ime option to em
229b0 62 65 64 20 74 68 69 73 20 73 68 65 6c 6c 20 70  bed this shell p
229c0 72 6f 67 72 61 6d 20 69 6e 20 6c 61 72 67 65 72  rogram in larger
229d0 0a 20 20 20 20 2a 2a 20 61 70 70 6c 69 63 61 74  .    ** applicat
229e0 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 65 78 74  ions. */.    ext
229f0 65 72 6e 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  ern void SQLITE_
22a00 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f  SHELL_DBNAME_PRO
22a10 43 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  C(const char**);
22a20 0a 20 20 20 20 53 51 4c 49 54 45 5f 53 48 45 4c  .    SQLITE_SHEL
22a30 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f 43 28 26 64  L_DBNAME_PROC(&d
22a40 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 29  ata.zDbFilename)
22a50 3b 0a 20 20 20 20 77 61 72 6e 49 6e 6d 65 6d 6f  ;.    warnInmemo
22a60 72 79 44 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  ryDb = 0;.  }.#e
22a70 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e  ndif..  /* Do an
22a80 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68   initial pass th
22a90 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e  rough the comman
22aa0 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d-line argument 
22ab0 74 6f 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74  to locate.  ** t
22ac0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
22ad0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
22ae0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
22af0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c  itialization fil
22b00 65 2c 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  e,.  ** the size
22b10 20 6f 66 20 74 68 65 20 61 6c 74 65 72 6e 61 74   of the alternat
22b20 69 76 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70 2c  ive malloc heap,
22b30 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 66 69  .  ** and the fi
22b40 72 73 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  rst command to e
22b50 78 65 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  xecute..  */.  f
22b60 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
22b70 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
22b80 7a 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b  z;.    z = argv[
22b90 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  i];.    if( z[0]
22ba0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  !='-' ){.      i
22bb0 66 28 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e  f( data.zDbFilen
22bc0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
22bd0 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61    data.zDbFilena
22be0 6d 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 7d 65  me = z;.      }e
22bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
22c00 45 78 63 65 73 73 73 20 61 72 67 75 6d 65 6e 74  Excesss argument
22c10 73 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  s are interprete
22c20 64 20 61 73 20 53 51 4c 20 28 6f 72 20 64 6f 74  d as SQL (or dot
22c30 2d 63 6f 6d 6d 61 6e 64 73 29 20 61 6e 64 0a 20  -commands) and. 
22c40 20 20 20 20 20 20 20 2a 2a 20 6d 65 61 6e 20 74         ** mean t
22c50 68 61 74 20 6e 6f 74 68 69 6e 67 20 69 73 20 72  hat nothing is r
22c60 65 61 64 20 66 72 6f 6d 20 73 74 64 69 6e 20 2a  ead from stdin *
22c70 2f 0a 20 20 20 20 20 20 20 20 72 65 61 64 53 74  /.        readSt
22c80 64 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  din = 0;.       
22c90 20 6e 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20   nCmd++;.       
22ca0 20 61 7a 43 6d 64 20 3d 20 72 65 61 6c 6c 6f 63   azCmd = realloc
22cb0 28 61 7a 43 6d 64 2c 20 73 69 7a 65 6f 66 28 61  (azCmd, sizeof(a
22cc0 7a 43 6d 64 5b 30 5d 29 2a 6e 43 6d 64 29 3b 0a  zCmd[0])*nCmd);.
22cd0 20 20 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d          if( azCm
22ce0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
22cf0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
22d00 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
22d10 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
22d20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 20  exit(1);.       
22d30 20 7d 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64   }.        azCmd
22d40 5b 6e 43 6d 64 2d 31 5d 20 3d 20 7a 3b 0a 20 20  [nCmd-1] = z;.  
22d50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22d60 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20  if( z[1]=='-' ) 
22d70 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72  z++;.    if( str
22d80 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f  cmp(z,"-separato
22d90 72 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73  r")==0.     || s
22da0 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61  trcmp(z,"-nullva
22db0 6c 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c  lue")==0.     ||
22dc0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 65 77 6c   strcmp(z,"-newl
22dd0 69 6e 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c  ine")==0.     ||
22de0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6d 64 22   strcmp(z,"-cmd"
22df0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
22e00 20 20 28 76 6f 69 64 29 63 6d 64 6c 69 6e 65 5f    (void)cmdline_
22e10 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67  option_value(arg
22e20 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20  c, argv, ++i);. 
22e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
22e40 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d  cmp(z,"-init")==
22e50 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 6e 69 74  0 ){.      zInit
22e60 46 69 6c 65 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f  File = cmdline_o
22e70 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
22e80 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20  , argv, ++i);.  
22e90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
22ea0 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d  mp(z,"-batch")==
22eb0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
22ec0 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
22ed0 62 61 74 63 68 20 6d 6f 64 65 20 68 65 72 65 20  batch mode here 
22ee0 74 6f 20 73 6f 20 77 65 20 63 61 6e 20 61 76 6f  to so we can avo
22ef0 69 64 20 70 72 69 6e 74 69 6e 67 0a 20 20 20 20  id printing.    
22f00 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
22f10 61 6c 20 6d 65 73 73 61 67 65 73 20 28 6c 69 6b  al messages (lik
22f20 65 20 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f 73  e from process_s
22f30 71 6c 69 74 65 72 63 29 20 62 65 66 6f 72 65 20  qliterc) before 
22f40 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  .      ** we do 
22f50 74 68 65 20 61 63 74 75 61 6c 20 70 72 6f 63 65  the actual proce
22f60 73 73 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e  ssing of argumen
22f70 74 73 20 6c 61 74 65 72 20 69 6e 20 61 20 73 65  ts later in a se
22f80 63 6f 6e 64 20 70 61 73 73 2e 0a 20 20 20 20 20  cond pass..     
22f90 20 2a 2f 0a 20 20 20 20 20 20 73 74 64 69 6e 5f   */.      stdin_
22fa0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
22fb0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
22fc0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61  ( strcmp(z,"-hea
22fd0 70 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  p")==0 ){.#if de
22fe0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
22ff0 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
23000 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
23010 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
23020 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23030 2a 7a 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  *zSize;.      sq
23040 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 48 65  lite3_int64 szHe
23050 61 70 3b 0a 0a 20 20 20 20 20 20 7a 53 69 7a 65  ap;..      zSize
23060 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f   = cmdline_optio
23070 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72  n_value(argc, ar
23080 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 20 20  gv, ++i);.      
23090 73 7a 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72  szHeap = integer
230a0 56 61 6c 75 65 28 7a 53 69 7a 65 29 3b 0a 20 20  Value(zSize);.  
230b0 20 20 20 20 69 66 28 20 73 7a 48 65 61 70 3e 30      if( szHeap>0
230c0 78 37 66 66 66 30 30 30 30 20 29 20 73 7a 48 65  x7fff0000 ) szHe
230d0 61 70 20 3d 20 30 78 37 66 66 66 30 30 30 30 3b  ap = 0x7fff0000;
230e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
230f0 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
23100 46 49 47 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f 63  FIG_HEAP, malloc
23110 28 28 69 6e 74 29 73 7a 48 65 61 70 29 2c 20 28  ((int)szHeap), (
23120 69 6e 74 29 73 7a 48 65 61 70 2c 20 36 34 29 3b  int)szHeap, 64);
23130 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
23140 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
23150 2d 73 63 72 61 74 63 68 22 29 3d 3d 30 20 29 7b  -scratch")==0 ){
23160 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c 20 73 7a  .      int n, sz
23170 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 28 69 6e  ;.      sz = (in
23180 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63  t)integerValue(c
23190 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
231a0 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b  lue(argc,argv,++
231b0 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  i));.      if( s
231c0 7a 3e 34 30 30 30 30 30 20 29 20 73 7a 20 3d 20  z>400000 ) sz = 
231d0 34 30 30 30 30 30 3b 0a 20 20 20 20 20 20 69 66  400000;.      if
231e0 28 20 73 7a 3c 32 35 30 30 20 29 20 73 7a 20 3d  ( sz<2500 ) sz =
231f0 20 32 35 30 30 3b 0a 20 20 20 20 20 20 6e 20 3d   2500;.      n =
23200 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
23210 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  ue(cmdline_optio
23220 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67  n_value(argc,arg
23230 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69  v,++i));.      i
23240 66 28 20 6e 3e 31 30 20 29 20 6e 20 3d 20 31 30  f( n>10 ) n = 10
23250 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3c 31 20  ;.      if( n<1 
23260 29 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  ) n = 1;.      s
23270 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
23280 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
23290 54 43 48 2c 20 6d 61 6c 6c 6f 63 28 6e 2a 73 7a  TCH, malloc(n*sz
232a0 2b 31 29 2c 20 73 7a 2c 20 6e 29 3b 0a 20 20 20  +1), sz, n);.   
232b0 20 20 20 64 61 74 61 2e 73 68 65 6c 6c 46 6c 67     data.shellFlg
232c0 73 20 7c 3d 20 53 48 46 4c 47 5f 53 63 72 61 74  s |= SHFLG_Scrat
232d0 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ch;.    }else if
232e0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 70 61 67  ( strcmp(z,"-pag
232f0 65 63 61 63 68 65 22 29 3d 3d 30 20 29 7b 0a 20  ecache")==0 ){. 
23300 20 20 20 20 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a       int n, sz;.
23310 20 20 20 20 20 20 73 7a 20 3d 20 28 69 6e 74 29        sz = (int)
23320 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64  integerValue(cmd
23330 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
23340 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29  e(argc,argv,++i)
23350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3e  );.      if( sz>
23360 37 30 30 30 30 20 29 20 73 7a 20 3d 20 37 30 30  70000 ) sz = 700
23370 30 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  00;.      if( sz
23380 3c 30 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 20  <0 ) sz = 0;.   
23390 20 20 20 6e 20 3d 20 28 69 6e 74 29 69 6e 74 65     n = (int)inte
233a0 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65  gerValue(cmdline
233b0 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72  _option_value(ar
233c0 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20  gc,argv,++i));. 
233d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
233e0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
233f0 47 5f 50 41 47 45 43 41 43 48 45 2c 0a 20 20 20  G_PAGECACHE,.   
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 28 6e 3e 30 20 26 26 20 73 7a 3e 30 29 20 3f   (n>0 && sz>0) ?
23420 20 6d 61 6c 6c 6f 63 28 6e 2a 73 7a 29 20 3a 20   malloc(n*sz) : 
23430 30 2c 20 73 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  0, sz, n);.     
23440 20 64 61 74 61 2e 73 68 65 6c 6c 46 6c 67 73 20   data.shellFlgs 
23450 7c 3d 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63  |= SHFLG_Pagecac
23460 68 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  he;.    }else if
23470 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 6f  ( strcmp(z,"-loo
23480 6b 61 73 69 64 65 22 29 3d 3d 30 20 29 7b 0a 20  kaside")==0 ){. 
23490 20 20 20 20 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a       int n, sz;.
234a0 20 20 20 20 20 20 73 7a 20 3d 20 28 69 6e 74 29        sz = (int)
234b0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64  integerValue(cmd
234c0 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
234d0 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29  e(argc,argv,++i)
234e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
234f0 30 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20  0 ) sz = 0;.    
23500 20 20 6e 20 3d 20 28 69 6e 74 29 69 6e 74 65 67    n = (int)integ
23510 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f  erValue(cmdline_
23520 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67  option_value(arg
23530 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20  c,argv,++i));.  
23540 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
23550 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
23560 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
23570 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  _CONFIG_LOOKASID
23580 45 2c 20 73 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  E, sz, n);.     
23590 20 69 66 28 20 73 7a 2a 6e 3d 3d 30 20 29 20 64   if( sz*n==0 ) d
235a0 61 74 61 2e 73 68 65 6c 6c 46 6c 67 73 20 26 3d  ata.shellFlgs &=
235b0 20 7e 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64   ~SHFLG_Lookasid
235c0 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
235d0 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41 43 45  _ENABLE_VFSTRACE
235e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
235f0 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61  trcmp(z,"-vfstra
23600 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
23610 20 65 78 74 65 72 6e 20 69 6e 74 20 76 66 73 74   extern int vfst
23620 72 61 63 65 5f 72 65 67 69 73 74 65 72 28 0a 20  race_register(. 
23630 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
23640 61 72 20 2a 7a 54 72 61 63 65 4e 61 6d 65 2c 0a  ar *zTraceName,.
23650 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
23660 68 61 72 20 2a 7a 4f 6c 64 56 66 73 4e 61 6d 65  har *zOldVfsName
23670 2c 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20 28  ,.         int (
23680 2a 78 4f 75 74 29 28 63 6f 6e 73 74 20 63 68 61  *xOut)(const cha
23690 72 2a 2c 76 6f 69 64 2a 29 2c 0a 20 20 20 20 20  r*,void*),.     
236a0 20 20 20 20 76 6f 69 64 20 2a 70 4f 75 74 41 72      void *pOutAr
236b0 67 2c 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20  g,.         int 
236c0 6d 61 6b 65 44 65 66 61 75 6c 74 0a 20 20 20 20  makeDefault.    
236d0 20 20 29 3b 0a 20 20 20 20 20 20 76 66 73 74 72    );.      vfstr
236e0 61 63 65 5f 72 65 67 69 73 74 65 72 28 22 74 72  ace_register("tr
236f0 61 63 65 22 2c 30 2c 28 69 6e 74 28 2a 29 28 63  ace",0,(int(*)(c
23700 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a  onst char*,void*
23710 29 29 66 70 75 74 73 2c 73 74 64 65 72 72 2c 31  ))fputs,stderr,1
23720 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
23730 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
23740 55 4c 54 49 50 4c 45 58 0a 20 20 20 20 7d 65 6c  ULTIPLEX.    }el
23750 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
23760 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29 3d 3d 30  "-multiplex")==0
23770 20 29 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e   ){.      extern
23780 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 6c   int sqlite3_mul
23790 74 69 70 6c 65 5f 69 6e 69 74 69 61 6c 69 7a 65  tiple_initialize
237a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
237b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
237c0 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
237d0 61 6c 69 7a 65 28 30 2c 20 31 29 3b 0a 23 65 6e  alize(0, 1);.#en
237e0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
237f0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61  ( strcmp(z,"-mma
23800 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
23810 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
23820 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
23830 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
23840 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
23850 2b 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  +i));.      sqli
23860 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
23870 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
23880 5a 45 2c 20 73 7a 2c 20 73 7a 29 3b 0a 20 20 20  ZE, sz, sz);.   
23890 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
238a0 70 28 7a 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29  p(z,"-vfs")==0 )
238b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
238c0 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69  vfs *pVfs = sqli
238d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 63 6d 64  te3_vfs_find(cmd
238e0 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
238f0 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29  e(argc,argv,++i)
23900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 66  );.      if( pVf
23910 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
23920 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
23930 72 28 70 56 66 73 2c 20 31 29 3b 0a 20 20 20 20  r(pVfs, 1);.    
23940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23950 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
23960 20 22 6e 6f 20 73 75 63 68 20 56 46 53 3a 20 5c   "no such VFS: \
23970 22 25 73 5c 22 5c 6e 22 2c 20 61 72 67 76 5b 69  "%s\"\n", argv[i
23980 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ]);.        exit
23990 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
239a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 64 61 74   }.  }.  if( dat
239b0 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30  a.zDbFilename==0
239c0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
239d0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
239e0 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c  .    data.zDbFil
239f0 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
23a00 3a 22 3b 0a 20 20 20 20 77 61 72 6e 49 6e 6d 65  :";.    warnInme
23a10 6d 6f 72 79 44 62 20 3d 20 61 72 67 63 3d 3d 31  moryDb = argc==1
23a20 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66 70 72 69  ;.#else.    fpri
23a30 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
23a40 45 72 72 6f 72 3a 20 6e 6f 20 64 61 74 61 62 61  Error: no databa
23a50 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70 65 63  se filename spec
23a60 69 66 69 65 64 5c 6e 22 2c 20 41 72 67 76 30 29  ified\n", Argv0)
23a70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
23a80 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 61 74  #endif.  }.  dat
23a90 61 2e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  a.out = stdout;.
23aa0 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64 20 61  .  /* Go ahead a
23ab0 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  nd open the data
23ac0 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
23ad0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
23ae0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c   If the.  ** fil
23af0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
23b00 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e 67 20  , delay opening 
23b10 69 74 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e  it.  This preven
23b20 74 73 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ts empty databas
23b30 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66 72 6f  e.  ** files fro
23b40 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  m being created 
23b50 69 66 20 61 20 75 73 65 72 20 6d 69 73 74 79 70  if a user mistyp
23b60 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
23b70 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a 20 20  name argument.  
23b80 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ** to the sqlite
23b90 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f   command-line to
23ba0 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  ol..  */.  if( a
23bb0 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62 46 69  ccess(data.zDbFi
23bc0 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b  lename, 0)==0 ){
23bd0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61  .    open_db(&da
23be0 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ta, 0);.  }..  /
23bf0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e  * Process the in
23c00 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c  itialization fil
23c10 65 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  e if there is on
23c20 65 2e 20 20 49 66 20 6e 6f 20 2d 69 6e 69 74 20  e.  If no -init 
23c30 6f 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 67  option.  ** is g
23c40 69 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  iven on the comm
23c50 61 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66  and line, look f
23c60 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20  or a file named 
23c70 7e 2f 2e 73 71 6c 69 74 65 72 63 20 61 6e 64 0a  ~/.sqliterc and.
23c80 20 20 2a 2a 20 74 72 79 20 74 6f 20 70 72 6f 63    ** try to proc
23c90 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 70  ess it..  */.  p
23ca0 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28  rocess_sqliterc(
23cb0 26 64 61 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29  &data,zInitFile)
23cc0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73  ;..  /* Make a s
23cd0 65 63 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75  econd pass throu
23ce0 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  gh the command-l
23cf0 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ine argument and
23d00 20 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e   set.  ** option
23d10 73 2e 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20  s.  This second 
23d20 70 61 73 73 20 69 73 20 64 65 6c 61 79 65 64 20  pass is delayed 
23d30 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
23d40 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
23d50 20 2a 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63   ** file is proc
23d60 65 73 73 65 64 20 73 6f 20 74 68 61 74 20 74 68  essed so that th
23d70 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
23d80 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76  rguments will ov
23d90 65 72 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74  erride.  ** sett
23da0 69 6e 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74  ings in the init
23db0 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e  ialization file.
23dc0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
23dd0 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
23de0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67     char *z = arg
23df0 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
23e00 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e  0]!='-' ) contin
23e10 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d  ue;.    if( z[1]
23e20 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  =='-' ){ z++; }.
23e30 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
23e40 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
23e50 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
23e60 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
23e70 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  z,"-html")==0 ){
23e80 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
23e90 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
23ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
23eb0 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30  mp(z,"-list")==0
23ec0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
23ed0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
23ee0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
23ef0 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29  trcmp(z,"-line")
23f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
23f10 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  a.mode = MODE_Li
23f20 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ne;.    }else if
23f30 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c  ( strcmp(z,"-col
23f40 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  umn")==0 ){.    
23f50 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
23f60 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
23f70 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
23f80 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a  z,"-csv")==0 ){.
23f90 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
23fa0 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
23fb0 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 63 6f    memcpy(data.co
23fc0 6c 53 65 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32  lSeparator,",",2
23fd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
23fe0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 61 73 63 69   strcmp(z,"-asci
23ff0 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i")==0 ){.      
24000 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
24010 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71  _Ascii;.      sq
24020 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
24030 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65  izeof(data.colSe
24040 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61 2e 63  parator), data.c
24050 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20  olSeparator,.   
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 20 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20      SEP_Unit);. 
24080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
24090 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74  rintf(sizeof(dat
240a0 61 2e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  a.rowSeparator),
240b0 20 64 61 74 61 2e 72 6f 77 53 65 70 61 72 61 74   data.rowSeparat
240c0 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
240d0 20 20 20 20 20 20 20 20 20 20 20 53 45 50 5f 52             SEP_R
240e0 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ecord);.    }els
240f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
24100 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20  -separator")==0 
24110 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24120 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
24130 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  (data.colSeparat
24140 6f 72 29 2c 20 64 61 74 61 2e 63 6f 6c 53 65 70  or), data.colSep
24150 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24170 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  %s",cmdline_opti
24180 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
24190 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65  gv,++i));.    }e
241a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
241b0 2c 22 2d 6e 65 77 6c 69 6e 65 22 29 3d 3d 30 20  ,"-newline")==0 
241c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
241d0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
241e0 28 64 61 74 61 2e 72 6f 77 53 65 70 61 72 61 74  (data.rowSeparat
241f0 6f 72 29 2c 20 64 61 74 61 2e 72 6f 77 53 65 70  or), data.rowSep
24200 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24220 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  %s",cmdline_opti
24230 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
24240 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65  gv,++i));.    }e
24250 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
24260 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d  ,"-nullvalue")==
24270 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
24280 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
24290 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 56 61 6c 75  of(data.nullValu
242a0 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 56 61 6c  e), data.nullVal
242b0 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
242c0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 22 2c             "%s",
242d0 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
242e0 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
242f0 2b 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +i));.    }else 
24300 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
24310 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
24320 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
24330 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  der = 1;.    }el
24340 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
24350 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30 20  "-noheader")==0 
24360 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68  ){.      data.sh
24370 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
24380 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
24390 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d 30  mp(z,"-echo")==0
243a0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 65   ){.      data.e
243b0 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  choOn = 1;.    }
243c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
243d0 7a 2c 22 2d 65 71 70 22 29 3d 3d 30 20 29 7b 0a  z,"-eqp")==0 ){.
243e0 20 20 20 20 20 20 64 61 74 61 2e 61 75 74 6f 45        data.autoE
243f0 51 50 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  QP = 1;.    }els
24400 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
24410 2d 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20  -stats")==0 ){. 
24420 20 20 20 20 20 64 61 74 61 2e 73 74 61 74 73 4f       data.statsO
24430 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
24440 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
24450 73 63 61 6e 73 74 61 74 73 22 29 3d 3d 30 20 29  scanstats")==0 )
24460 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 63 61  {.      data.sca
24470 6e 73 74 61 74 73 4f 6e 20 3d 20 31 3b 0a 20 20  nstatsOn = 1;.  
24480 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
24490 6d 70 28 7a 2c 22 2d 62 61 63 6b 73 6c 61 73 68  mp(z,"-backslash
244a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ")==0 ){.      /
244b0 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63  * Undocumented c
244c0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
244d0 6f 6e 3a 20 2d 62 61 63 6b 73 6c 61 73 68 0a 20  on: -backslash. 
244e0 20 20 20 20 20 2a 2a 20 43 61 75 73 65 73 20 43       ** Causes C
244f0 2d 73 74 79 6c 65 20 62 61 63 6b 73 6c 61 73 68  -style backslash
24500 20 65 73 63 61 70 65 73 20 74 6f 20 62 65 20 65   escapes to be e
24510 76 61 6c 75 61 74 65 64 20 69 6e 20 53 51 4c 20  valuated in SQL 
24520 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 20  statements.     
24530 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 73 65 6e   ** prior to sen
24540 64 69 6e 67 20 74 68 65 20 53 51 4c 20 69 6e 74  ding the SQL int
24550 6f 20 53 51 4c 69 74 65 2e 20 20 55 73 65 66 75  o SQLite.  Usefu
24560 6c 20 66 6f 72 20 69 6e 6a 65 63 74 69 6e 67 0a  l for injecting.
24570 20 20 20 20 20 20 2a 2a 20 63 72 61 7a 79 20 62        ** crazy b
24580 79 74 65 73 20 69 6e 20 74 68 65 20 6d 69 64 64  ytes in the midd
24590 6c 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  le of SQL statem
245a0 65 6e 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ents for testing
245b0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a   and debugging..
245c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
245d0 61 74 61 2e 62 61 63 6b 73 6c 61 73 68 4f 6e 20  ata.backslashOn 
245e0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
245f0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
24600 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  il")==0 ){.     
24610 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
24620 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
24630 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72  ( strcmp(z,"-ver
24640 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
24650 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73     printf("%s %s
24660 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  \n", sqlite3_lib
24670 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74  version(), sqlit
24680 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
24690 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
246a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
246b0 72 63 6d 70 28 7a 2c 22 2d 69 6e 74 65 72 61 63  rcmp(z,"-interac
246c0 74 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tive")==0 ){.   
246d0 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
246e0 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 20 20 20  ractive = 1;.   
246f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
24700 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30  p(z,"-batch")==0
24710 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e 5f   ){.      stdin_
24720 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
24730 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
24740 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61  ( strcmp(z,"-hea
24750 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
24760 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
24770 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 63  f( strcmp(z,"-sc
24780 72 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  ratch")==0 ){.  
24790 20 20 20 20 69 2b 3d 32 3b 0a 20 20 20 20 7d 65      i+=2;.    }e
247a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
247b0 2c 22 2d 70 61 67 65 63 61 63 68 65 22 29 3d 3d  ,"-pagecache")==
247c0 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 3d 32 3b  0 ){.      i+=2;
247d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
247e0 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 6f 6b 61 73  trcmp(z,"-lookas
247f0 69 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ide")==0 ){.    
24800 20 20 69 2b 3d 32 3b 0a 20 20 20 20 7d 65 6c 73    i+=2;.    }els
24810 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
24820 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20  -mmap")==0 ){.  
24830 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c      i++;.    }el
24840 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
24850 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20  "-vfs")==0 ){.  
24860 20 20 20 20 69 2b 2b 3b 0a 23 69 66 64 65 66 20      i++;.#ifdef 
24870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46  SQLITE_ENABLE_VF
24880 53 54 52 41 43 45 0a 20 20 20 20 7d 65 6c 73 65  STRACE.    }else
24890 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
248a0 76 66 73 74 72 61 63 65 22 29 3d 3d 30 20 29 7b  vfstrace")==0 ){
248b0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23 65 6e 64  .      i++;.#end
248c0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
248d0 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45  _ENABLE_MULTIPLE
248e0 58 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  X.    }else if( 
248f0 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 75 6c 74 69  strcmp(z,"-multi
24900 70 6c 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  plex")==0 ){.   
24910 20 20 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20     i++;.#endif. 
24920 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
24930 63 6d 70 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d  cmp(z,"-help")==
24940 30 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65  0 ){.      usage
24950 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  (1);.    }else i
24960 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6d  f( strcmp(z,"-cm
24970 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
24980 2f 2a 20 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20  /* Run commands 
24990 74 68 61 74 20 66 6f 6c 6c 6f 77 20 2d 63 6d 64  that follow -cmd
249a0 20 66 69 72 73 74 20 61 6e 64 20 73 65 70 61 72   first and separ
249b0 61 74 65 6c 79 20 66 72 6f 6d 20 63 6f 6d 6d 61  ately from comma
249c0 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nds.      ** tha
249d0 74 20 73 69 6d 70 6c 79 20 61 70 70 65 61 72 20  t simply appear 
249e0 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  on the command-l
249f0 69 6e 65 2e 20 20 54 68 69 73 20 73 65 65 6d 73  ine.  This seems
24a00 20 67 6f 6f 66 79 2e 20 20 49 74 20 77 6f 75 6c   goofy.  It woul
24a10 64 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 62 65  d.      ** be be
24a20 74 74 65 72 20 69 66 20 61 6c 6c 20 63 6f 6d 6d  tter if all comm
24a30 61 6e 64 73 20 72 61 6e 20 69 6e 20 74 68 65 20  ands ran in the 
24a40 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20  order that they 
24a50 61 70 70 65 61 72 2e 20 20 42 75 74 0a 20 20 20  appear.  But.   
24a60 20 20 20 2a 2a 20 77 65 20 72 65 74 61 69 6e 20     ** we retain 
24a70 74 68 65 20 67 6f 6f 66 79 20 62 65 68 61 76 69  the goofy behavi
24a80 6f 72 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  or for historica
24a90 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
24aa0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d   */.      if( i=
24ab0 3d 61 72 67 63 2d 31 20 29 20 62 72 65 61 6b 3b  =argc-1 ) break;
24ac0 0a 20 20 20 20 20 20 7a 20 3d 20 63 6d 64 6c 69  .      z = cmdli
24ad0 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
24ae0 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 3b 0a  argc,argv,++i);.
24af0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
24b00 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  '.' ){.        r
24b10 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
24b20 61 6e 64 28 7a 2c 20 26 64 61 74 61 29 3b 0a 20  and(z, &data);. 
24b30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26         if( rc &&
24b40 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29   bail_on_error )
24b50 20 72 65 74 75 72 6e 20 72 63 3d 3d 32 20 3f 20   return rc==2 ? 
24b60 30 20 3a 20 72 63 3b 0a 20 20 20 20 20 20 7d 65  0 : rc;.      }e
24b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  lse{.        ope
24b80 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a  n_db(&data, 0);.
24b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
24ba0 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  ll_exec(data.db,
24bb0 20 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61   z, shell_callba
24bc0 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
24bd0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Msg);.        if
24be0 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
24bf0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
24c00 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
24c10 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
24c20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24c30 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20  bail_on_error ) 
24c40 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72  return rc!=0 ? r
24c50 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c : 1;.        }
24c60 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
24c70 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
24c80 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
24c90 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f  r: unable to pro
24ca0 63 65 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c  cess SQL \"%s\"\
24cb0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
24cc0 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e 5f 65 72    if( bail_on_er
24cd0 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ror ) return rc;
24ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24cf0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
24d00 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
24d10 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 75  rr,"%s: Error: u
24d20 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
24d30 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b  s\n", Argv0, z);
24d40 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
24d50 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
24d60 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
24d70 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
24d80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
24d90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 72   }.  }..  if( !r
24da0 65 61 64 53 74 64 69 6e 20 29 7b 0a 20 20 20 20  eadStdin ){.    
24db0 2f 2a 20 52 75 6e 20 61 6c 6c 20 61 72 67 75 6d  /* Run all argum
24dc0 65 6e 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ents that do not
24dd0 20 62 65 67 69 6e 20 77 69 74 68 20 27 2d 27 20   begin with '-' 
24de0 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
24df0 73 65 70 61 72 61 74 65 0a 20 20 20 20 2a 2a 20  separate.    ** 
24e00 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 69 6e 70  command-line inp
24e10 75 74 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  uts, except for 
24e20 74 68 65 20 61 72 67 54 6f 53 6b 69 70 20 61 72  the argToSkip ar
24e30 67 75 6d 65 6e 74 20 77 68 69 63 68 20 63 6f 6e  gument which con
24e40 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  tains.    ** the
24e50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
24e60 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  me..    */.    f
24e70 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 64 3b 20  or(i=0; i<nCmd; 
24e80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
24e90 61 7a 43 6d 64 5b 69 5d 5b 30 5d 3d 3d 27 2e 27  azCmd[i][0]=='.'
24ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24eb0 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
24ec0 28 61 7a 43 6d 64 5b 69 5d 2c 20 26 64 61 74 61  (azCmd[i], &data
24ed0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
24ee0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3d 3d 32  c ) return rc==2
24ef0 20 3f 20 30 20 3a 20 72 63 3b 0a 20 20 20 20 20   ? 0 : rc;.     
24f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24f10 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 2c 20 30  open_db(&data, 0
24f20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
24f30 73 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e  shell_exec(data.
24f40 64 62 2c 20 61 7a 43 6d 64 5b 69 5d 2c 20 73 68  db, azCmd[i], sh
24f50 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64  ell_callback, &d
24f60 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
24f70 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72          if( zErr
24f80 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
24f90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
24fa0 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
24fb0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
24fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 21        return rc!
24fd0 3d 30 20 3f 20 72 63 20 3a 20 31 3b 0a 20 20 20  =0 ? rc : 1;.   
24fe0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
24ff0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
25000 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
25010 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
25020 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 3a 20  to process SQL: 
25030 25 73 5c 6e 22 2c 20 61 7a 43 6d 64 5b 69 5d 29  %s\n", azCmd[i])
25040 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
25050 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
25060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25070 20 20 20 66 72 65 65 28 61 7a 43 6d 64 29 3b 0a     free(azCmd);.
25080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25090 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63  Run commands rec
250a0 65 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64  eived from stand
250b0 61 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f  ard input.    */
250c0 0a 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69  .    if( stdin_i
250d0 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b  s_interactive ){
250e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f  .      char *zHo
250f0 6d 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  me;.      char *
25100 7a 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20  zHistory = 0;.  
25110 20 20 20 20 69 6e 74 20 6e 48 69 73 74 6f 72 79      int nHistory
25120 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a  ;.      printf(.
25130 20 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20          "SQLite 
25140 76 65 72 73 69 6f 6e 20 25 73 20 25 2e 31 39 73  version %s %.19s
25150 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73  \n" /*extra-vers
25160 69 6f 6e 2d 69 6e 66 6f 2a 2f 0a 20 20 20 20 20  ion-info*/.     
25170 20 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c     "Enter \".hel
25180 70 5c 22 20 66 6f 72 20 75 73 61 67 65 20 68 69  p\" for usage hi
25190 6e 74 73 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  nts.\n",.       
251a0 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
251b0 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73  ion(), sqlite3_s
251c0 6f 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20  ourceid().      
251d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72  );.      if( war
251e0 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20  nInmemoryDb ){. 
251f0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43         printf("C
25200 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 22 29  onnected to a ")
25210 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 42  ;.        printB
25220 6f 6c 64 28 22 74 72 61 6e 73 69 65 6e 74 20 69  old("transient i
25230 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
25240 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  e");.        pri
25250 6e 74 66 28 22 2e 5c 6e 55 73 65 20 5c 22 2e 6f  ntf(".\nUse \".o
25260 70 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20 74  pen FILENAME\" t
25270 6f 20 72 65 6f 70 65 6e 20 6f 6e 20 61 20 22 0a  o reopen on a ".
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25290 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
252a0 61 73 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ase.\n");.      
252b0 7d 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20  }.      zHome = 
252c0 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b  find_home_dir();
252d0 0a 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65  .      if( zHome
252e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73   ){.        nHis
252f0 74 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28  tory = strlen30(
25300 7a 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20  zHome) + 20;.   
25310 20 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f       if( (zHisto
25320 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73  ry = malloc(nHis
25330 74 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20  tory))!=0 ){.   
25340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
25350 6e 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79  nprintf(nHistory
25360 2c 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e  , zHistory,"%s/.
25370 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c  sqlite_history",
25380 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20   zHome);.       
25390 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
253a0 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29 7b   if( zHistory ){
253b0 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74   shell_read_hist
253c0 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b 20 7d  ory(zHistory); }
253d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63  .      rc = proc
253e0 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c  ess_input(&data,
253f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
25400 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
25410 20 20 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f     shell_stifle_
25420 68 69 73 74 6f 72 79 28 31 30 30 29 3b 0a 20 20  history(100);.  
25430 20 20 20 20 20 20 73 68 65 6c 6c 5f 77 72 69 74        shell_writ
25440 65 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f  e_history(zHisto
25450 72 79 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ry);.        fre
25460 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  e(zHistory);.   
25470 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25480 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65        rc = proce
25490 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c 20  ss_input(&data, 
254a0 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  stdin);.    }.  
254b0 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61  }.  set_table_na
254c0 6d 65 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20  me(&data, 0);.  
254d0 69 66 28 20 64 61 74 61 2e 64 62 20 29 7b 0a 20  if( data.db ){. 
254e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
254f0 28 64 61 74 61 2e 64 62 29 3b 0a 20 20 7d 0a 20  (data.db);.  }. 
25500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 61   sqlite3_free(da
25510 74 61 2e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29  ta.zFreeOnClose)
25520 3b 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ; .  return rc;.
25530 7d 0a                                            }.