/ Hex Artifact Content
Login

Artifact 21b79c0e1b93f8e35fd7b4087d6ba438326c3d7e285d0dd51dfd741475f858a1:


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 0a 23 20  ad_history(X).# 
0940: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0950: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  te_history(X).# 
0960: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69  define shell_sti
0970: 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 0a  fle_history(X)..
0980: 23 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 55  # define SHELL_U
0990: 53 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45  SE_LOCAL_GETLINE
09a0: 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20   1.#endif...#if 
09b0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
09c0: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
09d0: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e  ).# include <io.
09e0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66 63  h>.# include <fc
09f0: 6e 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20  ntl.h>.# define 
0a00: 69 73 61 74 74 79 28 68 29 20 5f 69 73 61 74 74  isatty(h) _isatt
0a10: 79 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61 63  y(h).# ifndef ac
0a20: 63 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20 61  cess.#  define a
0a30: 63 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63 65  ccess(f,m) _acce
0a40: 73 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65 6e  ss((f),(m)).# en
0a50: 64 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70 65  dif.# undef pope
0a60: 6e 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65 6e  n.# define popen
0a70: 20 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20   _popen.# undef 
0a80: 70 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65 20  pclose.# define 
0a90: 70 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23  pclose _pclose.#
0aa0: 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75  else. /* Make su
0ab0: 72 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20  re isatty() has 
0ac0: 61 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a  a prototype. */.
0ad0: 20 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74   extern int isat
0ae0: 74 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21  ty(int);..# if !
0af0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0b00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52   && !defined(_WR
0b10: 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70  S_KERNEL).  /* p
0b20: 6f 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20  open and pclose 
0b30: 61 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e 63  are not C89 func
0b40: 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72 65  tions and so are
0b50: 0a 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  .  ** sometimes 
0b60: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
0b70: 20 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64 65   <stdio.h> heade
0b80: 72 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20 46  r */.   extern F
0b90: 49 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74  ILE *popen(const
0ba0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
0bb0: 72 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20 69  r*);.   extern i
0bc0: 6e 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29  nt pclose(FILE*)
0bd0: 3b 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  ;.# else.#  defi
0be0: 6e 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ne SQLITE_OMIT_P
0bf0: 4f 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23  OPEN 1.# endif.#
0c00: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
0c10: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f  ed(_WIN32_WCE)./
0c20: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72  * Windows CE (ar
0c30: 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63  m-wince-mingw32c
0c40: 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20  e-gcc) does not 
0c50: 70 72 6f 76 69 64 65 20 69 73 61 74 74 79 28 29  provide isatty()
0c60: 0a 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77 61  . * thus we alwa
0c70: 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  ys assume that w
0c80: 65 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65  e have a console
0c90: 2e 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20 2a  . That can be. *
0ca0: 20 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74 68   overridden with
0cb0: 20 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d   the -batch comm
0cc0: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and line option.
0cd0: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 61  . */.#define isa
0ce0: 74 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66 0a  tty(x) 1.#endif.
0cf0: 0a 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f 73  ./* ctype macros
0d00: 20 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68 20   that work with 
0d10: 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
0d20: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73 53  s */.#define IsS
0d30: 70 61 63 65 28 58 29 20 20 69 73 73 70 61 63 65  pace(X)  isspace
0d40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
0d50: 58 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69 67  X).#define IsDig
0d60: 69 74 28 58 29 20 20 69 73 64 69 67 69 74 28 28  it(X)  isdigit((
0d70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
0d80: 0a 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72  .#define ToLower
0d90: 28 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f 77  (X)  (char)tolow
0da0: 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er((unsigned cha
0db0: 72 29 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  r)X)..#if define
0dc0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
0dd0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 69 6e 63  ined(WIN32).#inc
0de0: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
0df0: 0a 0a 2f 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76  ../* string conv
0e00: 65 72 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  ersion routines 
0e10: 6f 6e 6c 79 20 6e 65 65 64 65 64 20 6f 6e 20 57  only needed on W
0e20: 69 6e 33 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63  in32 */.extern c
0e30: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
0e40: 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74  32_unicode_to_ut
0e50: 66 38 28 4c 50 43 57 53 54 52 29 3b 0a 65 78 74  f8(LPCWSTR);.ext
0e60: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
0e70: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
0e80: 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68  utf8_v2(const ch
0e90: 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65  ar *, int);.exte
0ea0: 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
0eb0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
0ec0: 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  bcs_v2(const cha
0ed0: 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72  r *, int);.exter
0ee0: 6e 20 4c 50 57 53 54 52 20 73 71 6c 69 74 65 33  n LPWSTR sqlite3
0ef0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75  _win32_utf8_to_u
0f00: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
0f10: 72 20 2a 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69  r *zText);.#endi
0f20: 66 0a 0a 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73  f../* On Windows
0f30: 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75  , we normally ru
0f40: 6e 20 77 69 74 68 20 6f 75 74 70 75 74 20 6d 6f  n with output mo
0f50: 64 65 20 6f 66 20 54 45 58 54 20 73 6f 20 74 68  de of TEXT so th
0f60: 61 74 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73  at \n characters
0f70: 0a 2a 2a 20 61 72 65 20 61 75 74 6f 6d 61 74 69  .** are automati
0f80: 63 61 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65 64  cally translated
0f90: 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77   into \r\n.  How
0fa0: 65 76 65 72 2c 20 74 68 69 73 20 62 65 68 61 76  ever, this behav
0fb0: 69 6f 72 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  ior needs.** to 
0fc0: 62 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 73  be disabled in s
0fd0: 6f 6d 65 20 63 61 73 65 73 20 28 65 78 3a 20 77  ome cases (ex: w
0fe0: 68 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 43  hen generating C
0ff0: 53 56 20 6f 75 74 70 75 74 20 61 6e 64 20 77 68  SV output and wh
1000: 65 6e 0a 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20  en.** rendering 
1010: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 74  quoted strings t
1020: 68 61 74 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63  hat contain \n c
1030: 68 61 72 61 63 74 65 72 73 29 2e 20 20 54 68 65  haracters).  The
1040: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
1050: 75 74 69 6e 65 73 20 74 61 6b 65 20 63 61 72 65  utines take care
1060: 20 6f 66 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66   of that..*/.#if
1070: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
1080: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
1090: 32 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  2).static void s
10a0: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c  etBinaryMode(FIL
10b0: 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f  E *file, int isO
10c0: 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73  utput){.  if( is
10d0: 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28  Output ) fflush(
10e0: 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64  file);.  _setmod
10f0: 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c  e(_fileno(file),
1100: 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73   _O_BINARY);.}.s
1110: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65  tatic void setTe
1120: 78 74 4d 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c  xtMode(FILE *fil
1130: 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75 74 29  e, int isOutput)
1140: 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70 75 74  {.  if( isOutput
1150: 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65 29 3b   ) fflush(file);
1160: 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c  .  _setmode(_fil
1170: 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45  eno(file), _O_TE
1180: 58 54 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  XT);.}.#else.# d
1190: 65 66 69 6e 65 20 73 65 74 42 69 6e 61 72 79 4d  efine setBinaryM
11a0: 6f 64 65 28 58 2c 59 29 0a 23 20 64 65 66 69 6e  ode(X,Y).# defin
11b0: 65 20 73 65 74 54 65 78 74 4d 6f 64 65 28 58 2c  e setTextMode(X,
11c0: 59 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54  Y).#endif.../* T
11d0: 72 75 65 20 69 66 20 74 68 65 20 74 69 6d 65 72  rue if the timer
11e0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
11f0: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65  tatic int enable
1200: 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52  Timer = 0;../* R
1210: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1220: 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d  t wall-clock tim
1230: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  e */.static sqli
1240: 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66  te3_int64 timeOf
1250: 44 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Day(void){.  sta
1260: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
1270: 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20  *clockVfs = 0;. 
1280: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1290: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
12a0: 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d  ==0 ) clockVfs =
12b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
12c0: 64 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63  d(0);.  if( cloc
12d0: 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  kVfs->iVersion>=
12e0: 32 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  2 && clockVfs->x
12f0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
1300: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b  !=0 ){.    clock
1310: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
1320: 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c  eInt64(clockVfs,
1330: 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   &t);.  }else{. 
1340: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
1350: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1360: 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73  entTime(clockVfs
1370: 2c 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20 28  , &r);.    t = (
1380: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
1390: 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20  *86400000.0);.  
13a0: 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a  }.  return t;.}.
13b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
13c0: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
13d0: 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  d(WIN32) && !def
13e0: 69 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69  ined(__minux).#i
13f0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
1400: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1410: 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f  s/resource.h>../
1420: 2a 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e  * VxWorks does n
1430: 6f 74 20 73 75 70 70 6f 72 74 20 67 65 74 72 75  ot support getru
1440: 73 61 67 65 28 29 20 61 73 20 66 61 72 20 61 73  sage() as far as
1450: 20 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e   we can determin
1460: 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  e */.#if defined
1470: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c  (_WRS_KERNEL) ||
1480: 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f   defined(__RTP__
1490: 29 0a 73 74 72 75 63 74 20 72 75 73 61 67 65 20  ).struct rusage 
14a0: 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  {.  struct timev
14b0: 61 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20  al ru_utime; /* 
14c0: 75 73 65 72 20 43 50 55 20 74 69 6d 65 20 75 73  user CPU time us
14d0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74  ed */.  struct t
14e0: 69 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b  imeval ru_stime;
14f0: 20 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20 74   /* system CPU t
1500: 69 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23  ime used */.};.#
1510: 64 65 66 69 6e 65 20 67 65 74 72 75 73 61 67 65  define getrusage
1520: 28 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c 30  (A,B) memset(B,0
1530: 2c 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e  ,sizeof(*B)).#en
1540: 64 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65  dif../* Saved re
1550: 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69  source informati
1560: 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e  on for the begin
1570: 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61  ning of an opera
1580: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73  tion */.static s
1590: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 42 65  truct rusage sBe
15a0: 67 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d  gin;  /* CPU tim
15b0: 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73 74  e at start */.st
15c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
15d0: 36 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57  64 iBegin;  /* W
15e0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61  all-clock time a
15f0: 74 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a  t start */../*.*
1600: 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61  * Begin timing a
1610: 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73  n operation.*/.s
1620: 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e  tatic void begin
1630: 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  Timer(void){.  i
1640: 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29  f( enableTimer )
1650: 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  {.    getrusage(
1660: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 42  RUSAGE_SELF, &sB
1670: 65 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67 69  egin);.    iBegi
1680: 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  n = timeOfDay();
1690: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  .  }.}../* Retur
16a0: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
16b0: 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74 72   of two time_str
16c0: 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20  ucts in seconds 
16d0: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
16e0: 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63 74   timeDiff(struct
16f0: 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72 74   timeval *pStart
1700: 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  , struct timeval
1710: 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75 72   *pEnd){.  retur
1720: 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63  n (pEnd->tv_usec
1730: 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75 73   - pStart->tv_us
1740: 65 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20  ec)*0.000001 +. 
1750: 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29          (double)
1760: 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20  (pEnd->tv_sec - 
1770: 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b  pStart->tv_sec);
1780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
1790: 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c  the timing resul
17a0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
17b0: 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64  id endTimer(void
17c0: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
17d0: 69 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  imer ){.    sqli
17e0: 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d  te3_int64 iEnd =
17f0: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1800: 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
1810: 73 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75 73  sEnd;.    getrus
1820: 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c  age(RUSAGE_SELF,
1830: 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72 69   &sEnd);.    pri
1840: 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72  ntf("Run Time: r
1850: 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66  eal %.3f user %f
1860: 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20   sys %f\n",.    
1870: 20 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67 69     (iEnd - iBegi
1880: 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20  n)*0.001,.      
1890: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
18a0: 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e  n.ru_utime, &sEn
18b0: 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20  d.ru_utime),.   
18c0: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42      timeDiff(&sB
18d0: 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26  egin.ru_stime, &
18e0: 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b  sEnd.ru_stime));
18f0: 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  .  }.}..#define 
1900: 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69  BEGIN_TIMER begi
1910: 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  nTimer().#define
1920: 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69   END_TIMER endTi
1930: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41  mer().#define HA
1940: 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66  S_TIMER 1..#elif
1950: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
1960: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
1970: 33 32 29 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72  32))../* Saved r
1980: 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74  esource informat
1990: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69  ion for the begi
19a0: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72  nning of an oper
19b0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
19c0: 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 3b  HANDLE hProcess;
19d0: 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45  .static FILETIME
19e0: 20 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a   ftKernelBegin;.
19f0: 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20  static FILETIME 
1a00: 66 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74 61  ftUserBegin;.sta
1a10: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
1a20: 34 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74  4 ftWallBegin;.t
1a30: 79 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e  ypedef BOOL (WIN
1a40: 41 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d 45  API *GETPROCTIME
1a50: 53 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c  S)(HANDLE, LPFIL
1a60: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1a70: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
1aa0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a  E, LPFILETIME);.
1ab0: 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49  static GETPROCTI
1ac0: 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69  MES getProcessTi
1ad0: 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a  mesAddr = NULL;.
1ae0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
1af0: 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74  see if we have t
1b00: 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52  imer support.  R
1b10: 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73  eturn 1 if neces
1b20: 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20  sary.** support 
1b30: 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20  found (or found 
1b40: 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a  previously)..*/.
1b50: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69  static int hasTi
1b60: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
1b70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1b80: 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75  Addr ){.    retu
1b90: 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 1;.  } else {
1ba0: 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65  .    /* GetProce
1bb0: 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20  ssTimes() isn't 
1bc0: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e  supported in WIN
1bd0: 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65  95 and some othe
1be0: 72 20 57 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a  r Windows.    **
1bf0: 20 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20 69   versions. See i
1c00: 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65  f the version we
1c10: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
1c20: 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69  has it, and if i
1c30: 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73  t.    ** does, s
1c40: 61 76 65 20 6f 66 66 20 61 20 70 6f 69 6e 74 65  ave off a pointe
1c50: 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20  r to it and the 
1c60: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
1c70: 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  handle..    */. 
1c80: 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65     hProcess = Ge
1c90: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28  tCurrentProcess(
1ca0: 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63  );.    if( hProc
1cb0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e  ess ){.      HIN
1cc0: 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20  STANCE hinstLib 
1cd0: 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45  = LoadLibrary(TE
1ce0: 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c  XT("Kernel32.dll
1cf0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e  "));.      if( N
1d00: 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20  ULL != hinstLib 
1d10: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72  ){.        getPr
1d20: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 47 45  .            (GE
1d40: 54 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74 50  TPROCTIMES) GetP
1d50: 72 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73 74  rocAddress(hinst
1d60: 4c 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73 73  Lib, "GetProcess
1d70: 54 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20 20  Times");.       
1d80: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74   if( NULL != get
1d90: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1db0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1dc0: 7d 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c 69  }.        FreeLi
1dd0: 62 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29 3b  brary(hinstLib);
1de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1df0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1e00: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69  ../*.** Begin ti
1e10: 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  ming an operatio
1e20: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
1e30: 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64   beginTimer(void
1e40: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
1e50: 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65  imer && getProce
1e60: 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20  ssTimesAddr ){. 
1e70: 20 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72     FILETIME ftCr
1e80: 65 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a  eation, ftExit;.
1e90: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
1ea0: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
1eb0: 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74  ,&ftCreation,&ft
1ec0: 45 78 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Exit,.          
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 66                &f
1ee0: 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74  tKernelBegin,&ft
1ef0: 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20 20  UserBegin);.    
1f00: 66 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69  ftWallBegin = ti
1f10: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d  meOfDay();.  }.}
1f20: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
1f30: 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77  difference of tw
1f40: 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  o FILETIME struc
1f50: 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f  ts in seconds */
1f60: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74  .static double t
1f70: 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d 45  imeDiff(FILETIME
1f80: 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54 49   *pStart, FILETI
1f90: 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c  ME *pEnd){.  sql
1fa0: 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74 61  ite_int64 i64Sta
1fb0: 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  rt = *((sqlite_i
1fc0: 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29 3b  nt64 *) pStart);
1fd0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
1fe0: 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69  i64End = *((sqli
1ff0: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e 64  te_int64 *) pEnd
2000: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f 75  );.  return (dou
2010: 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d 20  ble) ((i64End - 
2020: 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30 30  i64Start) / 1000
2030: 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  0000.0);.}../*.*
2040: 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69  * Print the timi
2050: 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73  ng results..*/.s
2060: 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69  tatic void endTi
2070: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
2080: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20   enableTimer && 
2090: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
20a0: 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54 49  ddr){.    FILETI
20b0: 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66  ME ftCreation, f
20c0: 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45  tExit, ftKernelE
20d0: 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a 20  nd, ftUserEnd;. 
20e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
20f0: 20 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d   ftWallEnd = tim
2100: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67 65  eOfDay();.    ge
2110: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
2120: 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43 72  r(hProcess,&ftCr
2130: 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26  eation,&ftExit,&
2140: 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55  ftKernelEnd,&ftU
2150: 73 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72 69  serEnd);.    pri
2160: 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72  ntf("Run Time: r
2170: 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66  eal %.3f user %f
2180: 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20   sys %f\n",.    
2190: 20 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20     (ftWallEnd - 
21a0: 66 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30  ftWallBegin)*0.0
21b0: 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  01,.       timeD
21c0: 69 66 66 28 26 66 74 55 73 65 72 42 65 67 69 6e  iff(&ftUserBegin
21d0: 2c 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a 20  , &ftUserEnd),. 
21e0: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
21f0: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26  ftKernelBegin, &
2200: 66 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20  ftKernelEnd));. 
2210: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45   }.}..#define BE
2220: 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54  GIN_TIMER beginT
2230: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45  imer().#define E
2240: 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65  ND_TIMER endTime
2250: 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  r().#define HAS_
2260: 54 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28 29  TIMER hasTimer()
2270: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
2280: 42 45 47 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66  BEGIN_TIMER.#def
2290: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64  ine END_TIMER.#d
22a0: 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20  efine HAS_TIMER 
22b0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
22c0: 55 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20  Used to prevent 
22d0: 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75  warnings about u
22e0: 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73  nused parameters
22f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53  .*/.#define UNUS
2300: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20  ED_PARAMETER(x) 
2310: 28 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a  (void)(x)../*.**
2320: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
2330: 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  g flag is set, t
2340: 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63  hen command exec
2350: 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20 61  ution stops.** a
2360: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65  t an error if we
2370: 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61 63   are not interac
2380: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
2390: 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f  int bail_on_erro
23a0: 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  r = 0;../*.** Th
23b0: 72 65 61 74 20 73 74 64 69 6e 20 61 73 20 61 6e  reat stdin as an
23c0: 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70   interactive inp
23d0: 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ut if the follow
23e0: 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ing variable.** 
23f0: 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77  is true.  Otherw
2400: 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64 69  ise, assume stdi
2410: 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  n is connected t
2420: 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70 65  o a file or pipe
2430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2440: 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
2450: 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a  tive = 1;../*.**
2460: 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74   On Windows syst
2470: 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f 20 6b  ems we have to k
2480: 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72 64 20  now if standard 
2490: 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f 6e 73  output is a cons
24a0: 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ole.** in order 
24b0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55 54 46  to translate UTF
24c0: 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20 20 54  -8 into MBCS.  T
24d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
24e0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72 75 65  iable is.** true
24f0: 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20   if translation 
2500: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
2510: 73 74 61 74 69 63 20 69 6e 74 20 73 74 64 6f 75  static int stdou
2520: 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20 31  t_is_console = 1
2530: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
2540: 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70  lowing is the op
2550: 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  en SQLite databa
2560: 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70  se.  We make a p
2570: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69  ointer.** to thi
2580: 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61  s database a sta
2590: 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20  tic variable so 
25a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61  that it can be a
25b0: 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68  ccessed.** by th
25c0: 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72  e SIGINT handler
25d0: 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61   to interrupt da
25e0: 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e  tabase processin
25f0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  g..*/.static sql
2600: 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20 3d  ite3 *globalDb =
2610: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20   0;../*.** True 
2620: 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  if an interrupt 
2630: 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73 20  (Control-C) has 
2640: 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a 2a  been received..*
2650: 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69 6c  /.static volatil
2660: 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72  e int seenInterr
2670: 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  upt = 0;../*.** 
2680: 54 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65  This is the name
2690: 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e   of our program.
26a0: 20 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61   It is set in ma
26b0: 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e  in(), used.** in
26c0: 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68   a number of oth
26d0: 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c  er places, mostl
26e0: 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  y for error mess
26f0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
2700: 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a  char *Argv0;../*
2710: 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e  .** Prompt strin
2720: 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  gs. Initialized 
2730: 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c  in main. Settabl
2740: 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f  e with.**   .pro
2750: 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75  mpt main continu
2760: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
2770: 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b   mainPrompt[20];
2780: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69       /* First li
2790: 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  ne prompt. defau
27a0: 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f  lt: "sqlite> "*/
27b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e  .static char con
27c0: 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b  tinuePrompt[20];
27d0: 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e   /* Continuation
27e0: 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74   prompt. default
27f0: 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a  : "   ...> " */.
2800: 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75  ./*.** Render ou
2810: 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74  tput like fprint
2820: 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66  f().  Except, if
2830: 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
2840: 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 63  oing to the.** c
2850: 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20 74 68  onsole and if th
2860: 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e  is is running on
2870: 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63 68 69   a Windows machi
2880: 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20 74 68  ne, translate th
2890: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d  e.** output from
28a0: 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53   UTF-8 into MBCS
28b0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
28c0: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
28d0: 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69 64 20  ned(WIN32).void 
28e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49 4c 45  utf8_printf(FILE
28f0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
2900: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2910: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2920: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2930: 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 73  Format);.  if( s
2940: 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65  tdout_is_console
2950: 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f 75 74   && (out==stdout
2960: 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72 72 29   || out==stderr)
2970: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 31   ){.    char *z1
2980: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
2990: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
29a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32 20 3d  ;.    char *z2 =
29b0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
29c0: 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 7a  tf8_to_mbcs_v2(z
29d0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
29e0: 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20 20 20  e3_free(z1);.   
29f0: 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74 29 3b   fputs(z2, out);
2a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a10: 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(z2);.  }else{.
2a20: 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f 75 74      vfprintf(out
2a30: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
2a40: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
2a50: 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  ;.}.#elif !defin
2a60: 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66 29 0a  ed(utf8_printf).
2a70: 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f 70 72  # define utf8_pr
2a80: 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23 65 6e  intf fprintf.#en
2a90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65  dif../*.** Rende
2aa0: 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70  r output like fp
2ab0: 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73 20 73  rintf().  This s
2ac0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
2ad0: 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  d on anything th
2ae0: 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73 20 73  at.** includes s
2af0: 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67  tring formatting
2b00: 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a 2a 2f   (e.g. "%s")..*/
2b10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 72 61  .#if !defined(ra
2b20: 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  w_printf).# defi
2b30: 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20 66 70  ne raw_printf fp
2b40: 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rintf.#endif../*
2b50: 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72  .** Write I/O tr
2b60: 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c  aces to the foll
2b70: 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f  owing stream..*/
2b80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2b90: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74  NABLE_IOTRACE.st
2ba0: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
2bb0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
2bc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bd0: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72  ne works like pr
2be0: 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74 73  intf in that its
2bf0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2c00: 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73  is a.** format s
2c10: 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71  tring and subseq
2c20: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61  uent arguments a
2c30: 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  re values to be 
2c40: 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69  substituted.** i
2c50: 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65  n place of % fie
2c60: 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  lds.  The result
2c70: 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74   of formatting t
2c80: 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  his string.** is
2c90: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72   written to iotr
2ca0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ace..*/.#ifdef S
2cb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
2cc0: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
2cd0: 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 69 6f   SQLITE_CDECL io
2ce0: 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73  tracePrintf(cons
2cf0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2d00: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2d10: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
2d20: 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30    if( iotrace==0
2d30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f   ) return;.  va_
2d40: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
2d50: 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  t);.  z = sqlite
2d60: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
2d70: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2d80: 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72  d(ap);.  utf8_pr
2d90: 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25  intf(iotrace, "%
2da0: 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65  s", z);.  sqlite
2db0: 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e  3_free(z);.}.#en
2dc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  dif../*.** Outpu
2dd0: 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20 74 6f  t string zUtf to
2de0: 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61 73 20   stream pOut as 
2df0: 77 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49  w characters.  I
2e00: 66 20 77 20 69 73 20 6e 65 67 61 74 69 76 65 2c  f w is negative,
2e10: 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74 2d 6a  .** then right-j
2e20: 75 73 74 69 66 79 20 74 68 65 20 74 65 78 74 2e  ustify the text.
2e30: 20 20 57 20 69 73 20 74 68 65 20 77 69 64 74 68    W is the width
2e40: 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72 61 63   in UTF-8 charac
2e50: 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e 20  ters, not.** in 
2e60: 62 79 74 65 73 2e 20 20 54 68 69 73 20 69 73 20  bytes.  This is 
2e70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
2e80: 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69 66 69  he %*.*s specifi
2e90: 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74 66  cation in printf
2ea0: 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68 20 25  .** since with %
2eb0: 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68 20 69  *.*s the width i
2ec0: 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79  s measured in by
2ed0: 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61 63 74  tes, not charact
2ee0: 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ers..*/.static v
2ef0: 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68 5f 70  oid utf8_width_p
2f00: 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74 2c  rint(FILE *pOut,
2f10: 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63 68   int w, const ch
2f20: 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e 74  ar *zUtf){.  int
2f30: 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69   i;.  int n;.  i
2f40: 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d 77  nt aw = w<0 ? -w
2f50: 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a 42 75   : w;.  char zBu
2f60: 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 61  f[1000];.  if( a
2f70: 77 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33  w>sizeof(zBuf)/3
2f80: 20 29 20 61 77 20 3d 20 73 69 7a 65 6f 66 28 7a   ) aw = sizeof(z
2f90: 42 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d  Buf)/3;.  for(i=
2fa0: 6e 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b  n=0; zUtf[i]; i+
2fb0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74  +){.    if( (zUt
2fc0: 66 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30  f[i]&0xc0)!=0x80
2fd0: 20 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20   ){.      n++;. 
2fe0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29       if( n==aw )
2ff0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b  {.        do{ i+
3000: 2b 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66  +; }while( (zUtf
3010: 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20  [i]&0xc0)==0x80 
3020: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3040: 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20    }.  if( n>=aw 
3050: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
3060: 74 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c  tf(pOut, "%.*s",
3070: 20 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c   i, zUtf);.  }el
3080: 73 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20  se if( w<0 ){.  
3090: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f    utf8_printf(pO
30a0: 75 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d  ut, "%*s%s", aw-
30b0: 6e 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20  n, "", zUtf);.  
30c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f  }else{.    utf8_
30d0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  printf(pOut, "%s
30e0: 25 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e  %*s", zUtf, aw-n
30f0: 2c 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  , "");.  }.}.../
3100: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20  *.** Determines 
3110: 69 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61  if a string is a
3120: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a   number of not..
3130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
3140: 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61  Number(const cha
3150: 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e  r *z, int *realn
3160: 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  um){.  if( *z=='
3170: 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20  -' || *z=='+' ) 
3180: 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69  z++;.  if( !IsDi
3190: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72  git(*z) ){.    r
31a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
31b0: 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75  ++;.  if( realnu
31c0: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30  m ) *realnum = 0
31d0: 3b 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67  ;.  while( IsDig
31e0: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
31f0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29  .  if( *z=='.' )
3200: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69  {.    z++;.    i
3210: 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20  f( !IsDigit(*z) 
3220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3230: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3240: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
3250: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
3260: 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
3270: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c  .  if( *z=='e' |
3280: 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20  | *z=='E' ){.   
3290: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a   z++;.    if( *z
32a0: 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27  =='+' || *z=='-'
32b0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
32c0: 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72  !IsDigit(*z) ) r
32d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
32e0: 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20  le( IsDigit(*z) 
32f0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
3300: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
3310: 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lnum = 1;.  }.  
3320: 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a  return *z==0;.}.
3330: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
3340: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74   string length t
3350: 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  hat is limited t
3360: 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74  o what can be st
3370: 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72  ored in.** lower
3380: 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32   30 bits of a 32
3390: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
33a0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
33b0: 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73  nt strlen30(cons
33c0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
33d0: 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a  nst char *z2 = z
33e0: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29  ;.  while( *z2 )
33f0: 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  { z2++; }.  retu
3400: 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20  rn 0x3fffffff & 
3410: 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d  (int)(z2 - z);.}
3420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3430: 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e  tine reads a lin
3440: 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46  e of text from F
3450: 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a  ILE in, stores.*
3460: 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65  * the text in me
3470: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3480: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
3490: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
34a0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74  r.** to the text
34b0: 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
34c0: 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69  ned at end of fi
34d0: 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63  le, or if malloc
34e0: 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a  ().** fails..**.
34f0: 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73 20 6e  ** If zLine is n
3500: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
3510: 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75  is a malloced bu
3520: 66 66 65 72 20 72 65 74 75 72 6e 65 64 20 66 72  ffer returned fr
3530: 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f 75 73  om.** a previous
3540: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
3550: 75 74 69 6e 65 20 74 68 61 74 20 6d 61 79 20 62  utine that may b
3560: 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  e reused..*/.sta
3570: 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f  tic char *local_
3580: 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 4c  getline(char *zL
3590: 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  ine, FILE *in){.
35a0: 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 7a 4c    int nLine = zL
35b0: 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31 30 30  ine==0 ? 0 : 100
35c0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
35d0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
35e0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
35f0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
3600: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
3610: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
3620: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
3630: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
3640: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
3650: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
3660: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
3670: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
3680: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
3690: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
36a0: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
36b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36d0: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
36e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36f0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
3700: 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20 20 20  ne[n] ) n++;.   
3710: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
3720: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
3730: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
3740: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
3750: 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 6e  e[n-1]=='\r' ) n
3760: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
3770: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  n] = 0;.      br
3780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  eak;.    }.  }.#
3790: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
37a0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
37b0: 4e 33 32 29 0a 20 20 2f 2a 20 46 6f 72 20 69 6e  N32).  /* For in
37c0: 74 65 72 61 63 74 69 76 65 20 69 6e 70 75 74 20  teractive input 
37d0: 6f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  on Windows syste
37e0: 6d 73 2c 20 74 72 61 6e 73 6c 61 74 65 20 74 68  ms, translate th
37f0: 65 0a 20 20 2a 2a 20 6d 75 6c 74 69 2d 62 79 74  e.  ** multi-byt
3800: 65 20 63 68 61 72 61 63 74 65 72 73 65 74 20 63  e characterset c
3810: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 55  haracters into U
3820: 54 46 2d 38 2e 20 2a 2f 0a 20 20 69 66 28 20 73  TF-8. */.  if( s
3830: 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
3840: 69 76 65 20 26 26 20 69 6e 3d 3d 73 74 64 69 6e  ive && in==stdin
3850: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
3860: 72 61 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 77  rans = sqlite3_w
3870: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
3880: 38 5f 76 32 28 7a 4c 69 6e 65 2c 20 30 29 3b 0a  8_v2(zLine, 0);.
3890: 20 20 20 20 69 66 28 20 7a 54 72 61 6e 73 20 29      if( zTrans )
38a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 72 61  {.      int nTra
38b0: 6e 73 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54  ns = strlen30(zT
38c0: 72 61 6e 73 29 2b 31 3b 0a 20 20 20 20 20 20 69  rans)+1;.      i
38d0: 66 28 20 6e 54 72 61 6e 73 3e 6e 4c 69 6e 65 20  f( nTrans>nLine 
38e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
38f0: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
3900: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3910: 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
3920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3930: 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73  ite3_free(zTrans
3940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3950: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
3960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
3970: 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72  emcpy(zLine, zTr
3980: 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20  ans, nTrans);.  
3990: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
39a0: 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a  (zTrans);.    }.
39b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65    }.#endif /* de
39c0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
39d0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20   defined(WIN32) 
39e0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  */.  return zLin
39f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  e;.}../*.** Retr
3a00: 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c 69  ieve a single li
3a10: 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74  ne of input text
3a20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30  ..**.** If in==0
3a30: 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
3a40: 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61  standard input a
3a50: 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72 65  nd prompt before
3a60: 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49   each line..** I
3a70: 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  f isContinuation
3a80: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
3a90: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72   continuation pr
3aa0: 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72 69  ompt is appropri
3ab0: 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e  ate..** If isCon
3ac0: 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65 72  tinuation is zer
3ad0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  o, then the main
3ae0: 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62   prompt should b
3af0: 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e used..**.** If
3b00: 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e   zPrior is not N
3b10: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ULL then it is a
3b20: 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20 70   buffer from a p
3b30: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
3b40: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68 61  s.** routine tha
3b50: 74 20 63 61 6e 20 62 65 20 72 65 75 73 65 64 2e  t can be reused.
3b60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
3b70: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73  t is stored in s
3b80: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
3b90: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
3ba0: 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20 62  must either.** b
3bb0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3bc0: 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70 61  aller or else pa
3bd0: 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ssed back into t
3be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
3bf0: 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72  the.** zPrior ar
3c00: 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73 65  gument for reuse
3c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3c20: 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65   *one_input_line
3c30: 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20  (FILE *in, char 
3c40: 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73 43  *zPrior, int isC
3c50: 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20  ontinuation){.  
3c60: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20  char *zPrompt;. 
3c70: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
3c80: 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20    if( in!=0 ){. 
3c90: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63     zResult = loc
3ca0: 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f  al_getline(zPrio
3cb0: 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, in);.  }else{
3cc0: 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69  .    zPrompt = i
3cd0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20  sContinuation ? 
3ce0: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a  continuePrompt :
3cf0: 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66   mainPrompt;.#if
3d00: 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c   SHELL_USE_LOCAL
3d10: 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70 72 69  _GETLINE.    pri
3d20: 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70  ntf("%s", zPromp
3d30: 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73  t);.    fflush(s
3d40: 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52 65 73  tdout);.    zRes
3d50: 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ult = local_getl
3d60: 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74 64 69  ine(zPrior, stdi
3d70: 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66 72  n);.#else.    fr
3d80: 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20  ee(zPrior);.    
3d90: 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f  zResult = shell_
3da0: 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74  readline(zPrompt
3db0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73 75  );.    if( zResu
3dc0: 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20 29  lt && *zResult )
3dd0: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
3de0: 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e  ry(zResult);.#en
3df0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
3e00: 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 2f 2a 0a 2a   zResult;.}./*.*
3e10: 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  * A variable len
3e20: 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20 77 68  gth string to wh
3e30: 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70 70 65  ich one can appe
3e40: 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79 70 65  nd text..*/.type
3e50: 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c  def struct Shell
3e60: 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74 3b 0a  Text ShellText;.
3e70: 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74  struct ShellText
3e80: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20   {.  char *z;.  
3e90: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 41 6c  int n;.  int nAl
3ea0: 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  loc;.};../*.** I
3eb0: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
3ec0: 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54 65 78  stroy a ShellTex
3ed0: 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  t object.*/.stat
3ee0: 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65 78 74  ic void initText
3ef0: 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29 7b 0a  (ShellText *p){.
3f00: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
3f10: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73 74  izeof(*p));.}.st
3f20: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
3f30: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
3f40: 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29 3b 0a  {.  free(p->z);.
3f50: 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b 0a 7d    initText(p);.}
3f60: 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68  ../* zIn is eith
3f70: 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  er a pointer to 
3f80: 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65  a NULL-terminate
3f90: 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  d string in memo
3fa0: 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  ry obtained.** f
3fb0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72  rom malloc(), or
3fc0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
3fd0: 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e   The string poin
3fe0: 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e  ted to by zAppen
3ff0: 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f  d is.** added to
4000: 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65   zIn, and the re
4010: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e  sult returned in
4020: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
4030: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
4040: 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61  ** zIn, if it wa
4050: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66  s not NULL, is f
4060: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  reed..**.** If t
4070: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
4080: 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74  t, quote, is not
4090: 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69   '\0', then it i
40a0: 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 71  s used as a.** q
40b0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66  uote character f
40c0: 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73  or zAppend..*/.s
40d0: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65 6e  tatic void appen
40e0: 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20  dText(ShellText 
40f0: 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  *p, char const *
4100: 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75  zAppend, char qu
4110: 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ote){.  int len;
4120: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4130: 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e  nAppend = strlen
4140: 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a 20 20  30(zAppend);..  
4150: 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 70 2d  len = nAppend+p-
4160: 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74  >n+1;.  if( quot
4170: 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20  e ){.    len += 
4180: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
4190: 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b  i<nAppend; i++){
41a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65  .      if( zAppe
41b0: 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c  nd[i]==quote ) l
41c0: 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en++;.    }.  }.
41d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65 6e 3e  .  if( p->n+len>
41e0: 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  =p->nAlloc ){.  
41f0: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d    p->nAlloc = p-
4200: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65 6e 20  >nAlloc*2 + len 
4210: 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d  + 20;.    p->z =
4220: 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70   realloc(p->z, p
4230: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ->nAlloc);.    i
4240: 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  f( p->z==0 ){.  
4250: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
4260: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
4270: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4280: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f  }.  }..  if( quo
4290: 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  te ){.    char *
42a0: 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70 2d 3e 6e  zCsr = p->z+p->n
42b0: 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20  ;.    *zCsr++ = 
42c0: 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69  quote;.    for(i
42d0: 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69  =0; i<nAppend; i
42e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72  ++){.      *zCsr
42f0: 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b  ++ = zAppend[i];
4300: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65  .      if( zAppe
4310: 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a  nd[i]==quote ) *
4320: 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a  zCsr++ = quote;.
4330: 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b      }.    *zCsr+
4340: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 70  + = quote;.    p
4350: 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 43 73 72  ->n = (int)(zCsr
4360: 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 2a 7a   - p->z);.    *z
4370: 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65  Csr = '\0';.  }e
4380: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  lse{.    memcpy(
4390: 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41 70 70 65  p->z+p->n, zAppe
43a0: 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20  nd, nAppend);.  
43b0: 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70 70 65 6e    p->n += nAppen
43c0: 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e  d;.    p->z[p->n
43d0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a  ] = '\0';.  }.}.
43e0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
43f0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 69  o determine if i
4400: 64 65 6e 74 69 66 69 65 72 20 7a 4e 61 6d 65 20  dentifier zName 
4410: 6e 65 65 64 73 20 74 6f 20 62 65 20 71 75 6f 74  needs to be quot
4420: 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a 20 62 65  ed, either.** be
4430: 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e  cause it contain
4440: 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d 65 72  s non-alphanumer
4450: 69 63 20 63 68 61 72 61 63 74 65 72 73 2c 20 6f  ic characters, o
4460: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
4470: 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 6b 65 79  an.** SQLite key
4480: 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e 73 65 72  word.  Be conser
4490: 76 61 74 69 76 65 20 69 6e 20 74 68 69 73 20 65  vative in this e
44a0: 73 74 69 6d 61 74 65 3a 20 20 57 68 65 6e 20 69  stimate:  When i
44b0: 6e 20 64 6f 75 62 74 20 61 73 73 75 6d 65 0a 2a  n doubt assume.*
44c0: 2a 20 74 68 61 74 20 71 75 6f 74 69 6e 67 20 69  * that quoting i
44d0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  s required..**.*
44e0: 2a 20 52 65 74 75 72 6e 20 27 22 27 20 69 66 20  * Return '"' if 
44f0: 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69  quoting is requi
4500: 72 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  red.  Return 0 i
4510: 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20 69 73 20  f no quoting is 
4520: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
4530: 74 69 63 20 63 68 61 72 20 71 75 6f 74 65 43 68  tic char quoteCh
4540: 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ar(const char *z
4550: 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 41 6c 6c 20  Name){.  /* All 
4560: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 73 2c  SQLite keywords,
4570: 20 69 6e 20 61 6c 70 68 61 62 65 74 69 63 61 6c   in alphabetical
4580: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 73 74 61 74   order */.  stat
4590: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
45a0: 7a 4b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a  zKeywords[] = {.
45b0: 20 20 20 20 22 41 42 4f 52 54 22 2c 20 22 41 43      "ABORT", "AC
45c0: 54 49 4f 4e 22 2c 20 22 41 44 44 22 2c 20 22 41  TION", "ADD", "A
45d0: 46 54 45 52 22 2c 20 22 41 4c 4c 22 2c 20 22 41  FTER", "ALL", "A
45e0: 4c 54 45 52 22 2c 20 22 41 4e 41 4c 59 5a 45 22  LTER", "ANALYZE"
45f0: 2c 20 22 41 4e 44 22 2c 20 22 41 53 22 2c 0a 20  , "AND", "AS",. 
4600: 20 20 20 22 41 53 43 22 2c 20 22 41 54 54 41 43     "ASC", "ATTAC
4610: 48 22 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  H", "AUTOINCREME
4620: 4e 54 22 2c 20 22 42 45 46 4f 52 45 22 2c 20 22  NT", "BEFORE", "
4630: 42 45 47 49 4e 22 2c 20 22 42 45 54 57 45 45 4e  BEGIN", "BETWEEN
4640: 22 2c 20 22 42 59 22 2c 0a 20 20 20 20 22 43 41  ", "BY",.    "CA
4650: 53 43 41 44 45 22 2c 20 22 43 41 53 45 22 2c 20  SCADE", "CASE", 
4660: 22 43 41 53 54 22 2c 20 22 43 48 45 43 4b 22 2c  "CAST", "CHECK",
4670: 20 22 43 4f 4c 4c 41 54 45 22 2c 20 22 43 4f 4c   "COLLATE", "COL
4680: 55 4d 4e 22 2c 20 22 43 4f 4d 4d 49 54 22 2c 0a  UMN", "COMMIT",.
4690: 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 22 2c 20      "CONFLICT", 
46a0: 22 43 4f 4e 53 54 52 41 49 4e 54 22 2c 20 22 43  "CONSTRAINT", "C
46b0: 52 45 41 54 45 22 2c 20 22 43 52 4f 53 53 22 2c  REATE", "CROSS",
46c0: 20 22 43 55 52 52 45 4e 54 5f 44 41 54 45 22 2c   "CURRENT_DATE",
46d0: 0a 20 20 20 20 22 43 55 52 52 45 4e 54 5f 54 49  .    "CURRENT_TI
46e0: 4d 45 22 2c 20 22 43 55 52 52 45 4e 54 5f 54 49  ME", "CURRENT_TI
46f0: 4d 45 53 54 41 4d 50 22 2c 20 22 44 41 54 41 42  MESTAMP", "DATAB
4700: 41 53 45 22 2c 20 22 44 45 46 41 55 4c 54 22 2c  ASE", "DEFAULT",
4710: 20 22 44 45 46 45 52 52 41 42 4c 45 22 2c 0a 20   "DEFERRABLE",. 
4720: 20 20 20 22 44 45 46 45 52 52 45 44 22 2c 20 22     "DEFERRED", "
4730: 44 45 4c 45 54 45 22 2c 20 22 44 45 53 43 22 2c  DELETE", "DESC",
4740: 20 22 44 45 54 41 43 48 22 2c 20 22 44 49 53 54   "DETACH", "DIST
4750: 49 4e 43 54 22 2c 20 22 44 52 4f 50 22 2c 20 22  INCT", "DROP", "
4760: 45 41 43 48 22 2c 0a 20 20 20 20 22 45 4c 53 45  EACH",.    "ELSE
4770: 22 2c 20 22 45 4e 44 22 2c 20 22 45 53 43 41 50  ", "END", "ESCAP
4780: 45 22 2c 20 22 45 58 43 45 50 54 22 2c 20 22 45  E", "EXCEPT", "E
4790: 58 43 4c 55 53 49 56 45 22 2c 20 22 45 58 49 53  XCLUSIVE", "EXIS
47a0: 54 53 22 2c 20 22 45 58 50 4c 41 49 4e 22 2c 0a  TS", "EXPLAIN",.
47b0: 20 20 20 20 22 46 41 49 4c 22 2c 20 22 46 4f 52      "FAIL", "FOR
47c0: 22 2c 20 22 46 4f 52 45 49 47 4e 22 2c 20 22 46  ", "FOREIGN", "F
47d0: 52 4f 4d 22 2c 20 22 46 55 4c 4c 22 2c 20 22 47  ROM", "FULL", "G
47e0: 4c 4f 42 22 2c 20 22 47 52 4f 55 50 22 2c 20 22  LOB", "GROUP", "
47f0: 48 41 56 49 4e 47 22 2c 20 22 49 46 22 2c 0a 20  HAVING", "IF",. 
4800: 20 20 20 22 49 47 4e 4f 52 45 22 2c 20 22 49 4d     "IGNORE", "IM
4810: 4d 45 44 49 41 54 45 22 2c 20 22 49 4e 22 2c 20  MEDIATE", "IN", 
4820: 22 49 4e 44 45 58 22 2c 20 22 49 4e 44 45 58 45  "INDEX", "INDEXE
4830: 44 22 2c 20 22 49 4e 49 54 49 41 4c 4c 59 22 2c  D", "INITIALLY",
4840: 20 22 49 4e 4e 45 52 22 2c 0a 20 20 20 20 22 49   "INNER",.    "I
4850: 4e 53 45 52 54 22 2c 20 22 49 4e 53 54 45 41 44  NSERT", "INSTEAD
4860: 22 2c 20 22 49 4e 54 45 52 53 45 43 54 22 2c 20  ", "INTERSECT", 
4870: 22 49 4e 54 4f 22 2c 20 22 49 53 22 2c 20 22 49  "INTO", "IS", "I
4880: 53 4e 55 4c 4c 22 2c 20 22 4a 4f 49 4e 22 2c 20  SNULL", "JOIN", 
4890: 22 4b 45 59 22 2c 0a 20 20 20 20 22 4c 45 46 54  "KEY",.    "LEFT
48a0: 22 2c 20 22 4c 49 4b 45 22 2c 20 22 4c 49 4d 49  ", "LIKE", "LIMI
48b0: 54 22 2c 20 22 4d 41 54 43 48 22 2c 20 22 4e 41  T", "MATCH", "NA
48c0: 54 55 52 41 4c 22 2c 20 22 4e 4f 22 2c 20 22 4e  TURAL", "NO", "N
48d0: 4f 54 22 2c 20 22 4e 4f 54 4e 55 4c 4c 22 2c 0a  OT", "NOTNULL",.
48e0: 20 20 20 20 22 4e 55 4c 4c 22 2c 20 22 4f 46 22      "NULL", "OF"
48f0: 2c 20 22 4f 46 46 53 45 54 22 2c 20 22 4f 4e 22  , "OFFSET", "ON"
4900: 2c 20 22 4f 52 22 2c 20 22 4f 52 44 45 52 22 2c  , "OR", "ORDER",
4910: 20 22 4f 55 54 45 52 22 2c 20 22 50 4c 41 4e 22   "OUTER", "PLAN"
4920: 2c 20 22 50 52 41 47 4d 41 22 2c 0a 20 20 20 20  , "PRAGMA",.    
4930: 22 50 52 49 4d 41 52 59 22 2c 20 22 51 55 45 52  "PRIMARY", "QUER
4940: 59 22 2c 20 22 52 41 49 53 45 22 2c 20 22 52 45  Y", "RAISE", "RE
4950: 43 55 52 53 49 56 45 22 2c 20 22 52 45 46 45 52  CURSIVE", "REFER
4960: 45 4e 43 45 53 22 2c 20 22 52 45 47 45 58 50 22  ENCES", "REGEXP"
4970: 2c 0a 20 20 20 20 22 52 45 49 4e 44 45 58 22 2c  ,.    "REINDEX",
4980: 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 45 4e   "RELEASE", "REN
4990: 41 4d 45 22 2c 20 22 52 45 50 4c 41 43 45 22 2c  AME", "REPLACE",
49a0: 20 22 52 45 53 54 52 49 43 54 22 2c 20 22 52 49   "RESTRICT", "RI
49b0: 47 48 54 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42  GHT",.    "ROLLB
49c0: 41 43 4b 22 2c 20 22 52 4f 57 22 2c 20 22 53 41  ACK", "ROW", "SA
49d0: 56 45 50 4f 49 4e 54 22 2c 20 22 53 45 4c 45 43  VEPOINT", "SELEC
49e0: 54 22 2c 20 22 53 45 54 22 2c 20 22 54 41 42 4c  T", "SET", "TABL
49f0: 45 22 2c 20 22 54 45 4d 50 22 2c 0a 20 20 20 20  E", "TEMP",.    
4a00: 22 54 45 4d 50 4f 52 41 52 59 22 2c 20 22 54 48  "TEMPORARY", "TH
4a10: 45 4e 22 2c 20 22 54 4f 22 2c 20 22 54 52 41 4e  EN", "TO", "TRAN
4a20: 53 41 43 54 49 4f 4e 22 2c 20 22 54 52 49 47 47  SACTION", "TRIGG
4a30: 45 52 22 2c 20 22 55 4e 49 4f 4e 22 2c 20 22 55  ER", "UNION", "U
4a40: 4e 49 51 55 45 22 2c 0a 20 20 20 20 22 55 50 44  NIQUE",.    "UPD
4a50: 41 54 45 22 2c 20 22 55 53 49 4e 47 22 2c 20 22  ATE", "USING", "
4a60: 56 41 43 55 55 4d 22 2c 20 22 56 41 4c 55 45 53  VACUUM", "VALUES
4a70: 22 2c 20 22 56 49 45 57 22 2c 20 22 56 49 52 54  ", "VIEW", "VIRT
4a80: 55 41 4c 22 2c 20 22 57 48 45 4e 22 2c 20 22 57  UAL", "WHEN", "W
4a90: 48 45 52 45 22 2c 0a 20 20 20 20 22 57 49 54 48  HERE",.    "WITH
4aa0: 22 2c 20 22 57 49 54 48 4f 55 54 22 2c 0a 20 20  ", "WITHOUT",.  
4ab0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6c 77 72 2c  };.  int i, lwr,
4ac0: 20 75 70 72 2c 20 6d 69 64 2c 20 63 3b 0a 20 20   upr, mid, c;.  
4ad0: 69 66 28 20 21 69 73 61 6c 70 68 61 28 28 75 6e  if( !isalpha((un
4ae0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d  signed char)zNam
4af0: 65 5b 30 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 30  e[0]) && zName[0
4b00: 5d 21 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20  ]!='_' ) return 
4b10: 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '"';.  for(i=0; 
4b20: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zName[i]; i++){.
4b30: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
4b40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
4b50: 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61  zName[i]) && zNa
4b60: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 72 65 74  me[i]!='_' ) ret
4b70: 75 72 6e 20 27 22 27 3b 0a 20 20 7d 0a 20 20 6c  urn '"';.  }.  l
4b80: 77 72 20 3d 20 30 3b 0a 20 20 75 70 72 20 3d 20  wr = 0;.  upr = 
4b90: 73 69 7a 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64  sizeof(azKeyword
4ba0: 73 29 2f 73 69 7a 65 6f 66 28 61 7a 4b 65 79 77  s)/sizeof(azKeyw
4bb0: 6f 72 64 73 5b 30 5d 29 20 2d 20 31 3b 0a 20 20  ords[0]) - 1;.  
4bc0: 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20  while( lwr<=upr 
4bd0: 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20 28 6c 77  ){.    mid = (lw
4be0: 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 63 20  r+upr)/2;.    c 
4bf0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  = sqlite3_stricm
4c00: 70 28 61 7a 4b 65 79 77 6f 72 64 73 5b 6d 69 64  p(azKeywords[mid
4c10: 5d 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ], zName);.    i
4c20: 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
4c30: 20 27 22 27 3b 0a 20 20 20 20 69 66 28 20 63 3c   '"';.    if( c<
4c40: 30 20 29 7b 0a 20 20 20 20 20 20 6c 77 72 20 3d  0 ){.      lwr =
4c50: 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 65 6c 73   mid+1;.    }els
4c60: 65 7b 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d  e{.      upr = m
4c70: 69 64 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  id-1;.    }.  }.
4c80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
4ce0: 2a 20 53 48 41 33 20 68 61 73 68 20 69 6d 70 6c  * SHA3 hash impl
4cf0: 65 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70 69 65  ementation copie
4d00: 64 20 66 72 6f 6d 20 2e 2e 2f 65 78 74 2f 6d 69  d from ../ext/mi
4d10: 73 63 2f 73 68 61 74 68 72 65 65 2e 63 0a 2a 2f  sc/shathree.c.*/
4d20: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
4d30: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 2f 2a 0a  _uint64 u64;./*.
4d40: 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20 64 65 74  ** Macros to det
4d50: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 74  ermine whether t
4d60: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 62 69  he machine is bi
4d70: 67 20 6f 72 20 6c 69 74 74 6c 65 20 65 6e 64 69  g or little endi
4d80: 61 6e 2c 0a 2a 2a 20 61 6e 64 20 77 68 65 74 68  an,.** and wheth
4d90: 65 72 20 6f 72 20 6e 6f 74 20 74 68 61 74 20 64  er or not that d
4da0: 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69 73 20  etermination is 
4db0: 72 75 6e 2d 74 69 6d 65 20 6f 72 20 63 6f 6d 70  run-time or comp
4dc0: 69 6c 65 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile-time..**.** 
4dd0: 46 6f 72 20 62 65 73 74 20 70 65 72 66 6f 72 6d  For best perform
4de0: 61 6e 63 65 2c 20 61 6e 20 61 74 74 65 6d 70 74  ance, an attempt
4df0: 20 69 73 20 6d 61 64 65 20 74 6f 20 67 75 65 73   is made to gues
4e00: 73 20 61 74 20 74 68 65 20 62 79 74 65 2d 6f 72  s at the byte-or
4e10: 64 65 72 0a 2a 2a 20 75 73 69 6e 67 20 43 2d 70  der.** using C-p
4e20: 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  reprocessor macr
4e30: 6f 73 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  os.  If that is 
4e40: 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  unsuccessful, or
4e50: 20 69 66 0a 2a 2a 20 2d 44 53 48 41 33 5f 42 59   if.** -DSHA3_BY
4e60: 54 45 4f 52 44 45 52 3d 30 20 69 73 20 73 65 74  TEORDER=0 is set
4e70: 2c 20 74 68 65 6e 20 62 79 74 65 2d 6f 72 64 65  , then byte-orde
4e80: 72 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  r is determined.
4e90: 2a 2a 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a  ** at run-time..
4ea0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 48 41 33 5f  */.#ifndef SHA3_
4eb0: 42 59 54 45 4f 52 44 45 52 0a 23 20 69 66 20 64  BYTEORDER.# if d
4ec0: 65 66 69 6e 65 64 28 69 33 38 36 29 20 20 20 20  efined(i386)    
4ed0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 33   || defined(__i3
4ee0: 38 36 5f 5f 29 20 20 20 7c 7c 20 64 65 66 69 6e  86__)   || defin
4ef0: 65 64 28 5f 4d 5f 49 58 38 36 29 20 7c 7c 20 20  ed(_M_IX86) ||  
4f00: 20 20 5c 0a 20 20 20 20 20 64 65 66 69 6e 65 64    \.     defined
4f10: 28 5f 5f 78 38 36 5f 36 34 29 20 7c 7c 20 64 65  (__x86_64) || de
4f20: 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 34 5f 5f  fined(__x86_64__
4f30: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f  ) || defined(_M_
4f40: 58 36 34 29 20 20 7c 7c 20 20 20 20 5c 0a 20 20  X64)  ||    \.  
4f50: 20 20 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 4d     defined(_M_AM
4f60: 44 36 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  D64) || defined(
4f70: 5f 4d 5f 41 52 4d 29 20 20 20 20 20 7c 7c 20 64  _M_ARM)     || d
4f80: 65 66 69 6e 65 64 28 5f 5f 78 38 36 29 20 20 20  efined(__x86)   
4f90: 7c 7c 20 20 20 20 5c 0a 20 20 20 20 20 64 65 66  ||    \.     def
4fa0: 69 6e 65 64 28 5f 5f 61 72 6d 5f 5f 29 0a 23 20  ined(__arm__).# 
4fb0: 20 20 64 65 66 69 6e 65 20 53 48 41 33 5f 42 59    define SHA3_BY
4fc0: 54 45 4f 52 44 45 52 20 20 20 20 31 32 33 34 0a  TEORDER    1234.
4fd0: 23 20 65 6c 69 66 20 64 65 66 69 6e 65 64 28 73  # elif defined(s
4fe0: 70 61 72 63 29 20 20 20 20 7c 7c 20 64 65 66 69  parc)    || defi
4ff0: 6e 65 64 28 5f 5f 70 70 63 5f 5f 29 0a 23 20 20  ned(__ppc__).#  
5000: 20 64 65 66 69 6e 65 20 53 48 41 33 5f 42 59 54   define SHA3_BYT
5010: 45 4f 52 44 45 52 20 20 20 20 34 33 32 31 0a 23  EORDER    4321.#
5020: 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69 6e 65   else.#   define
5030: 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 20   SHA3_BYTEORDER 
5040: 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  0.# endif.#endif
5050: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 73  .../*.** State s
5060: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 20 53  tructure for a S
5070: 48 41 33 20 68 61 73 68 20 69 6e 20 70 72 6f 67  HA3 hash in prog
5080: 72 65 73 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ress.*/.typedef 
5090: 73 74 72 75 63 74 20 53 48 41 33 43 6f 6e 74 65  struct SHA3Conte
50a0: 78 74 20 53 48 41 33 43 6f 6e 74 65 78 74 3b 0a  xt SHA3Context;.
50b0: 73 74 72 75 63 74 20 53 48 41 33 43 6f 6e 74 65  struct SHA3Conte
50c0: 78 74 20 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  xt {.  union {. 
50d0: 20 20 20 75 36 34 20 73 5b 32 35 5d 3b 20 20 20     u64 s[25];   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50f0: 4b 65 63 63 61 6b 20 73 74 61 74 65 2e 20 35 78  Keccak state. 5x
5100: 35 20 6c 69 6e 65 73 20 6f 66 20 36 34 20 62 69  5 lines of 64 bi
5110: 74 73 20 65 61 63 68 20 2a 2f 0a 20 20 20 20 75  ts each */.    u
5120: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 31  nsigned char x[1
5130: 36 30 30 5d 3b 20 20 20 20 2f 2a 20 2e 2e 2e 20  600];    /* ... 
5140: 6f 72 20 31 36 30 30 20 62 79 74 65 73 20 2a 2f  or 1600 bytes */
5150: 0a 20 20 7d 20 75 3b 0a 20 20 75 6e 73 69 67 6e  .  } u;.  unsign
5160: 65 64 20 6e 52 61 74 65 3b 20 20 20 20 20 20 20  ed nRate;       
5170: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 69 6e 70   /* Bytes of inp
5180: 75 74 20 61 63 63 65 70 74 65 64 20 70 65 72 20  ut accepted per 
5190: 4b 65 63 63 61 6b 20 69 74 65 72 61 74 69 6f 6e  Keccak iteration
51a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e   */.  unsigned n
51b0: 4c 6f 61 64 65 64 3b 20 20 20 20 20 20 2f 2a 20  Loaded;      /* 
51c0: 49 6e 70 75 74 20 62 79 74 65 73 20 6c 6f 61 64  Input bytes load
51d0: 65 64 20 69 6e 74 6f 20 75 2e 78 5b 5d 20 73 6f  ed into u.x[] so
51e0: 20 66 61 72 20 74 68 69 73 20 63 79 63 6c 65 20   far this cycle 
51f0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 78  */.  unsigned ix
5200: 4d 61 73 6b 3b 20 20 20 20 20 20 20 2f 2a 20 49  Mask;       /* I
5210: 6e 73 65 72 74 20 6e 65 78 74 20 69 6e 70 75 74  nsert next input
5220: 20 69 6e 74 6f 20 75 2e 78 5b 6e 4c 6f 61 64 65   into u.x[nLoade
5230: 64 5e 69 78 4d 61 73 6b 5d 2e 20 2a 2f 0a 7d 3b  d^ixMask]. */.};
5240: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ../*.** A single
5250: 20 73 74 65 70 20 6f 66 20 74 68 65 20 4b 65 63   step of the Kec
5260: 63 61 6b 20 6d 69 78 69 6e 67 20 66 75 6e 63 74  cak mixing funct
5270: 69 6f 6e 20 66 6f 72 20 61 20 31 36 30 30 2d 62  ion for a 1600-b
5280: 69 74 20 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74  it state.*/.stat
5290: 69 63 20 76 6f 69 64 20 4b 65 63 63 61 6b 46 31  ic void KeccakF1
52a0: 36 30 30 53 74 65 70 28 53 48 41 33 43 6f 6e 74  600Step(SHA3Cont
52b0: 65 78 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ext *p){.  int i
52c0: 3b 0a 20 20 75 36 34 20 42 30 2c 20 42 31 2c 20  ;.  u64 B0, B1, 
52d0: 42 32 2c 20 42 33 2c 20 42 34 3b 0a 20 20 75 36  B2, B3, B4;.  u6
52e0: 34 20 43 30 2c 20 43 31 2c 20 43 32 2c 20 43 33  4 C0, C1, C2, C3
52f0: 2c 20 43 34 3b 0a 20 20 75 36 34 20 44 30 2c 20  , C4;.  u64 D0, 
5300: 44 31 2c 20 44 32 2c 20 44 33 2c 20 44 34 3b 0a  D1, D2, D3, D4;.
5310: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
5320: 36 34 20 52 43 5b 5d 20 3d 20 7b 0a 20 20 20 20  64 RC[] = {.    
5330: 30 78 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0x00000000000000
5340: 30 31 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30  01ULL,  0x000000
5350: 30 30 30 30 30 30 38 30 38 32 55 4c 4c 2c 0a 20  0000008082ULL,. 
5360: 20 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30     0x80000000000
5370: 30 38 30 38 61 55 4c 4c 2c 20 20 30 78 38 30 30  0808aULL,  0x800
5380: 30 30 30 30 30 38 30 30 30 38 30 30 30 55 4c 4c  0000080008000ULL
5390: 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30  ,.    0x00000000
53a0: 30 30 30 30 38 30 38 62 55 4c 4c 2c 20 20 30 78  0000808bULL,  0x
53b0: 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 31  0000000080000001
53c0: 55 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30 30 30  ULL,.    0x80000
53d0: 30 30 30 38 30 30 30 38 30 38 31 55 4c 4c 2c 20  00080008081ULL, 
53e0: 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38   0x8000000000008
53f0: 30 30 39 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30  009ULL,.    0x00
5400: 30 30 30 30 30 30 30 30 30 30 30 30 38 61 55 4c  0000000000008aUL
5410: 4c 2c 20 20 30 78 30 30 30 30 30 30 30 30 30 30  L,  0x0000000000
5420: 30 30 30 30 38 38 55 4c 4c 2c 0a 20 20 20 20 30  000088ULL,.    0
5430: 78 30 30 30 30 30 30 30 30 38 30 30 30 38 30 30  x000000008000800
5440: 39 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30 30  9ULL,  0x0000000
5450: 30 38 30 30 30 30 30 30 61 55 4c 4c 2c 0a 20 20  08000000aULL,.  
5460: 20 20 30 78 30 30 30 30 30 30 30 30 38 30 30 30    0x000000008000
5470: 38 30 38 62 55 4c 4c 2c 20 20 30 78 38 30 30 30  808bULL,  0x8000
5480: 30 30 30 30 30 30 30 30 30 30 38 62 55 4c 4c 2c  00000000008bULL,
5490: 0a 20 20 20 20 30 78 38 30 30 30 30 30 30 30 30  .    0x800000000
54a0: 30 30 30 38 30 38 39 55 4c 4c 2c 20 20 30 78 38  0008089ULL,  0x8
54b0: 30 30 30 30 30 30 30 30 30 30 30 38 30 30 33 55  000000000008003U
54c0: 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30  LL,.    0x800000
54d0: 30 30 30 30 30 30 38 30 30 32 55 4c 4c 2c 20 20  0000008002ULL,  
54e0: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 30 30  0x80000000000000
54f0: 38 30 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30  80ULL,.    0x000
5500: 30 30 30 30 30 30 30 30 30 38 30 30 61 55 4c 4c  000000000800aULL
5510: 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30  ,  0x80000000800
5520: 30 30 30 30 61 55 4c 4c 2c 0a 20 20 20 20 30 78  0000aULL,.    0x
5530: 38 30 30 30 30 30 30 30 38 30 30 30 38 30 38 31  8000000080008081
5540: 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30  ULL,  0x80000000
5550: 30 30 30 30 38 30 38 30 55 4c 4c 2c 0a 20 20 20  00008080ULL,.   
5560: 20 30 78 30 30 30 30 30 30 30 30 38 30 30 30 30   0x0000000080000
5570: 30 30 31 55 4c 4c 2c 20 20 30 78 38 30 30 30 30  001ULL,  0x80000
5580: 30 30 30 38 30 30 30 38 30 30 38 55 4c 4c 0a 20  00080008008ULL. 
5590: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 41 30 30   };.# define A00
55a0: 20 28 70 2d 3e 75 2e 73 5b 30 5d 29 0a 23 20 64   (p->u.s[0]).# d
55b0: 65 66 69 6e 65 20 41 30 31 20 28 70 2d 3e 75 2e  efine A01 (p->u.
55c0: 73 5b 31 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  s[1]).# define A
55d0: 30 32 20 28 70 2d 3e 75 2e 73 5b 32 5d 29 0a 23  02 (p->u.s[2]).#
55e0: 20 64 65 66 69 6e 65 20 41 30 33 20 28 70 2d 3e   define A03 (p->
55f0: 75 2e 73 5b 33 5d 29 0a 23 20 64 65 66 69 6e 65  u.s[3]).# define
5600: 20 41 30 34 20 28 70 2d 3e 75 2e 73 5b 34 5d 29   A04 (p->u.s[4])
5610: 0a 23 20 64 65 66 69 6e 65 20 41 31 30 20 28 70  .# define A10 (p
5620: 2d 3e 75 2e 73 5b 35 5d 29 0a 23 20 64 65 66 69  ->u.s[5]).# defi
5630: 6e 65 20 41 31 31 20 28 70 2d 3e 75 2e 73 5b 36  ne A11 (p->u.s[6
5640: 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 31 32 20  ]).# define A12 
5650: 28 70 2d 3e 75 2e 73 5b 37 5d 29 0a 23 20 64 65  (p->u.s[7]).# de
5660: 66 69 6e 65 20 41 31 33 20 28 70 2d 3e 75 2e 73  fine A13 (p->u.s
5670: 5b 38 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 31  [8]).# define A1
5680: 34 20 28 70 2d 3e 75 2e 73 5b 39 5d 29 0a 23 20  4 (p->u.s[9]).# 
5690: 64 65 66 69 6e 65 20 41 32 30 20 28 70 2d 3e 75  define A20 (p->u
56a0: 2e 73 5b 31 30 5d 29 0a 23 20 64 65 66 69 6e 65  .s[10]).# define
56b0: 20 41 32 31 20 28 70 2d 3e 75 2e 73 5b 31 31 5d   A21 (p->u.s[11]
56c0: 29 0a 23 20 64 65 66 69 6e 65 20 41 32 32 20 28  ).# define A22 (
56d0: 70 2d 3e 75 2e 73 5b 31 32 5d 29 0a 23 20 64 65  p->u.s[12]).# de
56e0: 66 69 6e 65 20 41 32 33 20 28 70 2d 3e 75 2e 73  fine A23 (p->u.s
56f0: 5b 31 33 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  [13]).# define A
5700: 32 34 20 28 70 2d 3e 75 2e 73 5b 31 34 5d 29 0a  24 (p->u.s[14]).
5710: 23 20 64 65 66 69 6e 65 20 41 33 30 20 28 70 2d  # define A30 (p-
5720: 3e 75 2e 73 5b 31 35 5d 29 0a 23 20 64 65 66 69  >u.s[15]).# defi
5730: 6e 65 20 41 33 31 20 28 70 2d 3e 75 2e 73 5b 31  ne A31 (p->u.s[1
5740: 36 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 33 32  6]).# define A32
5750: 20 28 70 2d 3e 75 2e 73 5b 31 37 5d 29 0a 23 20   (p->u.s[17]).# 
5760: 64 65 66 69 6e 65 20 41 33 33 20 28 70 2d 3e 75  define A33 (p->u
5770: 2e 73 5b 31 38 5d 29 0a 23 20 64 65 66 69 6e 65  .s[18]).# define
5780: 20 41 33 34 20 28 70 2d 3e 75 2e 73 5b 31 39 5d   A34 (p->u.s[19]
5790: 29 0a 23 20 64 65 66 69 6e 65 20 41 34 30 20 28  ).# define A40 (
57a0: 70 2d 3e 75 2e 73 5b 32 30 5d 29 0a 23 20 64 65  p->u.s[20]).# de
57b0: 66 69 6e 65 20 41 34 31 20 28 70 2d 3e 75 2e 73  fine A41 (p->u.s
57c0: 5b 32 31 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  [21]).# define A
57d0: 34 32 20 28 70 2d 3e 75 2e 73 5b 32 32 5d 29 0a  42 (p->u.s[22]).
57e0: 23 20 64 65 66 69 6e 65 20 41 34 33 20 28 70 2d  # define A43 (p-
57f0: 3e 75 2e 73 5b 32 33 5d 29 0a 23 20 64 65 66 69  >u.s[23]).# defi
5800: 6e 65 20 41 34 34 20 28 70 2d 3e 75 2e 73 5b 32  ne A44 (p->u.s[2
5810: 34 5d 29 0a 23 20 64 65 66 69 6e 65 20 52 4f 4c  4]).# define ROL
5820: 36 34 28 61 2c 78 29 20 28 28 61 3c 3c 78 29 7c  64(a,x) ((a<<x)|
5830: 28 61 3e 3e 28 36 34 2d 78 29 29 29 0a 0a 20 20  (a>>(64-x)))..  
5840: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 34 3b 20 69  for(i=0; i<24; i
5850: 2b 3d 34 29 7b 0a 20 20 20 20 43 30 20 3d 20 41  +=4){.    C0 = A
5860: 30 30 5e 41 31 30 5e 41 32 30 5e 41 33 30 5e 41  00^A10^A20^A30^A
5870: 34 30 3b 0a 20 20 20 20 43 31 20 3d 20 41 30 31  40;.    C1 = A01
5880: 5e 41 31 31 5e 41 32 31 5e 41 33 31 5e 41 34 31  ^A11^A21^A31^A41
5890: 3b 0a 20 20 20 20 43 32 20 3d 20 41 30 32 5e 41  ;.    C2 = A02^A
58a0: 31 32 5e 41 32 32 5e 41 33 32 5e 41 34 32 3b 0a  12^A22^A32^A42;.
58b0: 20 20 20 20 43 33 20 3d 20 41 30 33 5e 41 31 33      C3 = A03^A13
58c0: 5e 41 32 33 5e 41 33 33 5e 41 34 33 3b 0a 20 20  ^A23^A33^A43;.  
58d0: 20 20 43 34 20 3d 20 41 30 34 5e 41 31 34 5e 41    C4 = A04^A14^A
58e0: 32 34 5e 41 33 34 5e 41 34 34 3b 0a 20 20 20 20  24^A34^A44;.    
58f0: 44 30 20 3d 20 43 34 5e 52 4f 4c 36 34 28 43 31  D0 = C4^ROL64(C1
5900: 2c 20 31 29 3b 0a 20 20 20 20 44 31 20 3d 20 43  , 1);.    D1 = C
5910: 30 5e 52 4f 4c 36 34 28 43 32 2c 20 31 29 3b 0a  0^ROL64(C2, 1);.
5920: 20 20 20 20 44 32 20 3d 20 43 31 5e 52 4f 4c 36      D2 = C1^ROL6
5930: 34 28 43 33 2c 20 31 29 3b 0a 20 20 20 20 44 33  4(C3, 1);.    D3
5940: 20 3d 20 43 32 5e 52 4f 4c 36 34 28 43 34 2c 20   = C2^ROL64(C4, 
5950: 31 29 3b 0a 20 20 20 20 44 34 20 3d 20 43 33 5e  1);.    D4 = C3^
5960: 52 4f 4c 36 34 28 43 30 2c 20 31 29 3b 0a 0a 20  ROL64(C0, 1);.. 
5970: 20 20 20 42 30 20 3d 20 28 41 30 30 5e 44 30 29     B0 = (A00^D0)
5980: 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34  ;.    B1 = ROL64
5990: 28 28 41 31 31 5e 44 31 29 2c 20 34 34 29 3b 0a  ((A11^D1), 44);.
59a0: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
59b0: 41 32 32 5e 44 32 29 2c 20 34 33 29 3b 0a 20 20  A22^D2), 43);.  
59c0: 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 33    B3 = ROL64((A3
59d0: 33 5e 44 33 29 2c 20 32 31 29 3b 0a 20 20 20 20  3^D3), 21);.    
59e0: 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 34 34 5e  B4 = ROL64((A44^
59f0: 44 34 29 2c 20 31 34 29 3b 0a 20 20 20 20 41 30  D4), 14);.    A0
5a00: 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29  0 =   B0 ^((~B1)
5a10: 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 30 30  &  B2 );.    A00
5a20: 20 5e 3d 20 52 43 5b 69 5d 3b 0a 20 20 20 20 41   ^= RC[i];.    A
5a30: 31 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  11 =   B1 ^((~B2
5a40: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 32  )&  B3 );.    A2
5a50: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
5a60: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 33 33  &  B4 );.    A33
5a70: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
5a80: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 34 34 20    B0 );.    A44 
5a90: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
5aa0: 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 32 20 3d   B1 );..    B2 =
5ab0: 20 52 4f 4c 36 34 28 28 41 32 30 5e 44 30 29 2c   ROL64((A20^D0),
5ac0: 20 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f   3);.    B3 = RO
5ad0: 4c 36 34 28 28 41 33 31 5e 44 31 29 2c 20 34 35  L64((A31^D1), 45
5ae0: 29 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36  );.    B4 = ROL6
5af0: 34 28 28 41 34 32 5e 44 32 29 2c 20 36 31 29 3b  4((A42^D2), 61);
5b00: 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28  .    B0 = ROL64(
5b10: 28 41 30 33 5e 44 33 29 2c 20 32 38 29 3b 0a 20  (A03^D3), 28);. 
5b20: 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41     B1 = ROL64((A
5b30: 31 34 5e 44 34 29 2c 20 32 30 29 3b 0a 20 20 20  14^D4), 20);.   
5b40: 20 41 32 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A20 =   B0 ^((~
5b50: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
5b60: 41 33 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A31 =   B1 ^((~B
5b70: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
5b80: 34 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  42 =   B2 ^((~B3
5b90: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 30  )&  B4 );.    A0
5ba0: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
5bb0: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 31 34  &  B0 );.    A14
5bc0: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
5bd0: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 34 20    B1 );..    B4 
5be0: 3d 20 52 4f 4c 36 34 28 28 41 34 30 5e 44 30 29  = ROL64((A40^D0)
5bf0: 2c 20 31 38 29 3b 0a 20 20 20 20 42 30 20 3d 20  , 18);.    B0 = 
5c00: 52 4f 4c 36 34 28 28 41 30 31 5e 44 31 29 2c 20  ROL64((A01^D1), 
5c10: 31 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c  1);.    B1 = ROL
5c20: 36 34 28 28 41 31 32 5e 44 32 29 2c 20 36 29 3b  64((A12^D2), 6);
5c30: 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28  .    B2 = ROL64(
5c40: 28 41 32 33 5e 44 33 29 2c 20 32 35 29 3b 0a 20  (A23^D3), 25);. 
5c50: 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41     B3 = ROL64((A
5c60: 33 34 5e 44 34 29 2c 20 38 29 3b 0a 20 20 20 20  34^D4), 8);.    
5c70: 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42  A40 =   B0 ^((~B
5c80: 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41  1)&  B2 );.    A
5c90: 30 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  01 =   B1 ^((~B2
5ca0: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 31  )&  B3 );.    A1
5cb0: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
5cc0: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 32 33  &  B4 );.    A23
5cd0: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
5ce0: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 33 34 20    B0 );.    A34 
5cf0: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
5d00: 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 31 20 3d   B1 );..    B1 =
5d10: 20 52 4f 4c 36 34 28 28 41 31 30 5e 44 30 29 2c   ROL64((A10^D0),
5d20: 20 33 36 29 3b 0a 20 20 20 20 42 32 20 3d 20 52   36);.    B2 = R
5d30: 4f 4c 36 34 28 28 41 32 31 5e 44 31 29 2c 20 31  OL64((A21^D1), 1
5d40: 30 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  0);.    B3 = ROL
5d50: 36 34 28 28 41 33 32 5e 44 32 29 2c 20 31 35 29  64((A32^D2), 15)
5d60: 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34  ;.    B4 = ROL64
5d70: 28 28 41 34 33 5e 44 33 29 2c 20 35 36 29 3b 0a  ((A43^D3), 56);.
5d80: 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28      B0 = ROL64((
5d90: 41 30 34 5e 44 34 29 2c 20 32 37 29 3b 0a 20 20  A04^D4), 27);.  
5da0: 20 20 41 31 30 20 3d 20 20 20 42 30 20 5e 28 28    A10 =   B0 ^((
5db0: 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20  ~B1)&  B2 );.   
5dc0: 20 41 32 31 20 3d 20 20 20 42 31 20 5e 28 28 7e   A21 =   B1 ^((~
5dd0: 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20  B2)&  B3 );.    
5de0: 41 33 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42  A32 =   B2 ^((~B
5df0: 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41  3)&  B4 );.    A
5e00: 34 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34  43 =   B3 ^((~B4
5e10: 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 30  )&  B0 );.    A0
5e20: 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29  4 =   B4 ^((~B0)
5e30: 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 33  &  B1 );..    B3
5e40: 20 3d 20 52 4f 4c 36 34 28 28 41 33 30 5e 44 30   = ROL64((A30^D0
5e50: 29 2c 20 34 31 29 3b 0a 20 20 20 20 42 34 20 3d  ), 41);.    B4 =
5e60: 20 52 4f 4c 36 34 28 28 41 34 31 5e 44 31 29 2c   ROL64((A41^D1),
5e70: 20 32 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f   2);.    B0 = RO
5e80: 4c 36 34 28 28 41 30 32 5e 44 32 29 2c 20 36 32  L64((A02^D2), 62
5e90: 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36  );.    B1 = ROL6
5ea0: 34 28 28 41 31 33 5e 44 33 29 2c 20 35 35 29 3b  4((A13^D3), 55);
5eb0: 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28  .    B2 = ROL64(
5ec0: 28 41 32 34 5e 44 34 29 2c 20 33 39 29 3b 0a 20  (A24^D4), 39);. 
5ed0: 20 20 20 41 33 30 20 3d 20 20 20 42 30 20 5e 28     A30 =   B0 ^(
5ee0: 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20  (~B1)&  B2 );.  
5ef0: 20 20 41 34 31 20 3d 20 20 20 42 31 20 5e 28 28    A41 =   B1 ^((
5f00: 7e 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20  ~B2)&  B3 );.   
5f10: 20 41 30 32 20 3d 20 20 20 42 32 20 5e 28 28 7e   A02 =   B2 ^((~
5f20: 42 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20  B3)&  B4 );.    
5f30: 41 31 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42  A13 =   B3 ^((~B
5f40: 34 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41  4)&  B0 );.    A
5f50: 32 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30  24 =   B4 ^((~B0
5f60: 29 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 43  )&  B1 );..    C
5f70: 30 20 3d 20 41 30 30 5e 41 32 30 5e 41 34 30 5e  0 = A00^A20^A40^
5f80: 41 31 30 5e 41 33 30 3b 0a 20 20 20 20 43 31 20  A10^A30;.    C1 
5f90: 3d 20 41 31 31 5e 41 33 31 5e 41 30 31 5e 41 32  = A11^A31^A01^A2
5fa0: 31 5e 41 34 31 3b 0a 20 20 20 20 43 32 20 3d 20  1^A41;.    C2 = 
5fb0: 41 32 32 5e 41 34 32 5e 41 31 32 5e 41 33 32 5e  A22^A42^A12^A32^
5fc0: 41 30 32 3b 0a 20 20 20 20 43 33 20 3d 20 41 33  A02;.    C3 = A3
5fd0: 33 5e 41 30 33 5e 41 32 33 5e 41 34 33 5e 41 31  3^A03^A23^A43^A1
5fe0: 33 3b 0a 20 20 20 20 43 34 20 3d 20 41 34 34 5e  3;.    C4 = A44^
5ff0: 41 31 34 5e 41 33 34 5e 41 30 34 5e 41 32 34 3b  A14^A34^A04^A24;
6000: 0a 20 20 20 20 44 30 20 3d 20 43 34 5e 52 4f 4c  .    D0 = C4^ROL
6010: 36 34 28 43 31 2c 20 31 29 3b 0a 20 20 20 20 44  64(C1, 1);.    D
6020: 31 20 3d 20 43 30 5e 52 4f 4c 36 34 28 43 32 2c  1 = C0^ROL64(C2,
6030: 20 31 29 3b 0a 20 20 20 20 44 32 20 3d 20 43 31   1);.    D2 = C1
6040: 5e 52 4f 4c 36 34 28 43 33 2c 20 31 29 3b 0a 20  ^ROL64(C3, 1);. 
6050: 20 20 20 44 33 20 3d 20 43 32 5e 52 4f 4c 36 34     D3 = C2^ROL64
6060: 28 43 34 2c 20 31 29 3b 0a 20 20 20 20 44 34 20  (C4, 1);.    D4 
6070: 3d 20 43 33 5e 52 4f 4c 36 34 28 43 30 2c 20 31  = C3^ROL64(C0, 1
6080: 29 3b 0a 0a 20 20 20 20 42 30 20 3d 20 28 41 30  );..    B0 = (A0
6090: 30 5e 44 30 29 3b 0a 20 20 20 20 42 31 20 3d 20  0^D0);.    B1 = 
60a0: 52 4f 4c 36 34 28 28 41 33 31 5e 44 31 29 2c 20  ROL64((A31^D1), 
60b0: 34 34 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f  44);.    B2 = RO
60c0: 4c 36 34 28 28 41 31 32 5e 44 32 29 2c 20 34 33  L64((A12^D2), 43
60d0: 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36  );.    B3 = ROL6
60e0: 34 28 28 41 34 33 5e 44 33 29 2c 20 32 31 29 3b  4((A43^D3), 21);
60f0: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
6100: 28 41 32 34 5e 44 34 29 2c 20 31 34 29 3b 0a 20  (A24^D4), 14);. 
6110: 20 20 20 41 30 30 20 3d 20 20 20 42 30 20 5e 28     A00 =   B0 ^(
6120: 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20  (~B1)&  B2 );.  
6130: 20 20 41 30 30 20 5e 3d 20 52 43 5b 69 2b 31 5d    A00 ^= RC[i+1]
6140: 3b 0a 20 20 20 20 41 33 31 20 3d 20 20 20 42 31  ;.    A31 =   B1
6150: 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b   ^((~B2)&  B3 );
6160: 0a 20 20 20 20 41 31 32 20 3d 20 20 20 42 32 20  .    A12 =   B2 
6170: 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a  ^((~B3)&  B4 );.
6180: 20 20 20 20 41 34 33 20 3d 20 20 20 42 33 20 5e      A43 =   B3 ^
6190: 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20  ((~B4)&  B0 );. 
61a0: 20 20 20 41 32 34 20 3d 20 20 20 42 34 20 5e 28     A24 =   B4 ^(
61b0: 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20  (~B0)&  B1 );.. 
61c0: 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41     B2 = ROL64((A
61d0: 34 30 5e 44 30 29 2c 20 33 29 3b 0a 20 20 20 20  40^D0), 3);.    
61e0: 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 32 31 5e  B3 = ROL64((A21^
61f0: 44 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 42 34  D1), 45);.    B4
6200: 20 3d 20 52 4f 4c 36 34 28 28 41 30 32 5e 44 32   = ROL64((A02^D2
6210: 29 2c 20 36 31 29 3b 0a 20 20 20 20 42 30 20 3d  ), 61);.    B0 =
6220: 20 52 4f 4c 36 34 28 28 41 33 33 5e 44 33 29 2c   ROL64((A33^D3),
6230: 20 32 38 29 3b 0a 20 20 20 20 42 31 20 3d 20 52   28);.    B1 = R
6240: 4f 4c 36 34 28 28 41 31 34 5e 44 34 29 2c 20 32  OL64((A14^D4), 2
6250: 30 29 3b 0a 20 20 20 20 41 34 30 20 3d 20 20 20  0);.    A40 =   
6260: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
6270: 29 3b 0a 20 20 20 20 41 32 31 20 3d 20 20 20 42  );.    A21 =   B
6280: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
6290: 3b 0a 20 20 20 20 41 30 32 20 3d 20 20 20 42 32  ;.    A02 =   B2
62a0: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
62b0: 0a 20 20 20 20 41 33 33 20 3d 20 20 20 42 33 20  .    A33 =   B3 
62c0: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
62d0: 20 20 20 20 41 31 34 20 3d 20 20 20 42 34 20 5e      A14 =   B4 ^
62e0: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
62f0: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
6300: 41 33 30 5e 44 30 29 2c 20 31 38 29 3b 0a 20 20  A30^D0), 18);.  
6310: 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 31    B0 = ROL64((A1
6320: 31 5e 44 31 29 2c 20 31 29 3b 0a 20 20 20 20 42  1^D1), 1);.    B
6330: 31 20 3d 20 52 4f 4c 36 34 28 28 41 34 32 5e 44  1 = ROL64((A42^D
6340: 32 29 2c 20 36 29 3b 0a 20 20 20 20 42 32 20 3d  2), 6);.    B2 =
6350: 20 52 4f 4c 36 34 28 28 41 32 33 5e 44 33 29 2c   ROL64((A23^D3),
6360: 20 32 35 29 3b 0a 20 20 20 20 42 33 20 3d 20 52   25);.    B3 = R
6370: 4f 4c 36 34 28 28 41 30 34 5e 44 34 29 2c 20 38  OL64((A04^D4), 8
6380: 29 3b 0a 20 20 20 20 41 33 30 20 3d 20 20 20 42  );.    A30 =   B
6390: 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29  0 ^((~B1)&  B2 )
63a0: 3b 0a 20 20 20 20 41 31 31 20 3d 20 20 20 42 31  ;.    A11 =   B1
63b0: 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b   ^((~B2)&  B3 );
63c0: 0a 20 20 20 20 41 34 32 20 3d 20 20 20 42 32 20  .    A42 =   B2 
63d0: 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a  ^((~B3)&  B4 );.
63e0: 20 20 20 20 41 32 33 20 3d 20 20 20 42 33 20 5e      A23 =   B3 ^
63f0: 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20  ((~B4)&  B0 );. 
6400: 20 20 20 41 30 34 20 3d 20 20 20 42 34 20 5e 28     A04 =   B4 ^(
6410: 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20  (~B0)&  B1 );.. 
6420: 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41     B1 = ROL64((A
6430: 32 30 5e 44 30 29 2c 20 33 36 29 3b 0a 20 20 20  20^D0), 36);.   
6440: 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 30 31   B2 = ROL64((A01
6450: 5e 44 31 29 2c 20 31 30 29 3b 0a 20 20 20 20 42  ^D1), 10);.    B
6460: 33 20 3d 20 52 4f 4c 36 34 28 28 41 33 32 5e 44  3 = ROL64((A32^D
6470: 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 42 34 20  2), 15);.    B4 
6480: 3d 20 52 4f 4c 36 34 28 28 41 31 33 5e 44 33 29  = ROL64((A13^D3)
6490: 2c 20 35 36 29 3b 0a 20 20 20 20 42 30 20 3d 20  , 56);.    B0 = 
64a0: 52 4f 4c 36 34 28 28 41 34 34 5e 44 34 29 2c 20  ROL64((A44^D4), 
64b0: 32 37 29 3b 0a 20 20 20 20 41 32 30 20 3d 20 20  27);.    A20 =  
64c0: 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32   B0 ^((~B1)&  B2
64d0: 20 29 3b 0a 20 20 20 20 41 30 31 20 3d 20 20 20   );.    A01 =   
64e0: 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20  B1 ^((~B2)&  B3 
64f0: 29 3b 0a 20 20 20 20 41 33 32 20 3d 20 20 20 42  );.    A32 =   B
6500: 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29  2 ^((~B3)&  B4 )
6510: 3b 0a 20 20 20 20 41 31 33 20 3d 20 20 20 42 33  ;.    A13 =   B3
6520: 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b   ^((~B4)&  B0 );
6530: 0a 20 20 20 20 41 34 34 20 3d 20 20 20 42 34 20  .    A44 =   B4 
6540: 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a  ^((~B0)&  B1 );.
6550: 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28  .    B3 = ROL64(
6560: 28 41 31 30 5e 44 30 29 2c 20 34 31 29 3b 0a 20  (A10^D0), 41);. 
6570: 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41     B4 = ROL64((A
6580: 34 31 5e 44 31 29 2c 20 32 29 3b 0a 20 20 20 20  41^D1), 2);.    
6590: 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 32 32 5e  B0 = ROL64((A22^
65a0: 44 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 42 31  D2), 62);.    B1
65b0: 20 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44 33   = ROL64((A03^D3
65c0: 29 2c 20 35 35 29 3b 0a 20 20 20 20 42 32 20 3d  ), 55);.    B2 =
65d0: 20 52 4f 4c 36 34 28 28 41 33 34 5e 44 34 29 2c   ROL64((A34^D4),
65e0: 20 33 39 29 3b 0a 20 20 20 20 41 31 30 20 3d 20   39);.    A10 = 
65f0: 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42    B0 ^((~B1)&  B
6600: 32 20 29 3b 0a 20 20 20 20 41 34 31 20 3d 20 20  2 );.    A41 =  
6610: 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33   B1 ^((~B2)&  B3
6620: 20 29 3b 0a 20 20 20 20 41 32 32 20 3d 20 20 20   );.    A22 =   
6630: 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20  B2 ^((~B3)&  B4 
6640: 29 3b 0a 20 20 20 20 41 30 33 20 3d 20 20 20 42  );.    A03 =   B
6650: 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29  3 ^((~B4)&  B0 )
6660: 3b 0a 20 20 20 20 41 33 34 20 3d 20 20 20 42 34  ;.    A34 =   B4
6670: 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b   ^((~B0)&  B1 );
6680: 0a 0a 20 20 20 20 43 30 20 3d 20 41 30 30 5e 41  ..    C0 = A00^A
6690: 34 30 5e 41 33 30 5e 41 32 30 5e 41 31 30 3b 0a  40^A30^A20^A10;.
66a0: 20 20 20 20 43 31 20 3d 20 41 33 31 5e 41 32 31      C1 = A31^A21
66b0: 5e 41 31 31 5e 41 30 31 5e 41 34 31 3b 0a 20 20  ^A11^A01^A41;.  
66c0: 20 20 43 32 20 3d 20 41 31 32 5e 41 30 32 5e 41    C2 = A12^A02^A
66d0: 34 32 5e 41 33 32 5e 41 32 32 3b 0a 20 20 20 20  42^A32^A22;.    
66e0: 43 33 20 3d 20 41 34 33 5e 41 33 33 5e 41 32 33  C3 = A43^A33^A23
66f0: 5e 41 31 33 5e 41 30 33 3b 0a 20 20 20 20 43 34  ^A13^A03;.    C4
6700: 20 3d 20 41 32 34 5e 41 31 34 5e 41 30 34 5e 41   = A24^A14^A04^A
6710: 34 34 5e 41 33 34 3b 0a 20 20 20 20 44 30 20 3d  44^A34;.    D0 =
6720: 20 43 34 5e 52 4f 4c 36 34 28 43 31 2c 20 31 29   C4^ROL64(C1, 1)
6730: 3b 0a 20 20 20 20 44 31 20 3d 20 43 30 5e 52 4f  ;.    D1 = C0^RO
6740: 4c 36 34 28 43 32 2c 20 31 29 3b 0a 20 20 20 20  L64(C2, 1);.    
6750: 44 32 20 3d 20 43 31 5e 52 4f 4c 36 34 28 43 33  D2 = C1^ROL64(C3
6760: 2c 20 31 29 3b 0a 20 20 20 20 44 33 20 3d 20 43  , 1);.    D3 = C
6770: 32 5e 52 4f 4c 36 34 28 43 34 2c 20 31 29 3b 0a  2^ROL64(C4, 1);.
6780: 20 20 20 20 44 34 20 3d 20 43 33 5e 52 4f 4c 36      D4 = C3^ROL6
6790: 34 28 43 30 2c 20 31 29 3b 0a 0a 20 20 20 20 42  4(C0, 1);..    B
67a0: 30 20 3d 20 28 41 30 30 5e 44 30 29 3b 0a 20 20  0 = (A00^D0);.  
67b0: 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 32    B1 = ROL64((A2
67c0: 31 5e 44 31 29 2c 20 34 34 29 3b 0a 20 20 20 20  1^D1), 44);.    
67d0: 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 34 32 5e  B2 = ROL64((A42^
67e0: 44 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 42 33  D2), 43);.    B3
67f0: 20 3d 20 52 4f 4c 36 34 28 28 41 31 33 5e 44 33   = ROL64((A13^D3
6800: 29 2c 20 32 31 29 3b 0a 20 20 20 20 42 34 20 3d  ), 21);.    B4 =
6810: 20 52 4f 4c 36 34 28 28 41 33 34 5e 44 34 29 2c   ROL64((A34^D4),
6820: 20 31 34 29 3b 0a 20 20 20 20 41 30 30 20 3d 20   14);.    A00 = 
6830: 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42    B0 ^((~B1)&  B
6840: 32 20 29 3b 0a 20 20 20 20 41 30 30 20 5e 3d 20  2 );.    A00 ^= 
6850: 52 43 5b 69 2b 32 5d 3b 0a 20 20 20 20 41 32 31  RC[i+2];.    A21
6860: 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26   =   B1 ^((~B2)&
6870: 20 20 42 33 20 29 3b 0a 20 20 20 20 41 34 32 20    B3 );.    A42 
6880: 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20  =   B2 ^((~B3)& 
6890: 20 42 34 20 29 3b 0a 20 20 20 20 41 31 33 20 3d   B4 );.    A13 =
68a0: 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20     B3 ^((~B4)&  
68b0: 42 30 20 29 3b 0a 20 20 20 20 41 33 34 20 3d 20  B0 );.    A34 = 
68c0: 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42    B4 ^((~B0)&  B
68d0: 31 20 29 3b 0a 0a 20 20 20 20 42 32 20 3d 20 52  1 );..    B2 = R
68e0: 4f 4c 36 34 28 28 41 33 30 5e 44 30 29 2c 20 33  OL64((A30^D0), 3
68f0: 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36  );.    B3 = ROL6
6900: 34 28 28 41 30 31 5e 44 31 29 2c 20 34 35 29 3b  4((A01^D1), 45);
6910: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
6920: 28 41 32 32 5e 44 32 29 2c 20 36 31 29 3b 0a 20  (A22^D2), 61);. 
6930: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
6940: 34 33 5e 44 33 29 2c 20 32 38 29 3b 0a 20 20 20  43^D3), 28);.   
6950: 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 34   B1 = ROL64((A14
6960: 5e 44 34 29 2c 20 32 30 29 3b 0a 20 20 20 20 41  ^D4), 20);.    A
6970: 33 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31  30 =   B0 ^((~B1
6980: 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 30  )&  B2 );.    A0
6990: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
69a0: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 32 32  &  B3 );.    A22
69b0: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
69c0: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 34 33 20    B4 );.    A43 
69d0: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
69e0: 20 42 30 20 29 3b 0a 20 20 20 20 41 31 34 20 3d   B0 );.    A14 =
69f0: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
6a00: 42 31 20 29 3b 0a 0a 20 20 20 20 42 34 20 3d 20  B1 );..    B4 = 
6a10: 52 4f 4c 36 34 28 28 41 31 30 5e 44 30 29 2c 20  ROL64((A10^D0), 
6a20: 31 38 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f  18);.    B0 = RO
6a30: 4c 36 34 28 28 41 33 31 5e 44 31 29 2c 20 31 29  L64((A31^D1), 1)
6a40: 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34  ;.    B1 = ROL64
6a50: 28 28 41 30 32 5e 44 32 29 2c 20 36 29 3b 0a 20  ((A02^D2), 6);. 
6a60: 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41     B2 = ROL64((A
6a70: 32 33 5e 44 33 29 2c 20 32 35 29 3b 0a 20 20 20  23^D3), 25);.   
6a80: 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 34 34   B3 = ROL64((A44
6a90: 5e 44 34 29 2c 20 38 29 3b 0a 20 20 20 20 41 31  ^D4), 8);.    A1
6aa0: 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29  0 =   B0 ^((~B1)
6ab0: 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 33 31  &  B2 );.    A31
6ac0: 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26   =   B1 ^((~B2)&
6ad0: 20 20 42 33 20 29 3b 0a 20 20 20 20 41 30 32 20    B3 );.    A02 
6ae0: 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20  =   B2 ^((~B3)& 
6af0: 20 42 34 20 29 3b 0a 20 20 20 20 41 32 33 20 3d   B4 );.    A23 =
6b00: 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20     B3 ^((~B4)&  
6b10: 42 30 20 29 3b 0a 20 20 20 20 41 34 34 20 3d 20  B0 );.    A44 = 
6b20: 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42    B4 ^((~B0)&  B
6b30: 31 20 29 3b 0a 0a 20 20 20 20 42 31 20 3d 20 52  1 );..    B1 = R
6b40: 4f 4c 36 34 28 28 41 34 30 5e 44 30 29 2c 20 33  OL64((A40^D0), 3
6b50: 36 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c  6);.    B2 = ROL
6b60: 36 34 28 28 41 31 31 5e 44 31 29 2c 20 31 30 29  64((A11^D1), 10)
6b70: 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34  ;.    B3 = ROL64
6b80: 28 28 41 33 32 5e 44 32 29 2c 20 31 35 29 3b 0a  ((A32^D2), 15);.
6b90: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
6ba0: 41 30 33 5e 44 33 29 2c 20 35 36 29 3b 0a 20 20  A03^D3), 56);.  
6bb0: 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 32    B0 = ROL64((A2
6bc0: 34 5e 44 34 29 2c 20 32 37 29 3b 0a 20 20 20 20  4^D4), 27);.    
6bd0: 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42  A40 =   B0 ^((~B
6be0: 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41  1)&  B2 );.    A
6bf0: 31 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  11 =   B1 ^((~B2
6c00: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 33  )&  B3 );.    A3
6c10: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
6c20: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 30 33  &  B4 );.    A03
6c30: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
6c40: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 32 34 20    B0 );.    A24 
6c50: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
6c60: 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 33 20 3d   B1 );..    B3 =
6c70: 20 52 4f 4c 36 34 28 28 41 32 30 5e 44 30 29 2c   ROL64((A20^D0),
6c80: 20 34 31 29 3b 0a 20 20 20 20 42 34 20 3d 20 52   41);.    B4 = R
6c90: 4f 4c 36 34 28 28 41 34 31 5e 44 31 29 2c 20 32  OL64((A41^D1), 2
6ca0: 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36  );.    B0 = ROL6
6cb0: 34 28 28 41 31 32 5e 44 32 29 2c 20 36 32 29 3b  4((A12^D2), 62);
6cc0: 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28  .    B1 = ROL64(
6cd0: 28 41 33 33 5e 44 33 29 2c 20 35 35 29 3b 0a 20  (A33^D3), 55);. 
6ce0: 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41     B2 = ROL64((A
6cf0: 30 34 5e 44 34 29 2c 20 33 39 29 3b 0a 20 20 20  04^D4), 39);.   
6d00: 20 41 32 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A20 =   B0 ^((~
6d10: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
6d20: 41 34 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A41 =   B1 ^((~B
6d30: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
6d40: 31 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  12 =   B2 ^((~B3
6d50: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 33  )&  B4 );.    A3
6d60: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
6d70: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 30 34  &  B0 );.    A04
6d80: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
6d90: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 43 30 20    B1 );..    C0 
6da0: 3d 20 41 30 30 5e 41 33 30 5e 41 31 30 5e 41 34  = A00^A30^A10^A4
6db0: 30 5e 41 32 30 3b 0a 20 20 20 20 43 31 20 3d 20  0^A20;.    C1 = 
6dc0: 41 32 31 5e 41 30 31 5e 41 33 31 5e 41 31 31 5e  A21^A01^A31^A11^
6dd0: 41 34 31 3b 0a 20 20 20 20 43 32 20 3d 20 41 34  A41;.    C2 = A4
6de0: 32 5e 41 32 32 5e 41 30 32 5e 41 33 32 5e 41 31  2^A22^A02^A32^A1
6df0: 32 3b 0a 20 20 20 20 43 33 20 3d 20 41 31 33 5e  2;.    C3 = A13^
6e00: 41 34 33 5e 41 32 33 5e 41 30 33 5e 41 33 33 3b  A43^A23^A03^A33;
6e10: 0a 20 20 20 20 43 34 20 3d 20 41 33 34 5e 41 31  .    C4 = A34^A1
6e20: 34 5e 41 34 34 5e 41 32 34 5e 41 30 34 3b 0a 20  4^A44^A24^A04;. 
6e30: 20 20 20 44 30 20 3d 20 43 34 5e 52 4f 4c 36 34     D0 = C4^ROL64
6e40: 28 43 31 2c 20 31 29 3b 0a 20 20 20 20 44 31 20  (C1, 1);.    D1 
6e50: 3d 20 43 30 5e 52 4f 4c 36 34 28 43 32 2c 20 31  = C0^ROL64(C2, 1
6e60: 29 3b 0a 20 20 20 20 44 32 20 3d 20 43 31 5e 52  );.    D2 = C1^R
6e70: 4f 4c 36 34 28 43 33 2c 20 31 29 3b 0a 20 20 20  OL64(C3, 1);.   
6e80: 20 44 33 20 3d 20 43 32 5e 52 4f 4c 36 34 28 43   D3 = C2^ROL64(C
6e90: 34 2c 20 31 29 3b 0a 20 20 20 20 44 34 20 3d 20  4, 1);.    D4 = 
6ea0: 43 33 5e 52 4f 4c 36 34 28 43 30 2c 20 31 29 3b  C3^ROL64(C0, 1);
6eb0: 0a 0a 20 20 20 20 42 30 20 3d 20 28 41 30 30 5e  ..    B0 = (A00^
6ec0: 44 30 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f  D0);.    B1 = RO
6ed0: 4c 36 34 28 28 41 30 31 5e 44 31 29 2c 20 34 34  L64((A01^D1), 44
6ee0: 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36  );.    B2 = ROL6
6ef0: 34 28 28 41 30 32 5e 44 32 29 2c 20 34 33 29 3b  4((A02^D2), 43);
6f00: 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28  .    B3 = ROL64(
6f10: 28 41 30 33 5e 44 33 29 2c 20 32 31 29 3b 0a 20  (A03^D3), 21);. 
6f20: 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41     B4 = ROL64((A
6f30: 30 34 5e 44 34 29 2c 20 31 34 29 3b 0a 20 20 20  04^D4), 14);.   
6f40: 20 41 30 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A00 =   B0 ^((~
6f50: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
6f60: 41 30 30 20 5e 3d 20 52 43 5b 69 2b 33 5d 3b 0a  A00 ^= RC[i+3];.
6f70: 20 20 20 20 41 30 31 20 3d 20 20 20 42 31 20 5e      A01 =   B1 ^
6f80: 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a 20  ((~B2)&  B3 );. 
6f90: 20 20 20 41 30 32 20 3d 20 20 20 42 32 20 5e 28     A02 =   B2 ^(
6fa0: 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20 20  (~B3)&  B4 );.  
6fb0: 20 20 41 30 33 20 3d 20 20 20 42 33 20 5e 28 28    A03 =   B3 ^((
6fc0: 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20 20  ~B4)&  B0 );.   
6fd0: 20 41 30 34 20 3d 20 20 20 42 34 20 5e 28 28 7e   A04 =   B4 ^((~
6fe0: 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20 20  B0)&  B1 );..   
6ff0: 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 31 30   B2 = ROL64((A10
7000: 5e 44 30 29 2c 20 33 29 3b 0a 20 20 20 20 42 33  ^D0), 3);.    B3
7010: 20 3d 20 52 4f 4c 36 34 28 28 41 31 31 5e 44 31   = ROL64((A11^D1
7020: 29 2c 20 34 35 29 3b 0a 20 20 20 20 42 34 20 3d  ), 45);.    B4 =
7030: 20 52 4f 4c 36 34 28 28 41 31 32 5e 44 32 29 2c   ROL64((A12^D2),
7040: 20 36 31 29 3b 0a 20 20 20 20 42 30 20 3d 20 52   61);.    B0 = R
7050: 4f 4c 36 34 28 28 41 31 33 5e 44 33 29 2c 20 32  OL64((A13^D3), 2
7060: 38 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c  8);.    B1 = ROL
7070: 36 34 28 28 41 31 34 5e 44 34 29 2c 20 32 30 29  64((A14^D4), 20)
7080: 3b 0a 20 20 20 20 41 31 30 20 3d 20 20 20 42 30  ;.    A10 =   B0
7090: 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b   ^((~B1)&  B2 );
70a0: 0a 20 20 20 20 41 31 31 20 3d 20 20 20 42 31 20  .    A11 =   B1 
70b0: 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a  ^((~B2)&  B3 );.
70c0: 20 20 20 20 41 31 32 20 3d 20 20 20 42 32 20 5e      A12 =   B2 ^
70d0: 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20  ((~B3)&  B4 );. 
70e0: 20 20 20 41 31 33 20 3d 20 20 20 42 33 20 5e 28     A13 =   B3 ^(
70f0: 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20  (~B4)&  B0 );.  
7100: 20 20 41 31 34 20 3d 20 20 20 42 34 20 5e 28 28    A14 =   B4 ^((
7110: 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20  ~B0)&  B1 );..  
7120: 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 32    B4 = ROL64((A2
7130: 30 5e 44 30 29 2c 20 31 38 29 3b 0a 20 20 20 20  0^D0), 18);.    
7140: 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 32 31 5e  B0 = ROL64((A21^
7150: 44 31 29 2c 20 31 29 3b 0a 20 20 20 20 42 31 20  D1), 1);.    B1 
7160: 3d 20 52 4f 4c 36 34 28 28 41 32 32 5e 44 32 29  = ROL64((A22^D2)
7170: 2c 20 36 29 3b 0a 20 20 20 20 42 32 20 3d 20 52  , 6);.    B2 = R
7180: 4f 4c 36 34 28 28 41 32 33 5e 44 33 29 2c 20 32  OL64((A23^D3), 2
7190: 35 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  5);.    B3 = ROL
71a0: 36 34 28 28 41 32 34 5e 44 34 29 2c 20 38 29 3b  64((A24^D4), 8);
71b0: 0a 20 20 20 20 41 32 30 20 3d 20 20 20 42 30 20  .    A20 =   B0 
71c0: 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a  ^((~B1)&  B2 );.
71d0: 20 20 20 20 41 32 31 20 3d 20 20 20 42 31 20 5e      A21 =   B1 ^
71e0: 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a 20  ((~B2)&  B3 );. 
71f0: 20 20 20 41 32 32 20 3d 20 20 20 42 32 20 5e 28     A22 =   B2 ^(
7200: 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20 20  (~B3)&  B4 );.  
7210: 20 20 41 32 33 20 3d 20 20 20 42 33 20 5e 28 28    A23 =   B3 ^((
7220: 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20 20  ~B4)&  B0 );.   
7230: 20 41 32 34 20 3d 20 20 20 42 34 20 5e 28 28 7e   A24 =   B4 ^((~
7240: 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20 20  B0)&  B1 );..   
7250: 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 33 30   B1 = ROL64((A30
7260: 5e 44 30 29 2c 20 33 36 29 3b 0a 20 20 20 20 42  ^D0), 36);.    B
7270: 32 20 3d 20 52 4f 4c 36 34 28 28 41 33 31 5e 44  2 = ROL64((A31^D
7280: 31 29 2c 20 31 30 29 3b 0a 20 20 20 20 42 33 20  1), 10);.    B3 
7290: 3d 20 52 4f 4c 36 34 28 28 41 33 32 5e 44 32 29  = ROL64((A32^D2)
72a0: 2c 20 31 35 29 3b 0a 20 20 20 20 42 34 20 3d 20  , 15);.    B4 = 
72b0: 52 4f 4c 36 34 28 28 41 33 33 5e 44 33 29 2c 20  ROL64((A33^D3), 
72c0: 35 36 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f  56);.    B0 = RO
72d0: 4c 36 34 28 28 41 33 34 5e 44 34 29 2c 20 32 37  L64((A34^D4), 27
72e0: 29 3b 0a 20 20 20 20 41 33 30 20 3d 20 20 20 42  );.    A30 =   B
72f0: 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29  0 ^((~B1)&  B2 )
7300: 3b 0a 20 20 20 20 41 33 31 20 3d 20 20 20 42 31  ;.    A31 =   B1
7310: 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b   ^((~B2)&  B3 );
7320: 0a 20 20 20 20 41 33 32 20 3d 20 20 20 42 32 20  .    A32 =   B2 
7330: 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a  ^((~B3)&  B4 );.
7340: 20 20 20 20 41 33 33 20 3d 20 20 20 42 33 20 5e      A33 =   B3 ^
7350: 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20  ((~B4)&  B0 );. 
7360: 20 20 20 41 33 34 20 3d 20 20 20 42 34 20 5e 28     A34 =   B4 ^(
7370: 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20  (~B0)&  B1 );.. 
7380: 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41     B3 = ROL64((A
7390: 34 30 5e 44 30 29 2c 20 34 31 29 3b 0a 20 20 20  40^D0), 41);.   
73a0: 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 34 31   B4 = ROL64((A41
73b0: 5e 44 31 29 2c 20 32 29 3b 0a 20 20 20 20 42 30  ^D1), 2);.    B0
73c0: 20 3d 20 52 4f 4c 36 34 28 28 41 34 32 5e 44 32   = ROL64((A42^D2
73d0: 29 2c 20 36 32 29 3b 0a 20 20 20 20 42 31 20 3d  ), 62);.    B1 =
73e0: 20 52 4f 4c 36 34 28 28 41 34 33 5e 44 33 29 2c   ROL64((A43^D3),
73f0: 20 35 35 29 3b 0a 20 20 20 20 42 32 20 3d 20 52   55);.    B2 = R
7400: 4f 4c 36 34 28 28 41 34 34 5e 44 34 29 2c 20 33  OL64((A44^D4), 3
7410: 39 29 3b 0a 20 20 20 20 41 34 30 20 3d 20 20 20  9);.    A40 =   
7420: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
7430: 29 3b 0a 20 20 20 20 41 34 31 20 3d 20 20 20 42  );.    A41 =   B
7440: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
7450: 3b 0a 20 20 20 20 41 34 32 20 3d 20 20 20 42 32  ;.    A42 =   B2
7460: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
7470: 0a 20 20 20 20 41 34 33 20 3d 20 20 20 42 33 20  .    A43 =   B3 
7480: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
7490: 20 20 20 20 41 34 34 20 3d 20 20 20 42 34 20 5e      A44 =   B4 ^
74a0: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 20  ((~B0)&  B1 );. 
74b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
74c0: 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 68 61 73  ialize a new has
74d0: 68 2e 20 20 69 53 69 7a 65 20 64 65 74 65 72 6d  h.  iSize determ
74e0: 69 6e 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ines the size of
74f0: 20 74 68 65 20 68 61 73 68 0a 2a 2a 20 69 6e 20   the hash.** in 
7500: 62 69 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 20  bits and should 
7510: 62 65 20 6f 6e 65 20 6f 66 20 32 32 34 2c 20 32  be one of 224, 2
7520: 35 36 2c 20 33 38 34 2c 20 6f 72 20 35 31 32 2e  56, 384, or 512.
7530: 20 20 4f 72 20 69 53 69 7a 65 0a 2a 2a 20 63 61    Or iSize.** ca
7540: 6e 20 62 65 20 7a 65 72 6f 20 74 6f 20 75 73 65  n be zero to use
7550: 20 74 68 65 20 64 65 66 61 75 6c 74 20 68 61 73   the default has
7560: 68 20 73 69 7a 65 20 6f 66 20 32 35 36 20 62 69  h size of 256 bi
7570: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
7580: 69 64 20 53 48 41 33 49 6e 69 74 28 53 48 41 33  id SHA3Init(SHA3
7590: 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  Context *p, int 
75a0: 69 53 69 7a 65 29 7b 0a 20 20 6d 65 6d 73 65 74  iSize){.  memset
75b0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
75c0: 29 29 3b 0a 20 20 69 66 28 20 69 53 69 7a 65 3e  ));.  if( iSize>
75d0: 3d 31 32 38 20 26 26 20 69 53 69 7a 65 3c 3d 35  =128 && iSize<=5
75e0: 31 32 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 61  12 ){.    p->nRa
75f0: 74 65 20 3d 20 28 31 36 30 30 20 2d 20 28 28 69  te = (1600 - ((i
7600: 53 69 7a 65 20 2b 20 33 31 29 26 7e 33 31 29 2a  Size + 31)&~31)*
7610: 32 29 2f 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/8;.  }else{. 
7620: 20 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28 31     p->nRate = (1
7630: 36 30 30 20 2d 20 32 2a 32 35 36 29 2f 38 3b 0a  600 - 2*256)/8;.
7640: 20 20 7d 0a 23 69 66 20 53 48 41 33 5f 42 59 54    }.#if SHA3_BYT
7650: 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a 20 20 2f  EORDER==1234.  /
7660: 2a 20 4b 6e 6f 77 6e 20 74 6f 20 62 65 20 6c 69  * Known to be li
7670: 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 74 20 63  ttle-endian at c
7680: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 4e 6f 2d  ompile-time. No-
7690: 6f 70 20 2a 2f 0a 23 65 6c 69 66 20 53 48 41 33  op */.#elif SHA3
76a0: 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34 33 32 31  _BYTEORDER==4321
76b0: 0a 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 37  .  p->ixMask = 7
76c0: 3b 20 20 2f 2a 20 42 69 67 2d 65 6e 64 69 61 6e  ;  /* Big-endian
76d0: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20   */.#else.  {.  
76e0: 20 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65    static unsigne
76f0: 64 20 69 6e 74 20 6f 6e 65 20 3d 20 31 3b 0a 20  d int one = 1;. 
7700: 20 20 20 69 66 28 20 31 3d 3d 2a 28 75 6e 73 69     if( 1==*(unsi
7710: 67 6e 65 64 20 63 68 61 72 2a 29 26 6f 6e 65 20  gned char*)&one 
7720: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 69 74 74  ){.      /* Litt
7730: 6c 65 20 65 6e 64 69 61 6e 2e 20 20 4e 6f 20 62  le endian.  No b
7740: 79 74 65 20 73 77 61 70 70 69 6e 67 2e 20 2a 2f  yte swapping. */
7750: 0a 20 20 20 20 20 20 70 2d 3e 69 78 4d 61 73 6b  .      p->ixMask
7760: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
7770: 0a 20 20 20 20 20 20 2f 2a 20 42 69 67 20 65 6e  .      /* Big en
7780: 64 69 61 6e 2e 20 20 42 79 74 65 20 73 77 61 70  dian.  Byte swap
7790: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 69 78  . */.      p->ix
77a0: 4d 61 73 6b 20 3d 20 37 3b 0a 20 20 20 20 7d 0a  Mask = 7;.    }.
77b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
77c0: 0a 2a 2a 20 4d 61 6b 65 20 63 6f 6e 73 65 63 75  .** Make consecu
77d0: 74 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  tive calls to th
77e0: 65 20 53 48 41 33 55 70 64 61 74 65 20 66 75 6e  e SHA3Update fun
77f0: 63 74 69 6f 6e 20 74 6f 20 61 64 64 20 6e 65 77  ction to add new
7800: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 74   content.** to t
7810: 68 65 20 68 61 73 68 0a 2a 2f 0a 73 74 61 74 69  he hash.*/.stati
7820: 63 20 76 6f 69 64 20 53 48 41 33 55 70 64 61 74  c void SHA3Updat
7830: 65 28 0a 20 20 53 48 41 33 43 6f 6e 74 65 78 74  e(.  SHA3Context
7840: 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 75 6e 73   *p,.  const uns
7850: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
7860: 61 2c 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  a,.  unsigned in
7870: 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 75 6e 73  t nData.){.  uns
7880: 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b  igned int i = 0;
7890: 0a 23 69 66 20 53 48 41 33 5f 42 59 54 45 4f 52  .#if SHA3_BYTEOR
78a0: 44 45 52 3d 3d 31 32 33 34 0a 20 20 69 66 28 20  DER==1234.  if( 
78b0: 28 70 2d 3e 6e 4c 6f 61 64 65 64 20 25 20 38 29  (p->nLoaded % 8)
78c0: 3d 3d 30 20 26 26 20 28 28 61 44 61 74 61 20 2d  ==0 && ((aData -
78d0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
78e0: 20 63 68 61 72 2a 29 30 29 26 37 29 3d 3d 30 20   char*)0)&7)==0 
78f0: 29 7b 0a 20 20 20 20 66 6f 72 28 3b 20 69 2b 37  ){.    for(; i+7
7900: 3c 6e 44 61 74 61 3b 20 69 2b 3d 38 29 7b 0a 20  <nData; i+=8){. 
7910: 20 20 20 20 20 70 2d 3e 75 2e 73 5b 70 2d 3e 6e       p->u.s[p->n
7920: 4c 6f 61 64 65 64 2f 38 5d 20 5e 3d 20 2a 28 75  Loaded/8] ^= *(u
7930: 36 34 2a 29 26 61 44 61 74 61 5b 69 5d 3b 0a 20  64*)&aData[i];. 
7940: 20 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20       p->nLoaded 
7950: 2b 3d 20 38 3b 0a 20 20 20 20 20 20 69 66 28 20  += 8;.      if( 
7960: 70 2d 3e 6e 4c 6f 61 64 65 64 3e 3d 70 2d 3e 6e  p->nLoaded>=p->n
7970: 52 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Rate ){.        
7980: 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65 70 28  KeccakF1600Step(
7990: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  p);.        p->n
79a0: 4c 6f 61 64 65 64 20 3d 20 30 3b 0a 20 20 20 20  Loaded = 0;.    
79b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
79c0: 6e 64 69 66 0a 20 20 66 6f 72 28 3b 20 69 3c 6e  ndif.  for(; i<n
79d0: 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 23 69 66 20  Data; i++){.#if 
79e0: 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d  SHA3_BYTEORDER==
79f0: 31 32 33 34 0a 20 20 20 20 70 2d 3e 75 2e 78 5b  1234.    p->u.x[
7a00: 70 2d 3e 6e 4c 6f 61 64 65 64 5d 20 5e 3d 20 61  p->nLoaded] ^= a
7a10: 44 61 74 61 5b 69 5d 3b 0a 23 65 6c 69 66 20 53  Data[i];.#elif S
7a20: 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34  HA3_BYTEORDER==4
7a30: 33 32 31 0a 20 20 20 20 70 2d 3e 75 2e 78 5b 70  321.    p->u.x[p
7a40: 2d 3e 6e 4c 6f 61 64 65 64 5e 30 78 30 37 5d 20  ->nLoaded^0x07] 
7a50: 5e 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6c  ^= aData[i];.#el
7a60: 73 65 0a 20 20 20 20 70 2d 3e 75 2e 78 5b 70 2d  se.    p->u.x[p-
7a70: 3e 6e 4c 6f 61 64 65 64 5e 70 2d 3e 69 78 4d 61  >nLoaded^p->ixMa
7a80: 73 6b 5d 20 5e 3d 20 61 44 61 74 61 5b 69 5d 3b  sk] ^= aData[i];
7a90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 6e  .#endif.    p->n
7aa0: 4c 6f 61 64 65 64 2b 2b 3b 0a 20 20 20 20 69 66  Loaded++;.    if
7ab0: 28 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70 2d  ( p->nLoaded==p-
7ac0: 3e 6e 52 61 74 65 20 29 7b 0a 20 20 20 20 20 20  >nRate ){.      
7ad0: 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65 70 28  KeccakF1600Step(
7ae0: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 6f  p);.      p->nLo
7af0: 61 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  aded = 0;.    }.
7b00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 66 74    }.}../*.** Aft
7b10: 65 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  er all content h
7b20: 61 73 20 62 65 65 6e 20 61 64 64 65 64 2c 20 69  as been added, i
7b30: 6e 76 6f 6b 65 20 53 48 41 33 46 69 6e 61 6c 28  nvoke SHA3Final(
7b40: 29 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  ) to compute.** 
7b50: 74 68 65 20 66 69 6e 61 6c 20 68 61 73 68 2e 20  the final hash. 
7b60: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
7b70: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
7b80: 74 6f 20 74 68 65 20 62 69 6e 61 72 79 0a 2a 2a  to the binary.**
7b90: 20 68 61 73 68 20 76 61 6c 75 65 2e 0a 2a 2f 0a   hash value..*/.
7ba0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
7bb0: 63 68 61 72 20 2a 53 48 41 33 46 69 6e 61 6c 28  char *SHA3Final(
7bc0: 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 29 7b  SHA3Context *p){
7bd0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7be0: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 61  i;.  if( p->nLoa
7bf0: 64 65 64 3d 3d 70 2d 3e 6e 52 61 74 65 2d 31 20  ded==p->nRate-1 
7c00: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  ){.    const uns
7c10: 69 67 6e 65 64 20 63 68 61 72 20 63 31 20 3d 20  igned char c1 = 
7c20: 30 78 38 36 3b 0a 20 20 20 20 53 48 41 33 55 70  0x86;.    SHA3Up
7c30: 64 61 74 65 28 70 2c 20 26 63 31 2c 20 31 29 3b  date(p, &c1, 1);
7c40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
7c50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7c60: 72 20 63 32 20 3d 20 30 78 30 36 3b 0a 20 20 20  r c2 = 0x06;.   
7c70: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7c80: 63 68 61 72 20 63 33 20 3d 20 30 78 38 30 3b 0a  char c3 = 0x80;.
7c90: 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28 70      SHA3Update(p
7ca0: 2c 20 26 63 32 2c 20 31 29 3b 0a 20 20 20 20 70  , &c2, 1);.    p
7cb0: 2d 3e 6e 4c 6f 61 64 65 64 20 3d 20 70 2d 3e 6e  ->nLoaded = p->n
7cc0: 52 61 74 65 20 2d 20 31 3b 0a 20 20 20 20 53 48  Rate - 1;.    SH
7cd0: 41 33 55 70 64 61 74 65 28 70 2c 20 26 63 33 2c  A3Update(p, &c3,
7ce0: 20 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69   1);.  }.  for(i
7cf0: 3d 30 3b 20 69 3c 70 2d 3e 6e 52 61 74 65 3b 20  =0; i<p->nRate; 
7d00: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 75 2e 78  i++){.    p->u.x
7d10: 5b 69 2b 70 2d 3e 6e 52 61 74 65 5d 20 3d 20 70  [i+p->nRate] = p
7d20: 2d 3e 75 2e 78 5b 69 5e 70 2d 3e 69 78 4d 61 73  ->u.x[i^p->ixMas
7d30: 6b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k];.  }.  return
7d40: 20 26 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 52 61 74   &p->u.x[p->nRat
7d50: 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  e];.}../*.** Imp
7d60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
7d70: 68 65 20 73 68 61 33 28 58 2c 53 49 5a 45 29 20  he sha3(X,SIZE) 
7d80: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
7d90: 52 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 77 68  Return a BLOB wh
7da0: 69 63 68 20 69 73 20 74 68 65 20 53 49 5a 45 2d  ich is the SIZE-
7db0: 62 69 74 20 53 48 41 33 20 68 61 73 68 20 6f 66  bit SHA3 hash of
7dc0: 20 58 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74   X.  The default
7dd0: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 32 35 36 2e  .** size is 256.
7de0: 20 20 49 66 20 58 20 69 73 20 61 20 42 4c 4f 42    If X is a BLOB
7df0: 2c 20 69 74 20 69 73 20 68 61 73 68 65 64 20 61  , it is hashed a
7e00: 73 20 69 73 2e 20 20 0a 2a 2a 20 46 6f 72 20 61  s is.  .** For a
7e10: 6c 6c 20 6f 74 68 65 72 20 6e 6f 6e 2d 4e 55 4c  ll other non-NUL
7e20: 4c 20 74 79 70 65 73 20 6f 66 20 69 6e 70 75 74  L types of input
7e30: 2c 20 58 20 69 73 20 63 6f 6e 76 65 72 74 65 64  , X is converted
7e40: 20 69 6e 74 6f 20 61 20 55 54 46 2d 38 20 73 74   into a UTF-8 st
7e50: 72 69 6e 67 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ring.** and the 
7e60: 73 74 72 69 6e 67 20 69 73 20 68 61 73 68 65 64  string is hashed
7e70: 20 77 69 74 68 6f 75 74 20 74 68 65 20 74 72 61   without the tra
7e80: 69 6c 69 6e 67 20 30 78 30 30 20 74 65 72 6d 69  iling 0x00 termi
7e90: 6e 61 74 6f 72 2e 20 20 54 68 65 20 68 61 73 68  nator.  The hash
7ea0: 0a 2a 2a 20 6f 66 20 61 20 4e 55 4c 4c 20 76 61  .** of a NULL va
7eb0: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  lue is NULL..*/.
7ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 61 33  static void sha3
7ed0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
7ee0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7ef0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
7f00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7f10: 61 72 67 76 0a 29 7b 0a 20 20 53 48 41 33 43 6f  argv.){.  SHA3Co
7f20: 6e 74 65 78 74 20 63 78 3b 0a 20 20 69 6e 74 20  ntext cx;.  int 
7f30: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
7f40: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
7f50: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  0]);.  int nByte
7f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7f70: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
7f80: 0a 20 20 69 6e 74 20 69 53 69 7a 65 3b 0a 20 20  .  int iSize;.  
7f90: 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20  if( argc==1 ){. 
7fa0: 20 20 20 69 53 69 7a 65 20 3d 20 32 35 36 3b 0a     iSize = 256;.
7fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 69    }else{.    iSi
7fc0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ze = sqlite3_val
7fd0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
7fe0: 0a 20 20 20 20 69 66 28 20 69 53 69 7a 65 21 3d  .    if( iSize!=
7ff0: 32 32 34 20 26 26 20 69 53 69 7a 65 21 3d 32 35  224 && iSize!=25
8000: 36 20 26 26 20 69 53 69 7a 65 21 3d 33 38 34 20  6 && iSize!=384 
8010: 26 26 20 69 53 69 7a 65 21 3d 35 31 32 20 29 7b  && iSize!=512 ){
8020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8030: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8040: 65 78 74 2c 20 22 53 48 41 33 20 73 69 7a 65 20  ext, "SHA3 size 
8050: 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
8060: 3a 20 32 32 34 20 32 35 36 20 22 0a 20 20 20 20  : 224 256 ".    
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 22 33 38 34 20 35 31 32 22 2c 20 2d 31 29 3b 0a  "384 512", -1);.
80a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
80b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 54    }.  }.  if( eT
80c0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
80d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 53 48 41   ) return;.  SHA
80e0: 33 49 6e 69 74 28 26 63 78 2c 20 69 53 69 7a 65  3Init(&cx, iSize
80f0: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
8100: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
8110: 20 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63     SHA3Update(&c
8120: 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
8130: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 2c 20  _blob(argv[0]), 
8140: 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
8150: 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28  .    SHA3Update(
8160: 26 63 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  &cx, sqlite3_val
8170: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
8180: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
8190: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
81a0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 53 48 41  lob(context, SHA
81b0: 33 46 69 6e 61 6c 28 26 63 78 29 2c 20 69 53 69  3Final(&cx), iSi
81c0: 7a 65 2f 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  ze/8, SQLITE_TRA
81d0: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 20 43  NSIENT);.}../* C
81e0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
81f0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 73  using sqlite3_vs
8200: 6e 70 72 69 6e 74 66 28 29 20 77 69 74 68 20 61  nprintf() with a
8210: 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 0a   maximum length.
8220: 2a 2a 20 6f 66 20 35 30 20 62 79 74 65 73 20 61  ** of 50 bytes a
8230: 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
8240: 20 68 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   hash..*/.static
8250: 20 76 6f 69 64 20 68 61 73 68 5f 73 74 65 70 5f   void hash_step_
8260: 76 66 6f 72 6d 61 74 28 0a 20 20 53 48 41 33 43  vformat(.  SHA3C
8270: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8290: 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 69  d content to thi
82a0: 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  s context */.  c
82b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
82c0: 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
82d0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
82e0: 20 6e 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   n;.  char zBuf[
82f0: 35 30 5d 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  50];.  va_start(
8300: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
8310: 73 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e 74  sqlite3_vsnprint
8320: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
8330: 42 75 66 2c 7a 46 6f 72 6d 61 74 2c 61 70 29 3b  Buf,zFormat,ap);
8340: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
8350: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
8360: 28 7a 42 75 66 29 3b 0a 20 20 53 48 41 33 55 70  (zBuf);.  SHA3Up
8370: 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65  date(p, (unsigne
8380: 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 6e 29  d char*)zBuf, n)
8390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
83a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
83b0: 20 73 68 61 33 5f 71 75 65 72 79 28 53 51 4c 2c   sha3_query(SQL,
83c0: 53 49 5a 45 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  SIZE) function..
83d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
83e0: 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 20 61 6e 64  ion compiles and
83f0: 20 72 75 6e 73 20 74 68 65 20 53 51 4c 20 73 74   runs the SQL st
8400: 61 74 65 6d 65 6e 74 28 73 29 20 67 69 76 65 6e  atement(s) given
8410: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
8420: 65 6e 74 2e 20 54 68 65 20 72 65 73 75 6c 74 73  ent. The results
8430: 20 61 72 65 20 68 61 73 68 65 64 20 75 73 69 6e   are hashed usin
8440: 67 20 61 20 53 49 5a 45 2d 62 69 74 20 53 48 41  g a SIZE-bit SHA
8450: 33 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 0a  3.  The default.
8460: 2a 2a 20 73 69 7a 65 20 69 73 20 32 35 36 2e 0a  ** size is 256..
8470: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
8480: 20 6f 66 20 74 68 65 20 62 79 74 65 20 73 74 72   of the byte str
8490: 65 61 6d 20 74 68 61 74 20 69 73 20 68 61 73 68  eam that is hash
84a0: 65 64 20 69 73 20 73 75 6d 6d 61 72 69 7a 65 64  ed is summarized
84b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
84c0: 2a 2a 20 20 20 20 20 20 20 53 3c 6e 3e 3a 3c 73  **       S<n>:<s
84d0: 71 6c 3e 0a 2a 2a 20 20 20 20 20 20 20 52 0a 2a  ql>.**       R.*
84e0: 2a 20 20 20 20 20 20 20 4e 0a 2a 2a 20 20 20 20  *       N.**    
84f0: 20 20 20 49 3c 69 6e 74 3e 0a 2a 2a 20 20 20 20     I<int>.**    
8500: 20 20 20 46 3c 69 65 65 65 2d 66 6c 6f 61 74 3e     F<ieee-float>
8510: 0a 2a 2a 20 20 20 20 20 20 20 42 3c 73 69 7a 65  .**       B<size
8520: 3e 3a 3c 62 79 74 65 73 3e 0a 2a 2a 20 20 20 20  >:<bytes>.**    
8530: 20 20 20 54 3c 73 69 7a 65 3e 3a 3c 74 65 78 74     T<size>:<text
8540: 3e 0a 2a 2a 0a 2a 2a 20 3c 73 71 6c 3e 20 69 73  >.**.** <sql> is
8550: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
8560: 4c 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  L text for each 
8570: 73 74 61 74 65 6d 65 6e 74 20 72 75 6e 20 61 6e  statement run an
8580: 64 20 3c 6e 3e 20 69 73 0a 2a 2a 20 74 68 65 20  d <n> is.** the 
8590: 73 69 7a 65 20 6f 66 20 74 68 61 74 20 74 65 78  size of that tex
85a0: 74 2e 20 20 54 68 65 20 53 51 4c 20 74 65 78 74  t.  The SQL text
85b0: 20 69 73 20 55 54 46 2d 38 2e 20 20 41 20 73 69   is UTF-8.  A si
85c0: 6e 67 6c 65 20 52 20 63 68 61 72 61 63 74 65 72  ngle R character
85d0: 0a 2a 2a 20 6f 63 63 75 72 73 20 62 65 66 6f 72  .** occurs befor
85e0: 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  e the start of e
85f0: 61 63 68 20 72 6f 77 2e 20 20 4e 20 6d 65 61 6e  ach row.  N mean
8600: 73 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e 0a  s a NULL value..
8610: 2a 2a 20 49 20 6d 65 61 6e 20 61 6e 20 38 2d 62  ** I mean an 8-b
8620: 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  yte little-endia
8630: 6e 20 69 6e 74 65 67 65 72 20 3c 69 6e 74 3e 2e  n integer <int>.
8640: 20 20 46 20 69 73 20 61 20 66 6c 6f 61 74 69 6e    F is a floatin
8650: 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g point.** numbe
8660: 72 20 77 69 74 68 20 61 6e 20 38 2d 62 79 74 65  r with an 8-byte
8670: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 49   little-endian I
8680: 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
8690: 6e 74 20 76 61 6c 75 65 20 3c 69 65 65 65 2d 66  nt value <ieee-f
86a0: 6c 6f 61 74 3e 2e 0a 2a 2a 20 42 20 6d 65 61 6e  loat>..** B mean
86b0: 73 20 62 6c 6f 62 73 20 6f 66 20 3c 73 69 7a 65  s blobs of <size
86c0: 3e 20 62 79 74 65 73 2e 20 20 54 20 6d 65 61 6e  > bytes.  T mean
86d0: 73 20 74 65 78 74 20 72 65 6e 64 65 72 65 64 20  s text rendered 
86e0: 61 73 20 3c 73 69 7a 65 3e 0a 2a 2a 20 62 79 74  as <size>.** byt
86f0: 65 73 20 6f 66 20 55 54 46 2d 38 2e 20 20 54 68  es of UTF-8.  Th
8700: 65 20 3c 6e 3e 20 61 6e 64 20 3c 73 69 7a 65 3e  e <n> and <size>
8710: 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 70 72   values are expr
8720: 65 73 73 65 64 20 61 73 20 61 6e 20 41 53 43 49  essed as an ASCI
8730: 49 0a 2a 2a 20 74 65 78 74 20 69 6e 74 65 67 65  I.** text intege
8740: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  rs..**.** For ea
8750: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
8760: 20 69 6e 20 74 68 65 20 58 20 69 6e 70 75 74 2c   in the X input,
8770: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 53 20   there is one S 
8780: 73 65 67 6d 65 6e 74 2e 20 20 45 61 63 68 0a 2a  segment.  Each.*
8790: 2a 20 53 20 73 65 67 6d 65 6e 74 20 69 73 20 66  * S segment is f
87a0: 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
87b0: 6f 72 20 6d 6f 72 65 20 52 20 73 65 67 6d 65 6e  or more R segmen
87c0: 74 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  ts, one for each
87d0: 20 72 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 72   row in the.** r
87e0: 65 73 75 6c 74 20 73 65 74 2e 20 20 41 66 74 65  esult set.  Afte
87f0: 72 20 65 61 63 68 20 52 2c 20 74 68 65 72 65 20  r each R, there 
8800: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8810: 4e 2c 20 49 2c 20 46 2c 20 42 2c 20 6f 72 20 54  N, I, F, B, or T
8820: 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 6f 6e   segments,.** on
8830: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
8840: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
8850: 73 65 74 2e 20 20 53 65 67 6d 65 6e 74 73 20 61  set.  Segments a
8860: 72 65 20 63 6f 6e 63 61 74 65 6e 74 61 74 65 64  re concatentated
8870: 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 77 69 74   directly.** wit
8880: 68 20 6e 6f 20 64 65 6c 69 6d 69 74 65 72 73 20  h no delimiters 
8890: 6f 66 20 61 6e 79 20 6b 69 6e 64 2e 0a 2a 2f 0a  of any kind..*/.
88a0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 61 33  static void sha3
88b0: 51 75 65 72 79 46 75 6e 63 28 0a 20 20 73 71 6c  QueryFunc(.  sql
88c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
88d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
88e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
88f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
8900: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
8910: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8920: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
8930: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8940: 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
8950: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8960: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
8970: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8980: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
8990: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
89a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
89b0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
89c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
89d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a00: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   */.  int rc;.  
8a10: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
8a20: 68 61 72 20 2a 7a 3b 0a 20 20 53 48 41 33 43 6f  har *z;.  SHA3Co
8a30: 6e 74 65 78 74 20 63 78 3b 0a 20 20 69 6e 74 20  ntext cx;.  int 
8a40: 69 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 61 72  iSize;..  if( ar
8a50: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 69 53 69  gc==1 ){.    iSi
8a60: 7a 65 20 3d 20 32 35 36 3b 0a 20 20 7d 65 6c 73  ze = 256;.  }els
8a70: 65 7b 0a 20 20 20 20 69 53 69 7a 65 20 3d 20 73  e{.    iSize = s
8a80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
8a90: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
8aa0: 66 28 20 69 53 69 7a 65 21 3d 32 32 34 20 26 26  f( iSize!=224 &&
8ab0: 20 69 53 69 7a 65 21 3d 32 35 36 20 26 26 20 69   iSize!=256 && i
8ac0: 53 69 7a 65 21 3d 33 38 34 20 26 26 20 69 53 69  Size!=384 && iSi
8ad0: 7a 65 21 3d 35 31 32 20 29 7b 0a 20 20 20 20 20  ze!=512 ){.     
8ae0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8af0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8b00: 53 48 41 33 20 73 69 7a 65 20 73 68 6f 75 6c 64  SHA3 size should
8b10: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 32 32 34 20   be one of: 224 
8b20: 32 35 36 20 22 0a 20 20 20 20 20 20 20 20 20 20  256 ".          
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 20 20 20 22 33 38 34 20 35            "384 5
8b50: 31 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  12", -1);.      
8b60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8b70: 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  }.  if( zSql==0 
8b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 53 48 41 33  ) return;.  SHA3
8b90: 49 6e 69 74 28 26 63 78 2c 20 69 53 69 7a 65 29  Init(&cx, iSize)
8ba0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ;.  while( zSql[
8bb0: 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
8bc0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
8bd0: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
8be0: 26 70 53 74 6d 74 2c 20 26 7a 53 71 6c 29 3b 0a  &pStmt, &zSql);.
8bf0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8c00: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
8c10: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8c20: 28 22 65 72 72 6f 72 20 53 51 4c 20 73 74 61 74  ("error SQL stat
8c30: 65 6d 65 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c  ement [%s]: %s",
8c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65      zSql, sqlite
8c70: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
8c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8c90: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8cb0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8cc0: 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  , zMsg, -1);.   
8cd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8ce0: 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74  zMsg);.      ret
8cf0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
8d00: 66 28 20 21 73 71 6c 69 74 65 33 5f 73 74 6d 74  f( !sqlite3_stmt
8d10: 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29  _readonly(pStmt)
8d20: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8d30: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
8d40: 70 72 69 6e 74 66 28 22 6e 6f 6e 2d 71 75 65 72  printf("non-quer
8d50: 79 3a 20 5b 25 73 5d 22 2c 20 73 71 6c 69 74 65  y: [%s]", sqlite
8d60: 33 5f 73 71 6c 28 70 53 74 6d 74 29 29 3b 0a 20  3_sql(pStmt));. 
8d70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8d80: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8d90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8da0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8db0: 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  , zMsg, -1);.   
8dc0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8dd0: 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74  zMsg);.      ret
8de0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  urn;.    }.    n
8df0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
8e00: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
8e10: 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
8e20: 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
8e30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
8e40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8e50: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8e60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8e70: 20 20 7d 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74    }.    n = (int
8e80: 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20  )strlen(z);.    
8e90: 68 61 73 68 5f 73 74 65 70 5f 76 66 6f 72 6d 61  hash_step_vforma
8ea0: 74 28 26 63 78 2c 22 53 25 64 3a 22 2c 6e 29 3b  t(&cx,"S%d:",n);
8eb0: 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28  .    SHA3Update(
8ec0: 26 63 78 2c 28 75 6e 73 69 67 6e 65 64 20 63 68  &cx,(unsigned ch
8ed0: 61 72 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20 20 2f  ar*)z,n);..    /
8ee0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68  * Compute a hash
8ef0: 20 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c 74   over the result
8f00: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
8f10: 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
8f20: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
8f30: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
8f40: 20 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28       SHA3Update(
8f50: 26 63 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69 67  &cx,(const unsig
8f60: 6e 65 64 20 63 68 61 72 2a 29 22 52 22 2c 31 29  ned char*)"R",1)
8f70: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
8f80: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
8f90: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
8fa0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
8fb0: 70 65 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a 20  pe(pStmt,i) ){. 
8fc0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
8fd0: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
8fe0: 20 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64           SHA3Upd
8ff0: 61 74 65 28 26 63 78 2c 20 28 63 6f 6e 73 74 20  ate(&cx, (const 
9000: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22  unsigned char*)"
9010: 4e 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  N",1);.         
9020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9040: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
9050: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
9060: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
9070: 34 20 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4 u;.           
9080: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
9090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
90a0: 72 20 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20  r x[9];.        
90b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
90c0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
90d0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
90e0: 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,i);.           
90f0: 20 6d 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20   memcpy(&u, &v, 
9100: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  8);.            
9110: 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a  for(j=8; j>=1; j
9120: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
9130: 20 20 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78     x[j] = u & 0x
9140: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
9150: 20 20 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20    u >>= 8;.     
9160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9170: 20 20 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b       x[0] = 'I';
9180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41  .            SHA
9190: 33 55 70 64 61 74 65 28 26 63 78 2c 20 78 2c 20  3Update(&cx, x, 
91a0: 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  9);.            
91b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
91c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
91d0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
91e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
91f0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a  lite3_uint64 u;.
9200: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
9210: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  j;.            u
9220: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 39  nsigned char x[9
9230: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ];.            d
9240: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
9250: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
9260: 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20  pStmt,i);.      
9270: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c        memcpy(&u,
9280: 20 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20   &r, 8);.       
9290: 20 20 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e       for(j=8; j>
92a0: 3d 31 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; j--){.      
92b0: 20 20 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75          x[j] = u
92c0: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20   & 0xff;.       
92d0: 20 20 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a         u >>= 8;.
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
92f0: 20 20 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d            x[0] =
9300: 20 27 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'F';.          
9310: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
9320: 2c 78 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20  ,x,9);.         
9330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9350: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
9360: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
9370: 69 6e 74 20 6e 32 20 3d 20 73 71 6c 69 74 65 33  int n2 = sqlite3
9380: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
9390: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
93a0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
93b0: 6e 65 64 20 63 68 61 72 20 2a 7a 32 20 3d 20 73  ned char *z2 = s
93c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
93d0: 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  xt(pStmt, i);.  
93e0: 20 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73            hash_s
93f0: 74 65 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c  tep_vformat(&cx,
9400: 22 54 25 64 3a 22 2c 6e 32 29 3b 0a 20 20 20 20  "T%d:",n2);.    
9410: 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61          SHA3Upda
9420: 74 65 28 26 63 78 2c 20 7a 32 2c 20 6e 32 29 3b  te(&cx, z2, n2);
9430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9440: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9450: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
9460: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
9470: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32            int n2
9480: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9490: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
94a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
94b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
94c0: 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33  ar *z2 = sqlite3
94d0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
94e0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
94f0: 20 20 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66      hash_step_vf
9500: 6f 72 6d 61 74 28 26 63 78 2c 22 42 25 64 3a 22  ormat(&cx,"B%d:"
9510: 2c 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,n2);.          
9520: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
9530: 2c 20 7a 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20  , z2, n2);.     
9540: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9560: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9570: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
9580: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
9590: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
95a0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
95b0: 2c 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29  , SHA3Final(&cx)
95c0: 2c 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54  , iSize/8, SQLIT
95d0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
95e0: 2f 2a 20 45 6e 64 20 6f 66 20 53 48 41 33 20 68  /* End of SHA3 h
95f0: 61 73 68 69 6e 67 20 6c 6f 67 69 63 20 63 6f 70  ashing logic cop
9600: 79 2f 70 61 73 74 65 64 20 66 72 6f 6d 20 2e 2e  y/pasted from ..
9610: 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61 74 68 72  /ext/misc/shathr
9620: 65 65 2e 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ee.c.***********
9630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9670: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
9680: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9690: 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
96a0: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
96b0: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
96c0: 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f 0a  open session.*/.
96d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4f  typedef struct O
96e0: 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e 53  penSession OpenS
96f0: 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20 4f  ession;.struct O
9700: 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20 63  penSession {.  c
9710: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
9720: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
9730: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  lic name for thi
9740: 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  s session */.  i
9750: 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20 20  nt nFilter;     
9760: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9770: 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  r of xFilter rej
9780: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
9790: 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  erns */.  char *
97a0: 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20 20  *azFilter;      
97b0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 78     /* Array of x
97c0: 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e  Filter rejection
97d0: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a   GLOB patterns *
97e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  /.  sqlite3_sess
97f0: 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a 20  ion *p;      /* 
9800: 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  The open session
9810: 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f   */.};.#endif../
9820: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
9830: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
9840: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
9850: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a 2a  .explain on",.**
9860: 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20 69   saved so that i
9870: 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  t can be restore
9880: 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20 6f  d by ".explain o
9890: 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ff".*/.typedef s
98a0: 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49  truct SavedModeI
98b0: 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e 66  nfo SavedModeInf
98c0: 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64 4d  o;.struct SavedM
98d0: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  odeInfo {.  int 
98e0: 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  valid;          
98f0: 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69  /* Is there legi
9900: 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20  t data in here? 
9910: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
9930: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
9940: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
9950: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
9960: 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65 72   /* The ".header
9970: 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72 20  " setting prior 
9980: 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  to ".explain on"
9990: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64   */.  int colWid
99a0: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f 6c  th[100];  /* Col
99b0: 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f 72  umn widths prior
99c0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
99d0: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  " */.};../*.** S
99e0: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
99f0: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
9a00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
9a10: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
9a20: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
9a30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
9a40: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
9a50: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
9a60: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
9a70: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
9a80: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
9a90: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
9aa0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
9ab0: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45 78 70  */.  int autoExp
9ac0: 6c 61 69 6e 3b 20 20 20 20 20 20 20 2f 2a 20 41  lain;       /* A
9ad0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
9ae0: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
9af0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  de */.  int auto
9b00: 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 2f  EQP;           /
9b10: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
9b20: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
9b30: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
9b40: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 73 4f   */.  int statsO
9b50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
9b60: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
9b70: 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66  memory stats bef
9b80: 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a  ore each finaliz
9b90: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 63 61 6e 73  e */.  int scans
9ba0: 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 2f 2a  tatsOn;       /*
9bb0: 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79   True to display
9bc0: 20 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f   scan stats befo
9bd0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
9be0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43 6f 75   */.  int outCou
9bf0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
9c00: 52 65 76 65 72 74 20 74 6f 20 73 74 64 6f 75 74  Revert to stdout
9c10: 20 77 68 65 6e 20 72 65 61 63 68 69 6e 67 20 7a   when reaching z
9c20: 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ero */.  int cnt
9c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
9c50: 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20 73  ords displayed s
9c60: 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20  o far */.  FILE 
9c70: 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  *out;           
9c80: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
9c90: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 46 49 4c  ts here */.  FIL
9ca0: 45 20 2a 74 72 61 63 65 4f 75 74 3b 20 20 20 20  E *traceOut;    
9cb0: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6f      /* Output fo
9cc0: 72 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  r sqlite3_trace(
9cd0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  ) */.  int nErr;
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
9d00: 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
9d10: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
9d20: 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74 20     /* An output 
9d30: 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f 0a  mode setting */.
9d40: 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20    int cMode;    
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70           /* temp
9d60: 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64  orary output mod
9d70: 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  e for the curren
9d80: 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  t query */.  int
9d90: 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20   normalMode;    
9da0: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f      /* Output mo
9db0: 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c  de before ".expl
9dc0: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
9dd0: 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b   writableSchema;
9de0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50      /* True if P
9df0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
9e00: 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e  chema=ON */.  in
9e10: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
9e20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
9e30: 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  show column name
9e40: 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c  s in List or Col
9e50: 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e  umn mode */.  in
9e60: 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20  t nCheck;       
9e70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9e80: 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61  f ".check" comma
9e90: 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73  nds run */.  uns
9ea0: 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b  igned shellFlgs;
9eb0: 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
9ec0: 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lags */.  char *
9ed0: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
9ee0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
9ef0: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
9f00: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
9f10: 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74 63 61  /.  char zTestca
9f20: 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20 4e 61  se[30];    /* Na
9f30: 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  me of current te
9f40: 73 74 20 63 61 73 65 20 2a 2f 0a 20 20 63 68 61  st case */.  cha
9f50: 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 32  r colSeparator[2
9f60: 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65  0]; /* Column se
9f70: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
9f80: 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20 6d 6f  r for several mo
9f90: 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f  des */.  char ro
9fa0: 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20  wSeparator[20]; 
9fb0: 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74 6f 72  /* Row separator
9fc0: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 4d   character for M
9fd0: 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20 20 69  ODE_Ascii */.  i
9fe0: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
9ff0: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
a000: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
a010: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
a020: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
a030: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
a040: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
a050: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
a060: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
a070: 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20  nullValue[20];  
a080: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
a090: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
a0a0: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
a0b0: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
a0d0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
a0e0: 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49   char outfile[FI
a0f0: 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20  LENAME_MAX]; /* 
a100: 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75  Filename for *ou
a110: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
a120: 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20  r *zDbFilename; 
a130: 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
a140: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
a150: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65  */.  char *zFree
a160: 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20  OnClose;        
a170: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20   /* Filename to 
a180: 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e  free when closin
a190: 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
a1a0: 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20  r *zVfs;        
a1b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
a1c0: 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71  S to use */.  sq
a1d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
a1e0: 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  t;   /* Current 
a1f0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79  statement if any
a200: 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f  . */.  FILE *pLo
a210: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
a220: 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75   Write log outpu
a230: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
a240: 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20  *aiIndent;      
a250: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69     /* Array of i
a260: 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d  ndents used in M
a270: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20  ODE_Explain */. 
a280: 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20   int nIndent;   
a290: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a2a0: 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e  of array aiInden
a2b0: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  t[] */.  int iIn
a2c0: 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  dent;           
a2d0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72  /* Index of curr
a2e0: 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65  ent op in aiInde
a2f0: 6e 74 5b 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69  nt[] */.#if defi
a300: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
a310: 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74  E_SESSION).  int
a320: 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20   nSession;      
a330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a340: 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73 69   of active sessi
a350: 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73  ons */.  OpenSes
a360: 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d  sion aSession[4]
a370: 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73  ;  /* Array of s
a380: 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73  essions.  [0] is
a390: 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65   in focus. */.#e
a3a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
a3b0: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
a3c0: 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73 20 76  owed shellFlgs v
a3d0: 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  alues.*/.#define
a3e0: 20 53 48 46 4c 47 5f 53 63 72 61 74 63 68 20 20   SHFLG_Scratch  
a3f0: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31        0x00000001
a400: 20 2f 2a 20 54 68 65 20 2d 2d 73 63 72 61 74 63   /* The --scratc
a410: 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  h option is used
a420: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
a430: 47 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20  G_Pagecache     
a440: 20 30 78 30 30 30 30 30 30 30 32 20 2f 2a 20 54   0x00000002 /* T
a450: 68 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f  he --pagecache o
a460: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
a470: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c  .#define SHFLG_L
a480: 6f 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78  ookaside      0x
a490: 30 30 30 30 30 30 30 34 20 2f 2a 20 4c 6f 6f 6b  00000004 /* Look
a4a0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
a4b0: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
a4c0: 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20  SHFLG_Backslash 
a4d0: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 38 20       0x00000008 
a4e0: 2f 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61  /* The --backsla
a4f0: 73 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  sh option is use
a500: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
a510: 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
a520: 20 20 30 78 30 30 30 30 30 30 31 30 20 2f 2a 20    0x00000010 /* 
a530: 2e 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20  .dump preserves 
a540: 72 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a  rowid values */.
a550: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f  #define SHFLG_Co
a560: 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30  untChanges   0x0
a570: 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e  0000020 /* .chan
a580: 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23  ges setting */.#
a590: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68  define SHFLG_Ech
a5a0: 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  o           0x00
a5b0: 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20  000040 /* .echo 
a5c0: 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e  or --echo settin
a5d0: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g */../*.** Macr
a5e0: 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  os for testing a
a5f0: 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c  nd setting shell
a600: 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  Flgs.*/.#define 
a610: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58  ShellHasFlag(P,X
a620: 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c  )    (((P)->shel
a630: 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29  lFlgs & (X))!=0)
a640: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65  .#define ShellSe
a650: 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28  tFlag(P,X)    ((
a660: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28  P)->shellFlgs|=(
a670: 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  X)).#define Shel
a680: 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20  lClearFlag(P,X) 
a690: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
a6a0: 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a  &=(~(X)))../*.**
a6b0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
a6c0: 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f  llowed modes..*/
a6d0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
a6e0: 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65  ne     0  /* One
a6f0: 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65   column per line
a700: 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65  .  Blank line be
a710: 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f  tween records */
a720: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f  .#define MODE_Co
a730: 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65  lumn   1  /* One
a740: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
a750: 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73   in neat columns
a760: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
a770: 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20  _List     2  /* 
a780: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
a790: 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72  ine with a separ
a7a0: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
a7b0: 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20  MODE_Semi     3 
a7c0: 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45   /* Same as MODE
a7d0: 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64  _List but append
a7e0: 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e   ";" to each lin
a7f0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  e */.#define MOD
a800: 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a  E_Html     4  /*
a810: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54   Generate an XHT
a820: 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  ML table */.#def
a830: 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  ine MODE_Insert 
a840: 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    5  /* Generate
a850: 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74   SQL "insert" st
a860: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  atements */.#def
a870: 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20  ine MODE_Quote  
a880: 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61    6  /* Quote va
a890: 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20  lues as for SQL 
a8a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
a8b0: 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47  Tcl      7  /* G
a8c0: 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f  enerate ANSI-C o
a8d0: 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65  r TCL quoted ele
a8e0: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
a8f0: 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38   MODE_Csv      8
a900: 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e    /* Quote strin
a910: 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  gs, numbers are 
a920: 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  plain */.#define
a930: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39   MODE_Explain  9
a940: 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43    /* Like MODE_C
a950: 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f  olumn, but do no
a960: 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20  t truncate data 
a970: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
a980: 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55  Ascii   10  /* U
a990: 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e  se ASCII unit an
a9a0: 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74  d record separat
a9b0: 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20  ors (0x1F/0x1E) 
a9c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
a9d0: 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50  Pretty  11  /* P
a9e0: 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65  retty-print sche
a9f0: 6d 61 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  mas */..static c
aa00: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44  onst char *modeD
aa10: 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69  escr[] = {.  "li
aa20: 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c  ne",.  "column",
aa30: 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65  .  "list",.  "se
aa40: 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20  mi",.  "html",. 
aa50: 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75   "insert",.  "qu
aa60: 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20  ote",.  "tcl",. 
aa70: 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61   "csv",.  "expla
aa80: 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a  in",.  "ascii",.
aa90: 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c    "prettyprint",
aaa0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .};../*.** These
aab0: 20 61 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f   are the column/
aac0: 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74  row/line separat
aad0: 6f 72 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ors used by the 
aae0: 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72  various.** impor
aaf0: 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a  t/export modes..
ab00: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43  */.#define SEP_C
ab10: 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65  olumn    "|".#de
ab20: 66 69 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20  fine SEP_Row    
ab30: 20 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20     "\n".#define 
ab40: 53 45 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c  SEP_Tab       "\
ab50: 74 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53  t".#define SEP_S
ab60: 70 61 63 65 20 20 20 20 20 22 20 22 0a 23 64 65  pace     " ".#de
ab70: 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20  fine SEP_Comma  
ab80: 20 20 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53     ",".#define S
ab90: 45 50 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72  EP_CrLf      "\r
aba0: 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  \n".#define SEP_
abb0: 55 6e 69 74 20 20 20 20 20 20 22 5c 78 31 46 22  Unit      "\x1F"
abc0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63  .#define SEP_Rec
abd0: 6f 72 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f  ord    "\x1E"../
abe0: 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65  *.** Number of e
abf0: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72  lements in an ar
ac00: 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  ray.*/.#define A
ac10: 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69 6e  rraySize(X)  (in
ac20: 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a  t)(sizeof(X)/siz
ac30: 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a  eof(X[0]))../*.*
ac40: 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  * A callback for
ac50: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67   the sqlite3_log
ac60: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
ac70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
ac80: 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67  llLog(void *pArg
ac90: 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20  , int iErrCode, 
aca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
acb0: 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  ){.  ShellState 
acc0: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
acd0: 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d  *)pArg;.  if( p-
ace0: 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72  >pLog==0 ) retur
acf0: 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  n;.  utf8_printf
ad00: 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20  (p->pLog, "(%d) 
ad10: 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c  %s\n", iErrCode,
ad20: 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73 68   zMsg);.  fflush
ad30: 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a  (p->pLog);.}../*
ad40: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
ad50: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
ad60: 20 68 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f   hex-encoded blo
ad70: 62 20 28 65 67 2e 20 58 27 31 32 33 34 27 20 29  b (eg. X'1234' )
ad80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ad90: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
ada0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
adb0: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e   void *pBlob, in
adc0: 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20  t nBlob){.  int 
add0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62  i;.  char *zBlob
ade0: 20 3d 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62   = (char *)pBlob
adf0: 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  ;.  raw_printf(o
ae00: 75 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28  ut,"X'");.  for(
ae10: 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b  i=0; i<nBlob; i+
ae20: 2b 29 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  +){ raw_printf(o
ae30: 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b  ut,"%02x",zBlob[
ae40: 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61  i]&0xff); }.  ra
ae50: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22  w_printf(out,"'"
ae60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  );.}../*.** Find
ae70: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
ae80: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77  s not found anyw
ae90: 68 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65  here in z[].  Re
aea0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
aeb0: 2a 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67  * to that string
aec0: 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75  ..**.** Try to u
aed0: 73 65 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72  se zA and zB fir
aee0: 73 74 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20  st.  If both of 
aef0: 74 68 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64  those are alread
af00: 79 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a  y found in z[].*
af10: 2a 20 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73  * then make up s
af20: 6f 6d 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73  ome string and s
af30: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 62  tore it in the b
af40: 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
af50: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
af60: 20 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28   *unused_string(
af70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
af80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
af90: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d       /* Result m
afa0: 75 73 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61  ust not appear a
afb0: 6e 79 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a  nywhere in z */.
afc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
afd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  , const char *zB
afe0: 2c 20 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65  ,   /* Try these
aff0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72   first */.  char
b000: 20 2a 7a 42 75 66 20 20 20 20 20 20 20 20 20 20   *zBuf          
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b020: 20 53 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   Space to store 
b030: 61 20 67 65 6e 65 72 61 74 65 64 20 73 74 72 69  a generated stri
b040: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ng */.){.  unsig
b050: 6e 65 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28  ned i = 0;.  if(
b060: 20 73 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d   strstr(z, zA)==
b070: 30 20 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20  0 ) return zA;. 
b080: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
b090: 42 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  B)==0 ) return z
b0a0: 42 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  B;.  do{.    sql
b0b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
b0c0: 2c 7a 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20  ,zBuf,"(%s%u)", 
b0d0: 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69  zA, i++);.  }whi
b0e0: 6c 65 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75  le( strstr(z,zBu
b0f0: 66 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  f)!=0 );.  retur
b100: 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zBuf;.}../*.**
b110: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
b120: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
b130: 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e  oted string usin
b140: 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f  g SQL quoting co
b150: 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  nventions..**.**
b160: 20 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75   See also: outpu
b170: 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64  t_quoted_escaped
b180: 5f 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61  _string().*/.sta
b190: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
b1a0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49  quoted_string(FI
b1b0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
b1c0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
b1d0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
b1e0: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
b1f0: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
b200: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
b210: 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d   c!='\''; i++){}
b220: 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
b230: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
b240: 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20  ut,"'%s'",z);.  
b250: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
b260: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
b270: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
b280: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
b290: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
b2a0: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
b2b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
b2c0: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
b2d0: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
b2e0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b2f0: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
b300: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
b310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b320: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
b330: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
b340: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
b350: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b370: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
b380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b390: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
b3a0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
b3b0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20  out, "'");.  }. 
b3c0: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74   setTextMode(out
b3d0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  , 1);.}../*.** O
b3e0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
b3f0: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
b400: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
b410: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
b420: 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69  entions..** Addi
b430: 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61  tionallly , esca
b440: 70 65 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20  pe the "\n" and 
b450: 22 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 20  "\r" characters 
b460: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
b470: 6e 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75  not.** get corru
b480: 70 74 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c  pted by end-of-l
b490: 69 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ine translation 
b4a0: 66 61 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f  facilities in so
b4b0: 6d 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20  me operating.** 
b4c0: 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  systems..**.** T
b4d0: 68 69 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70  his is like outp
b4e0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
b4f0: 28 29 20 62 75 74 20 77 69 74 68 20 74 68 65 20  () but with the 
b500: 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
b510: 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d  \r\n.** escape m
b520: 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61  echanism..*/.sta
b530: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
b540: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
b550: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
b560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
b570: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b580: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
b590: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
b5a0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
b5b0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
b5c0: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
b5d0: 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\r'; i++){}. 
b5e0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
b5f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
b600: 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65  ,"'%s'",z);.  }e
b610: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
b620: 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20  har *zNL = 0;.  
b630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b640: 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  R = 0;.    int n
b650: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  NL = 0;.    int 
b660: 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  nCR = 0;.    cha
b670: 72 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75  r zBuf1[20], zBu
b680: 66 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28  f2[20];.    for(
b690: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
b6a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  .      if( z[i]=
b6b0: 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20  ='\n' ) nNL++;. 
b6c0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
b6d0: 5c 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20  \r' ) nCR++;.   
b6e0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29   }.    if( nNL )
b6f0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
b700: 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65  tf(out, "replace
b710: 28 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d  (");.      zNL =
b720: 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a   unused_string(z
b730: 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22  , "\\n", "\\012"
b740: 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a  , zBuf1);.    }.
b750: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
b760: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b770: 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29  out, "replace(")
b780: 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e  ;.      zCR = un
b790: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
b7a0: 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a  \\r", "\\015", z
b7b0: 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf2);.    }.   
b7c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
b7d0: 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65   "'");.    while
b7e0: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
b7f0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
b800: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
b810: 26 26 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21  && c!='\r' && c!
b820: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
b830: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
b840: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
b850: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
b860: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
b870: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
b880: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
b890: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b8a0: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
b8b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
b8c0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
b8d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b8e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
b8f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
b900: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b910: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    z++;.      if(
b920: 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20   c=='\n' ){.    
b930: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
b940: 75 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a  ut, "%s", zNL);.
b950: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b970: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
b980: 22 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20  "%s", zCR);.    
b990: 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
b9a0: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
b9b0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
b9c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
b9d0: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29   ",'%s',char(13)
b9e0: 29 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a  )", zCR);.    }.
b9f0: 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20      if( nNL ){. 
ba00: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ba10: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
ba20: 28 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20  (10))", zNL);.  
ba30: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78    }.  }.  setTex
ba40: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
ba50: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
ba60: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
ba70: 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f  as a quoted acco
ba80: 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43  rding to C or TC
ba90: 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e  L quoting rules.
baa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bab0: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
bac0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
bad0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73   char *z){.  uns
bae0: 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66  igned int c;.  f
baf0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
bb00: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28    while( (c = *(
bb10: 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  z++))!=0 ){.    
bb20: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
bb30: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
bb40: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
bb50: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  c, out);.    }el
bb60: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
bb70: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
bb80: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
bb90: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
bba0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
bbb0: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\t' ){.      f
bbc0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
bbd0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27  .      fputc('t'
bbe0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
bbf0: 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b  e if( c=='\n' ){
bc00: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
bc10: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
bc20: 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a  putc('n', out);.
bc30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
bc40: 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\r' ){.      f
bc50: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
bc60: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27  .      fputc('r'
bc70: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
bc80: 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63  e if( !isprint(c
bc90: 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20  &0xff) ){.      
bca0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
bcb0: 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66  "\\%03o", c&0xff
bcc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bcd0: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
bce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
bcf0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
bd10: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
bd20: 20 77 69 74 68 20 63 68 61 72 61 63 74 65 72 73   with characters
bd30: 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 61   that are specia
bd40: 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63  l to.** HTML esc
bd50: 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aped..*/.static 
bd60: 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c  void output_html
bd70: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
bd80: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
bd90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
bda0: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
bdb0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a  .  while( *z ){.
bdc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a      for(i=0;   z
bdd0: 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [i].            
bde0: 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20  && z[i]!='<'.   
bdf0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
be00: 21 3d 27 26 27 0a 20 20 20 20 20 20 20 20 20 20  !='&'.          
be10: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20    && z[i]!='>'. 
be20: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
be30: 69 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20  i]!='\"'.       
be40: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
be50: 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29  '';.        i++)
be60: 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  {}.    if( i>0 )
be70: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
be80: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
be90: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
bea0: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
beb0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
bec0: 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20  (out,"&lt;");.  
bed0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
bee0: 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72  =='&' ){.      r
bef0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
bf00: 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  amp;");.    }els
bf10: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20  e if( z[i]=='>' 
bf20: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
bf30: 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b  ntf(out,"&gt;");
bf40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
bf50: 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20  [i]=='\"' ){.   
bf60: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
bf70: 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20  t,"&quot;");.   
bf80: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
bf90: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\'' ){.      r
bfa0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
bfb0: 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  #39;");.    }els
bfc0: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
bfd0: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69      }.    z += i
bfe0: 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   + 1;.  }.}../*.
bff0: 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f  ** If a field co
c000: 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
c010: 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  cter identified 
c020: 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f  by a 1 in the fo
c030: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79  llowing.** array
c040: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  , then the strin
c050: 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64  g must be quoted
c060: 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61   for CSV..*/.sta
c070: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
c080: 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20  eedCsvQuote[] = 
c090: 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  {.  1, 1, 1, 1, 
c0a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
c0b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c0c0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
c0d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c0e0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
c0f0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30   1, 1, 1,.  1, 0
c100: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
c110: 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   1,   0, 0, 0, 0
c120: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
c130: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
c140: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
c150: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
c160: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
c170: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
c180: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
c190: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
c1a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
c1b0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
c1c0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
c1d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
c1e0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
c1f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
c200: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
c210: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
c220: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31  0, 0, 0, 0, 0, 1
c230: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
c240: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
c250: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c260: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
c270: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c280: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
c290: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
c2a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
c2b0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
c2c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
c2d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
c2e0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
c2f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
c300: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
c310: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
c320: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c330: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
c340: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
c350: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
c360: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
c370: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
c380: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
c390: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
c3a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
c3b0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
c3c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
c3d0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  ,.};../*.** Outp
c3e0: 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  ut a single term
c3f0: 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c   of CSV.  Actual
c400: 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  ly, p->colSepara
c410: 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a  tor is used for.
c420: 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f 72  ** the separator
c430: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
c440: 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d  ay not be a comm
c450: 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  a.  p->nullValue
c460: 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20   is.** the null 
c470: 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20  value.  Strings 
c480: 61 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65  are quoted if ne
c490: 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 73 65  cessary.  The se
c4a0: 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e  parator.** is on
c4b0: 6c 79 20 69 73 73 75 65 64 20 69 66 20 62 53 65  ly issued if bSe
c4c0: 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  p is true..*/.st
c4d0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
c4e0: 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20  _csv(ShellState 
c4f0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
c500: 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20  z, int bSep){.  
c510: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f  FILE *out = p->o
c520: 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ut;.  if( z==0 )
c530: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
c540: 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75  f(out,"%s",p->nu
c550: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73  llValue);.  }els
c560: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
c570: 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72    int nSep = str
c580: 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61  len30(p->colSepa
c590: 72 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  rator);.    for(
c5a0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
c5b0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43  .      if( needC
c5c0: 73 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e  svQuote[((unsign
c5d0: 65 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a  ed char*)z)[i]].
c5e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69           || (z[i
c5f0: 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ]==p->colSeparat
c600: 6f 72 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20  or[0] &&.       
c610: 20 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c        (nSep==1 |
c620: 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63  | memcmp(z, p->c
c630: 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65  olSeparator, nSe
c640: 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20  p)==0)) ){.     
c650: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
c660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
c680: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ==0 ){.      put
c690: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
c6a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
c6b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c6c0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29 20  if( z[i]=='"' ) 
c6d0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
c6e0: 20 20 20 20 20 20 20 20 70 75 74 63 28 7a 5b 69          putc(z[i
c6f0: 5d 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  ], out);.      }
c700: 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27 2c  .      putc('"',
c710: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
c720: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
c730: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
c740: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
c750: 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75  f( bSep ){.    u
c760: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c770: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
c780: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
c790: 0a 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  ..#ifdef SIGINT.
c7a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c7b0: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
c7c0: 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74   user presses Ct
c7d0: 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rl-C.*/.static v
c7e0: 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61  oid interrupt_ha
c7f0: 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65  ndler(int NotUse
c800: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
c810: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
c820: 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  .  seenInterrupt
c830: 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e  ++;.  if( seenIn
c840: 74 65 72 72 75 70 74 3e 32 20 29 20 65 78 69 74  terrupt>2 ) exit
c850: 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61  (1);.  if( globa
c860: 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e  lDb ) sqlite3_in
c870: 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62  terrupt(globalDb
c880: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
c890: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c8a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
c8b0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e  *.** When the ".
c8c0: 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c  auth ON" is set,
c8d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
c8e0: 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61  uthorizer callba
c8f0: 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ck is.** invoked
c900: 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
c910: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
c920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
c930: 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20  ellAuth(.  void 
c940: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  *pClientData,.  
c950: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
c960: 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e  char *zA1,.  con
c970: 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20  st char *zA2,.  
c980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c  const char *zA3,
c990: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c9a0: 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  A4.){.  ShellSta
c9b0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
c9c0: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
c9d0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
c9e0: 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b   char *azAction[
c9f0: 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43  ] = { 0,.     "C
ca00: 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20  REATE_INDEX",   
ca10: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 41        "CREATE_TA
ca20: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22 43  BLE",         "C
ca30: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
ca40: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
ca50: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
ca60: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  "CREATE_TEMP_TRI
ca70: 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f  GGER",  "CREATE_
ca80: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
ca90: 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45 52   "CREATE_TRIGGER
caa0: 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ",       "CREATE
cab0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
cac0: 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20   "DELETE",.     
cad0: 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20  "DROP_INDEX",   
cae0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41          "DROP_TA
caf0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  BLE",           
cb00: 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  "DROP_TEMP_INDEX
cb10: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",.     "DROP_TE
cb20: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  MP_TABLE",      
cb30: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  "DROP_TEMP_TRIGG
cb40: 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45  ER",    "DROP_TE
cb50: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
cb60: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20  DROP_TRIGGER",  
cb70: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45         "DROP_VIE
cb80: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  W",            "
cb90: 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50  INSERT",.     "P
cba0: 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20  RAGMA",         
cbb0: 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20 20        "READ",   
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
cbd0: 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52  ELECT",.     "TR
cbe0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20  ANSACTION",     
cbf0: 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 20       "UPDATE",  
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 54               "AT
cc10: 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54  TACH",.     "DET
cc20: 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACH",           
cc30: 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45      "ALTER_TABLE
cc40: 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45 49  ",          "REI
cc50: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41  NDEX",.     "ANA
cc60: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
cc70: 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41 42      "CREATE_VTAB
cc80: 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f  LE",        "DRO
cc90: 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20  P_VTABLE",.     
cca0: 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20  "FUNCTION",     
ccb0: 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49          "SAVEPOI
ccc0: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
ccd0: 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b  "RECURSIVE".  };
cce0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
ccf0: 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20  t char *az[4];. 
cd00: 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20   az[0] = zA1;.  
cd10: 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61  az[1] = zA2;.  a
cd20: 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a  z[2] = zA3;.  az
cd30: 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66  [3] = zA4;.  utf
cd40: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cd50: 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73   "authorizer: %s
cd60: 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29  ", azAction[op])
cd70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34  ;.  for(i=0; i<4
cd80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f  ; i++){.    raw_
cd90: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cda0: 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b   ");.    if( az[
cdb0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i] ){.      outp
cdc0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
cdd0: 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ut, az[i]);.    
cde0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
cdf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ce00: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
ce10: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
ce20: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
ce30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ce40: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
ce50: 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d  ** Print a schem
ce60: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61  a statement.  Pa
ce70: 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20  rt of MODE_Semi 
ce80: 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20  and MODE_Pretty 
ce90: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
cea0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65  is routine conve
ceb0: 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20  rts some CREATE 
cec0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
ced0: 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c   for shadow tabl
cee0: 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f  es.** in FTS3/4/
cef0: 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41  5 into CREATE TA
cf00: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
cf10: 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  S statements..*/
cf20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
cf30: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c  ntSchemaLine(FIL
cf40: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
cf50: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
cf60: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28  r *zTail){.  if(
cf70: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
cf80: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b  ("CREATE TABLE [
cf90: 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  '\"]*", z)==0 ){
cfa0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
cfb0: 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54 41  (out, "CREATE TA
cfc0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
cfd0: 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a  S %s%s", z+13, z
cfe0: 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tail);.  }else{.
cff0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d000: 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20  out, "%s%s", z, 
d010: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74  zTail);.  }.}.st
d020: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
d030: 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20  chemaLineN(FILE 
d040: 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69  *out, char *z, i
d050: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
d060: 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72   *zTail){.  char
d070: 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e   c = z[n];.  z[n
d080: 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63  ] = 0;.  printSc
d090: 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c  hemaLine(out, z,
d0a0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20   zTail);.  z[n] 
d0b0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = c;.}../*.** Th
d0c0: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
d0d0: 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ck routine that 
d0e0: 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76  the shell.** inv
d0f0: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
d100: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
d110: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
d120: 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  nt shell_callbac
d130: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  k(.  void *pArg,
d140: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
d150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d160: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
d170: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
d180: 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  g,    /* Text of
d190: 20 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c   each result col
d1a0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  umn */.  char **
d1b0: 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  azCol,    /* Col
d1c0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d1d0: 6e 74 20 2a 61 69 54 79 70 65 20 20 20 20 20 20  nt *aiType      
d1e0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20  /* Column types 
d1f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
d200: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
d210: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
d220: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  rg;..  switch( p
d230: 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63  ->cMode ){.    c
d240: 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b  ase MODE_Line: {
d250: 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35  .      int w = 5
d260: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  ;.      if( azAr
d270: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
d280: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d290: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d2a0: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
d2b0: 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f  len30(azCol[i] ?
d2c0: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
d2d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
d2e0: 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20  >w ) w = len;.  
d2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d300: 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66  p->cnt++>0 ) utf
d310: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d320: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
d330: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66  arator);.      f
d340: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d350: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74  i++){.        ut
d360: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d370: 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77  ,"%*s = %s%s", w
d380: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20  , azCol[i],.    
d390: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
d3a0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
d3b0: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20  : p->nullValue, 
d3c0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
d3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d3f0: 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61   case MODE_Expla
d400: 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44  in:.    case MOD
d410: 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20  E_Column: {.    
d420: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
d430: 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68  nt aExplainWidth
d440: 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c  s[] = {4, 13, 4,
d450: 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33   4, 4, 13, 2, 13
d460: 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  };.      const i
d470: 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20  nt *colWidth;.  
d480: 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b      int showHdr;
d490: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77  .      char *row
d4a0: 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Sep;.      if( p
d4b0: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f  ->cMode==MODE_Co
d4c0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
d4d0: 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f  colWidth = p->co
d4e0: 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20  lWidth;.        
d4f0: 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f  showHdr = p->sho
d500: 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20  wHeader;.       
d510: 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77   rowSep = p->row
d520: 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20  Separator;.     
d530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d540: 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c  colWidth = aExpl
d550: 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20  ainWidths;.     
d560: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a     showHdr = 1;.
d570: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d580: 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20   SEP_Row;.      
d590: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  }.      if( p->c
d5a0: 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt++==0 ){.     
d5b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
d5c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
d5d0: 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20      int w, n;.  
d5e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d5f0: 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69  raySize(p->colWi
d600: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d610: 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68      w = colWidth
d620: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [i];.          }
d630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d640: 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    w = 0;.       
d650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d660: 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( w==0 ){.     
d670: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d680: 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  n30(azCol[i] ? a
d690: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
d6a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
d6b0: 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20 20  <10 ) w = 10;.  
d6c0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74            n = st
d6d0: 72 6c 65 6e 33 30 28 61 7a 41 72 67 20 26 26 20  rlen30(azArg && 
d6e0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
d6f0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
d700: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
d710: 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e   if( w<n ) w = n
d720: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d730: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d740: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
d750: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d760: 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c         p->actual
d770: 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20  Width[i] = w;.  
d780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d790: 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20      if( showHdr 
d7a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
d7b0: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
d7c0: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c  p->out, w, azCol
d7d0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
d7e0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d7f0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e  >out, "%s", i==n
d800: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
d810: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
d820: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
d830: 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64        if( showHd
d840: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  r ){.          f
d850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d860: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d870: 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20    int w;.       
d880: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
d890: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
d8a0: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d8b0: 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63         w = p->ac
d8c0: 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20  tualWidth[i];.  
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
d8e0: 20 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20   w<0 ) w = -w;. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
d900: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d910: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d930: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d940: 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22  ->out,"%-*.*s%s"
d950: 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20 20  ,w,w,.          
d960: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d           "------
d970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9a0: 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20  ----".          
d9b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d           "------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9f0: 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20  ----",.         
da00: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41             i==nA
da10: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
da20: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
da30: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
da40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
da50: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
da60: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
da70: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
da80: 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20        int w;.   
da90: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
daa0: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
dab0: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
dac0: 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c     w = p->actual
dad0: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
dae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
daf0: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
db00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
db10: 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  ( p->cMode==MODE
db20: 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72  _Explain && azAr
db30: 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 33 30  g[i] && strlen30
db40: 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a  (azArg[i])>w ){.
db50: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
db60: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
db70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db80: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20      if( i==1 && 
db90: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70  p->aiIndent && p
dba0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
dbb0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64       if( p->iInd
dbc0: 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29  ent<p->nIndent )
dbd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
dbe0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
dbf0: 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49  , "%*.s", p->aiI
dc00: 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74  ndent[p->iIndent
dc10: 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20  ], "");.        
dc20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
dc30: 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20  >iIndent++;.    
dc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
dc50: 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70  f8_width_print(p
dc60: 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b  ->out, w, azArg[
dc70: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
dc80: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
dc90: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
dca0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dcb0: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
dcc0: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
dcd0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dcf0: 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20   MODE_Semi: {   
dd00: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
dd10: 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75  fullschema outpu
dd20: 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74  t */.      print
dd30: 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
dd40: 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c  t, azArg[0], ";\
dd50: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
dd60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dd70: 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20   MODE_Pretty: { 
dd80: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
dd90: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68  .fullschema with
dda0: 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20   --indent */.   
ddb0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
ddc0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
ddd0: 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20  nt nParen = 0;. 
dde0: 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d       char cEnd =
ddf0: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
de00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e  ;.      int nLin
de10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  e = 0;.      ass
de20: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
de30: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b        if( azArg[
de40: 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0]==0 ) break;. 
de50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
de60: 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45  _strlike("CREATE
de70: 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30   VIEW%", azArg[0
de80: 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  ], 0)==0.       
de90: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
dea0: 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25  ke("CREATE TRIG%
deb0: 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d  ", azArg[0], 0)=
dec0: 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
ded0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
dee0: 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  p->out, "%s;\n",
def0: 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
df00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
df10: 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c   }.      z = sql
df20: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
df30: 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
df40: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
df50: 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63   for(i=0; IsSpac
df60: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
df70: 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d        for(; (c =
df80: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
df90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53  .        if( IsS
dfa0: 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
dfb0: 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65       if( IsSpace
dfc0: 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d  (z[j-1]) || z[j-
dfd0: 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e  1]=='(' ) contin
dfe0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ue;.        }els
dff0: 65 20 69 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c  e if( (c=='(' ||
e000: 20 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30 20   c==')') && j>0 
e010: 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31  && IsSpace(z[j-1
e020: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
e030: 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j--;.        }. 
e040: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
e050: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
e060: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49   while( j>0 && I
e070: 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29  sSpace(z[j-1]) )
e080: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a  { j--; }.      z
e090: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  [j] = 0;.      i
e0a0: 66 28 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d  f( strlen30(z)>=
e0b0: 37 39 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  79 ){.        fo
e0c0: 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b  r(i=j=0; (c = z[
e0d0: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
e0e0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
e0f0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
e100: 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20     cEnd = 0;.   
e110: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e120: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c   c=='"' || c=='\
e130: 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a  '' || c=='`' ){.
e140: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
e150: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
e160: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
e170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e180: 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20  cEnd = ']';.    
e190: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e1a0: 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  c=='(' ){.      
e1b0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a        nParen++;.
e1c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
e1d0: 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20  if( c==')' ){.  
e1e0: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
e1f0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
e200: 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e  if( nLine>0 && n
e210: 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20  Paren==0 && j>0 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
e230: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
e240: 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20  N(p->out, z, j, 
e250: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "\n");.         
e260: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
e270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e290: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
e2a0: 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e        if( nParen
e2b0: 3d 3d 31 20 26 26 20 28 63 3d 3d 27 28 27 20 7c  ==1 && (c=='(' |
e2c0: 7c 20 63 3d 3d 27 2c 27 20 7c 7c 20 63 3d 3d 27  | c==',' || c=='
e2d0: 5c 6e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  \n') ){.        
e2e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
e2f0: 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ) j--;.         
e300: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
e310: 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a  neN(p->out, z, j
e320: 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20  , "\n  ");.     
e330: 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20         j = 0;.  
e340: 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b            nLine+
e350: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  +;.            w
e360: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b  hile( IsSpace(z[
e370: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
e380: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
e3a0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  j] = 0;.      }.
e3b0: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
e3c0: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c  aLine(p->out, z,
e3d0: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73   ";\n");.      s
e3e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
e3f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e400: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e410: 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69  _List: {.      i
e420: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
e430: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
e440: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
e450: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e460: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e470: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e480: 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a  %s%s",azCol[i],.
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d    i==nArg-1 ? p-
e4b0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20  >rowSeparator : 
e4c0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e4d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e4e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e4f0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e500: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e510: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e520: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
e530: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
e540: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
e550: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20  p->nullValue;.  
e560: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e570: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e580: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
e590: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
e5a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e5b0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e5c0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e5d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e5f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e600: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e610: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e630: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e640: 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20  case MODE_Html: 
e650: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e660: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e670: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e680: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e690: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
e6a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e6b0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e6c0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e6d0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22  tf(p->out,"<TH>"
e6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
e6f0: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
e700: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
e710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
e720: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e730: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
e740: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
e750: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e760: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e770: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e780: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e790: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e7a0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e7b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e7c0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e7d0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e7e0: 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a  p->out,"<TD>");.
e7f0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e800: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
e810: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
e820: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
e830: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e840: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e850: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
e860: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
e870: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
e880: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
e890: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e8a0: 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20   case MODE_Tcl: 
e8b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e8c0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e8d0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e8e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e8f0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e900: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
e910: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f  ring(p->out,azCo
e920: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
e930: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
e940: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
e950: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e960: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
e970: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e980: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e990: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e9a0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e9b0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e9c0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
e9d0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e9e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e9f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ea00: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
ea10: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
ea20: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
ea30: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
ea40: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
ea50: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
ea60: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
ea70: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
ea80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
ea90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
eaa0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
eab0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
eac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ead0: 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b  case MODE_Csv: {
eae0: 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79  .      setBinary
eaf0: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
eb00: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
eb10: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
eb20: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
eb30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
eb40: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
eb50: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
eb60: 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  , azCol[i] ? azC
eb70: 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41  ol[i] : "", i<nA
eb80: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
eb90: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
eba0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ebb0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
ebc0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ebd0: 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b     if( nArg>0 ){
ebe0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
ebf0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
ec00: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
ec10: 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d  _csv(p, azArg[i]
ec20: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
ec30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
ec40: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
ec50: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
ec60: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
ec70: 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74   }.      setText
ec80: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
ec90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
eca0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
ecb0: 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20  E_Insert: {.    
ecc0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
ecd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74   break;.      ut
ece0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ecf0: 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73  ,"INSERT INTO %s
ed00: 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  ",p->zDestTable)
ed10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  ;.      if( p->s
ed20: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
ed30: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ed40: 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20  p->out,"(");.   
ed50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ed60: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
ed70: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ed80: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ed90: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
eda0: 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72     if( quoteChar
edb0: 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  (azCol[i]) ){.  
edc0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
edd0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
ede0: 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a  ntf("\"%w\"", az
edf0: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
ee00: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ee10: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ee20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ee30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
ee40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ee50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
ee60: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ee70: 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  "%s", azCol[i]);
ee80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ee90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
eea0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
eeb0: 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,")");.      }. 
eec0: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
eed0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
eee0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
eef0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ef00: 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22  ->out, i>0 ? ","
ef10: 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a   : " VALUES(");.
ef20: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
ef30: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
ef40: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ef50: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
ef60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ef70: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ef80: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
ef90: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
efa0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
efb0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
efc0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
efd0: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
efe0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
eff0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f000: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f010: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f020: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
f030: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f040: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f050: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f070: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f080: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
f090: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
f0a0: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
f0b0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
f0c0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f0d0: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
f0e0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f0f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
f100: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
f110: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  r);.          ra
f120: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f130: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
f140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f150: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f160: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
f170: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
f180: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
f190: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
f1a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
f1b0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
f1c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
f1d0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f1e0: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
f1f0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f200: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
f210: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
f220: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
f230: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
f240: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
f250: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f260: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f270: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f280: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f290: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f2a0: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
f2b0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f2c0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f2d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f2e0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f2f0: 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut,");\n");.    
f300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f310: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f     case MODE_Quo
f320: 74 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  te: {.      if( 
f330: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
f340: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
f350: 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  nt==0 && p->show
f360: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
f370: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
f380: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
f390: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
f3a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f3b0: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
f3c0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
f3d0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
f3e0: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
f3f0: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
f400: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
f410: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f420: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
f430: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
f440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
f450: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
f460: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
f470: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
f480: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
f490: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
f4a0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
f4b0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
f4c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f4d0: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
f4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
f4f0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
f500: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
f510: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
f520: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
f530: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f540: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f550: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
f560: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
f570: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
f580: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f590: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
f5a0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f5b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f5c0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f5d0: 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
f5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
f5f0: 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20   z[50];.        
f600: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
f610: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
f620: 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  le(p->pStmt, i);
f630: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a  e3_snprintf(50,z
f650: 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20  ,"%!.20g", r);. 
f660: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
f670: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f680: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , z);.        }e
f690: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f6a0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f6b0: 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70  ITE_BLOB && p->p
f6c0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
f6d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
f6e0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
f6f0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74  lumn_blob(p->pSt
f700: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
f710: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
f720: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
f730: 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  es(p->pStmt, i);
f740: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f750: 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75  t_hex_blob(p->ou
f760: 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  t, pBlob, nBlob)
f770: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
f780: 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41  if( isNumber(azA
f790: 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20  rg[i], 0) ){.   
f7a0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f7b0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
f7c0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f7d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f7e0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f7f0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
f800: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
f810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f820: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f830: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
f840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f850: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73      case MODE_As
f860: 63 69 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  cii: {.      if(
f870: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
f880: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
f890: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
f8a0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f8b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
f8c0: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
f8d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f8e0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
f8f0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f900: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f910: 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  ",azCol[i] ? azC
f920: 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20  ol[i] : "");.   
f930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
f940: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f950: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
f960: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f970: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
f980: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
f990: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f9a0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f9b0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
f9c0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f9d0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
f9e0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
f9f0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
fa00: 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b  >out,"%s",azArg[
fa10: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
fa20: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
fa40: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
fa50: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
fa60: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
fa70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
fa80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fa90: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
faa0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
fab0: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
fac0: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
fad0: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
fae0: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
faf0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
fb00: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
fb10: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
fb20: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
fb30: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
fb40: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
fb50: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
fb60: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
fb70: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
fb80: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
fb90: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
fba0: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
fbb0: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
fbc0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
fbd0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
fbe0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
fbf0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
fc00: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
fc10: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
fc20: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
fc30: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
fc40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fc50: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
fc60: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
fc70: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
fc80: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
fc90: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
fca0: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
fcb0: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
fcc0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
fcd0: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
fce0: 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78  p->n ) appendTex
fcf0: 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20  t(p, "|", 0);.  
fd00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
fd10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
fd20: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
fd30: 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66   ",", 0);.    if
fd40: 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70  ( azArg[i] ) app
fd50: 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67  endText(p, azArg
fd60: 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  [i], 0);.  }.  r
fd70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fd80: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70  * Generate an ap
fd90: 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45  propriate SELFTE
fda0: 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ST table in the 
fdb0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a  main database..*
fdc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
fdd0: 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c  eateSelftestTabl
fde0: 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
fdf0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  {.  char *zErrMs
fe00: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
fe10: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
fe20: 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66   "SAVEPOINT self
fe30: 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20  test_init;\n".  
fe40: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
fe50: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65  IF NOT EXISTS se
fe60: 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22  lftest(\n".    "
fe70: 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52    tno INTEGER PR
fe80: 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20  IMARY KEY,\n"   
fe90: 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a  /* Test number *
fea0: 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54  /.    "  op TEXT
feb0: 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ,\n"            
fec0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
fed0: 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f  or:  memo run */
fee0: 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54  .    "  cmd TEXT
fef0: 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ,\n"            
ff00: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64        /* Command
ff10: 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20   text */.    "  
ff20: 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20  ans TEXT\n"     
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff40: 20 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20   Desired answer 
ff50: 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20  */.    ");".    
ff60: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
ff70: 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  LE [_shell$self]
ff80: 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22  (op,cmd,ans);\n"
ff90: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
ffa0: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  O [_shell$self](
ffb0: 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22  rowid,op,cmd)\n"
ffc0: 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63  .    "  VALUES(c
ffd0: 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20  oalesce((SELECT 
ffe0: 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31  (max(tno)+100)/1
fff0: 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29  0 FROM selftest)
10000 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20  ,10),\n".    "  
10010 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54         'memo','T
10020 65 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62  ests generated b
10030 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20  y --init');\n". 
10040 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
10050 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22  [_shell$self]\n"
10060 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27  .    "  SELECT '
10070 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  run',\n".    "  
10080 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68    'SELECT hex(sh
10090 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43  a3_query(''SELEC
100a0 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  T type,name,tbl_
100b0 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20  name,sql ".     
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
100e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
100f0 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34  ORDER BY 2'',224
10100 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  ))',\n".    "   
10110 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
10120 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  'SELECT type,nam
10130 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22  e,tbl_name,sql "
10140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10150 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
10160 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
10170 52 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29  RDER BY 2',224))
10180 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
10190 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
101a0 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45  lf]\n".    "  SE
101b0 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20  LECT 'run',".   
101c0 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65   "    'SELECT he
101d0 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53  x(sha3_query(''S
101e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27  ELECT * FROM \"'
101f0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
10200 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61    printf('%w',na
10210 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49  me) || '\" NOT I
10220 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c  NDEXED'',224))',
10230 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78  \n".    "    hex
10240 28 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e  (sha3_query(prin
10250 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf('SELECT * FRO
10260 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44  M \"%w\" NOT IND
10270 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29  EXED',name),224)
10280 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  )\n".    "  FROM
10290 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53   (\n".    "    S
102a0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
102b0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22  sqlite_master\n"
102c0 0a 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45  .    "     WHERE
102d0 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22   type='table'\n"
102e0 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44  .    "       AND
102f0 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74   name<>'selftest
10300 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  '\n".    "      
10310 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
10320 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20  otpage,0)>0\n". 
10330 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22     "  )\n".    "
10340 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c   ORDER BY name;\
10350 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
10360 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
10370 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55  ]\n".    "  VALU
10380 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41  ES('run','PRAGMA
10390 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
103a0 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20  ','ok');\n".    
103b0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c  "INSERT INTO sel
103c0 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64  ftest(tno,op,cmd
103d0 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45  ,ans)".    "  SE
103e0 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70  LECT rowid*10,op
103f0 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f  ,cmd,ans FROM [_
10400 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a  shell$self];\n".
10410 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
10420 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a  [_shell$self];".
10430 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73      ,0,0,&zErrMs
10440 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73  g);.  if( zErrMs
10450 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  g ){.    utf8_pr
10460 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45  intf(stderr, "SE
10470 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a  LFTEST initializ
10480 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25  ation failure: %
10490 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
104a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
104b0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  (zErrMsg);.  }. 
104c0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
104d0 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65  >db, "RELEASE se
104e0 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30  lftest_init",0,0
104f0 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  ,0);.}.../*.** S
10500 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  et the destinati
10510 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f  on table field o
10520 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65  f the ShellState
10530 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a   structure to.**
10540 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10550 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45   table given.  E
10560 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20  scape any quote 
10570 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
10580 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e  e.** table name.
10590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
105a0 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53  set_table_name(S
105b0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
105c0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
105d0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
105e0 69 6e 74 20 63 51 75 6f 74 65 3b 0a 20 20 63 68  int cQuote;.  ch
105f0 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
10600 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
10610 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
10620 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
10630 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
10640 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
10650 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51  0 ) return;.  cQ
10660 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
10670 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73  (zName);.  n = s
10680 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
10690 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e    if( cQuote ) n
106a0 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e   += 2;.  z = p->
106b0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
106c0 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
106d0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ( z==0 ){.    ra
106e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
106f0 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
10700 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
10710 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20  xit(1);.  }.  n 
10720 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74  = 0;.  if( cQuot
10730 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
10740 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ote;.  for(i=0; 
10750 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zName[i]; i++){.
10760 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61      z[n++] = zNa
10770 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  me[i];.    if( z
10780 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20  Name[i]==cQuote 
10790 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
107a0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75  e;.  }.  if( cQu
107b0 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
107c0 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20  Quote;.  z[n] = 
107d0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  0;.}.../*.** Exe
107e0 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61  cute a query sta
107f0 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
10800 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75   generate SQL ou
10810 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  tput.  Print.** 
10820 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
10830 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  ns, comma-separa
10840 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61  ted, on a line a
10850 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a  nd then add a.**
10860 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
10870 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  nator to the end
10880 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a   of that line..*
10890 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
108a0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73  er of columns is
108b0 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   1 and that colu
108c0 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74  mn contains text
108d0 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72   "--".** then wr
108e0 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ite the semicolo
108f0 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20  n on a separate 
10900 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c  line.  That way,
10910 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f   if a.** "--" co
10920 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20  mment occurs at 
10930 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
10940 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f  tatement, the co
10950 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63  mment.** won't c
10960 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63  onsume the semic
10970 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e  olon terminator.
10980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
10990 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
109a0 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
109b0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
109c0 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74  /* Query context
109d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
109e0 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f   *zSelect,     /
109f0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
10a00 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f  nt to extract co
10a10 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntent */.  const
10a20 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77   char *zFirstRow
10a30 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66      /* Print bef
10a40 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69  ore first row, i
10a50 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
10a60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10a70 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  *pSelect;.  int 
10a80 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  rc;.  int nResul
10a90 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  t;.  int i;.  co
10aa0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72  nst char *z;.  r
10ab0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
10ac0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
10ad0 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c  elect, -1, &pSel
10ae0 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
10af0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
10b00 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  !pSelect ){.    
10b10 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10b20 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10b30 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
10b40 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
10b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10b60 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
10b70 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
10b80 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
10b90 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
10ba0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10bb0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10bc0 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10bd0 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  .  nResult = sql
10be0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10bf0 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68  t(pSelect);.  wh
10c00 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10c10 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ROW ){.    if( z
10c20 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20  FirstRow ){.    
10c30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10c40 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72  >out, "%s", zFir
10c50 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46  stRow);.      zF
10c60 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  irstRow = 0;.   
10c70 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73   }.    z = (cons
10c80 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
10c90 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10ca0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66  ect, 0);.    utf
10cb0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10cc0 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66   "%s", z);.    f
10cd0 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c  or(i=1; i<nResul
10ce0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  t; i++){.      u
10cf0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10d00 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65  t, ",%s", sqlite
10d10 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10d20 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20  elect, i));.    
10d30 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  }.    if( z==0 )
10d40 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69   z = "";.    whi
10d50 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30  le( z[0] && (z[0
10d60 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d  ]!='-' || z[1]!=
10d70 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  '-') ) z++;.    
10d80 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  if( z[0] ){.    
10d90 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10da0 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20  out, "\n;\n");. 
10db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10dc0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10dd0 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  t, ";\n");.    }
10de0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10df0 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10e00 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10e10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65  te3_finalize(pSe
10e20 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21  lect);.  if( rc!
10e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10e40 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10e50 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
10e60 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
10e70 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
10e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10e90 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10ea0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10eb0 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10ec0 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10ed0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10ee0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
10ef0 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73  cate space and s
10f00 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20  ave off current 
10f10 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f  error string..*/
10f20 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61  .static char *sa
10f30 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71  ve_err_msg(.  sq
10f40 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20  lite3 *db       
10f50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
10f60 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   to query */.){.
10f70 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20    int nErrMsg = 
10f80 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  1+strlen30(sqlit
10f90 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
10fa0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10fb0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
10fc0 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69  64(nErrMsg);.  i
10fd0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
10fe0 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67    memcpy(zErrMsg
10ff0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
11000 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a  (db), nErrMsg);.
11010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
11020 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rMsg;.}..#ifdef 
11030 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20  __linux__./*.** 
11040 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c  Attempt to displ
11050 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20  ay I/O stats on 
11060 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f  Linux using /pro
11070 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74  c/PID/io.*/.stat
11080 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c  ic void displayL
11090 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45  inuxIoStats(FILE
110a0 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a   *out){.  FILE *
110b0 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30  in;.  char z[200
110c0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
110d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
110e0 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f   z, "/proc/%d/io
110f0 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  ", getpid());.  
11100 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72  in = fopen(z, "r
11110 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
11120 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
11130 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a  le( fgets(z, siz
11140 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29  eof(z), in)!=0 )
11150 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
11160 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
11170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
11180 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f  attern;.      co
11190 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b  nst char *zDesc;
111a0 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20  .    } aTrans[] 
111b0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68  = {.      { "rch
111c0 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
111d0 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
111e0 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28  eceived by read(
111f0 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ):" },.      { "
11200 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  wchar: ",       
11210 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
11220 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28  s sent to write(
11230 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ):"    },.      
11240 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20  { "syscr: ",    
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
11260 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ead() system cal
11270 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  ls:"      },.   
11280 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20     { "syscw: ", 
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d   "Write() system
112b0 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a   calls:"     },.
112c0 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79        { "read_by
112d0 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
112e0 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20      "Bytes read 
112f0 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20  from storage:"  
11300 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74  },.      { "writ
11310 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  e_bytes: ",     
11320 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72         "Bytes wr
11330 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65  itten to storage
11340 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63  :" },.      { "c
11350 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62  ancelled_write_b
11360 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65  ytes: ",  "Cance
11370 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73  lled write bytes
11380 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  :"    },.    };.
11390 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
113a0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
113b0 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b  ize(aTrans); i++
113c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
113d0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 54 72   (int)strlen(aTr
113e0 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29  ans[i].zPattern)
113f0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
11400 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  cmp(aTrans[i].zP
11410 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  attern, z, n)==0
11420 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
11430 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11440 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b  36s %s", aTrans[
11450 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29  i].zDesc, &z[n])
11460 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
11470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11480 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
11490 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
114a0 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c   Display a singl
114b0 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73  e line of status
114c0 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61   using 64-bit va
114d0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
114e0 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74  void displayStat
114f0 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61  Line(.  ShellSta
11500 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
11510 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63    /* The shell c
11520 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72  ontext */.  char
11530 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20   *zLabel,       
11540 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
11550 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65  or this one line
11560 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72   */.  char *zFor
11570 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
11580 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68  /* Format for th
11590 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e  e result */.  in
115a0 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20  t iStatusCtrl,  
115b0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
115c0 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c   status to displ
115d0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  ay */.  int bRes
115e0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
115f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
11600 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
11610 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
11620 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20  64 iCur = -1;.  
11630 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48  sqlite3_int64 iH
11640 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  iwtr = -1;.  int
11650 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20   i, nPercent;.  
11660 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b  char zLine[200];
11670 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
11680 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c  s64(iStatusCtrl,
11690 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
116a0 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28   bReset);.  for(
116b0 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b  i=0, nPercent=0;
116c0 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b   zFormat[i]; i++
116d0 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d  ){.    if( zForm
116e0 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65  at[i]=='%' ) nPe
116f0 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rcent++;.  }.  i
11700 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b  f( nPercent>1 ){
11710 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
11720 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
11730 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72  ne), zLine, zFor
11740 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74  mat, iCur, iHiwt
11750 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
11760 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11770 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
11780 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
11790 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20   iHiwtr);.  }.  
117a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
117b0 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
117c0 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b   zLabel, zLine);
117d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
117e0 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a  y memory stats..
117f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
11800 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73  splay_stats(.  s
11810 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
11830 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
11840 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
11850 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
11860 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
11870 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69  hellState */.  i
11880 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
11890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
118a0 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
118b0 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  stats */.){.  in
118c0 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48  t iCur;.  int iH
118d0 69 77 74 72 3b 0a 0a 20 20 69 66 28 20 70 41 72  iwtr;..  if( pAr
118e0 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 29  g && pArg->out )
118f0 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  {.    displaySta
11900 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d  tLine(pArg, "Mem
11910 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20  ory Used:",.    
11920 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11930 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
11940 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
11950 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  _USED, bReset);.
11960 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
11970 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65  ine(pArg, "Numbe
11980 72 20 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67  r of Outstanding
11990 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a   Allocations:",.
119a0 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
119b0 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
119c0 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43  _STATUS_MALLOC_C
119d0 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a 20  OUNT, bReset);. 
119e0 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
119f0 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50  llFlgs & SHFLG_P
11a00 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20  agecache ){.    
11a10 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11a20 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11a30 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20  of Pcache Pages 
11a40 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 20  Used:",.        
11a50 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11a60 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45  ) pages", SQLITE
11a70 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11a80 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  E_USED, bReset);
11a90 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73 70 6c  .    }.    displ
11aa0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11ab0 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63   "Number of Pcac
11ac0 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65  he Overflow Byte
11ad0 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  s:",.       "%ll
11ae0 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74  d (max %lld) byt
11af0 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11b00 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45  US_PAGECACHE_OVE
11b10 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a  RFLOW, bReset);.
11b20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
11b30 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11b40 53 63 72 61 74 63 68 20 29 7b 0a 20 20 20 20 20  Scratch ){.     
11b50 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11b60 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
11b70 66 20 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61  f Scratch Alloca
11b80 74 69 6f 6e 73 20 55 73 65 64 3a 22 2c 0a 20 20  tions Used:",.  
11b90 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
11ba0 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
11bb0 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
11bc0 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
11bd0 20 20 20 7d 0a 20 20 20 20 64 69 73 70 6c 61 79     }.    display
11be0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11bf0 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61 74 63  Number of Scratc
11c00 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  h Overflow Bytes
11c10 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
11c20 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11c30 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11c40 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c  S_SCRATCH_OVERFL
11c50 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  OW, bReset);.   
11c60 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11c70 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11c80 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20  Allocation:",.  
11c90 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73       "%lld bytes
11ca0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11cb0 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52  _MALLOC_SIZE, bR
11cc0 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c  eset);.    displ
11cd0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11ce0 20 22 4c 61 72 67 65 73 74 20 50 63 61 63 68 65   "Largest Pcache
11cf0 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20   Allocation:",. 
11d00 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65        "%lld byte
11d10 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11d20 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a 45  S_PAGECACHE_SIZE
11d30 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 64  , bReset);.    d
11d40 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11d50 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 53 63  Arg, "Largest Sc
11d60 72 61 74 63 68 20 41 6c 6c 6f 63 61 74 69 6f 6e  ratch Allocation
11d70 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
11d80 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11d90 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 53  STATUS_SCRATCH_S
11da0 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69  IZE, bReset);.#i
11db0 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53  fdef YYTRACKMAXS
11dc0 54 41 43 4b 44 45 50 54 48 0a 20 20 20 20 64 69  TACKDEPTH.    di
11dd0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11de0 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61 72  rg, "Deepest Par
11df0 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20  ser Stack:",.   
11e00 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11e10 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
11e20 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43  ATUS_PARSER_STAC
11e30 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64  K, bReset);.#end
11e40 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41  if.  }..  if( pA
11e50 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
11e60 26 26 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28  && db ){.    if(
11e70 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73   pArg->shellFlgs
11e80 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   & SHFLG_Lookasi
11e90 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77  de ){.      iHiw
11ea0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
11eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
11ec0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11ed0 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
11ee0 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20  ASIDE_USED,.    
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
11f10 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11f20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11f30 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20  rg->out,.       
11f40 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64         "Lookasid
11f50 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20  e Slots Used:   
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
11f70 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20  (max %d)\n",.   
11f80 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 2c             iCur,
11f90 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
11fa0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11fb0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11fc0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11fd0 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  HIT,.           
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
11ff0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12000 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
12010 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12020 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
12030 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
12040 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  :       %d\n",. 
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
12060 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
12070 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12080 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12090 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
120a0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
120c0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
120d0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
120e0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
120f0 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
12100 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73  ailures due to s
12110 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c  ize:      %d\n",
12120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12130 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
12140 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12150 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12160 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
12170 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20  SS_FULL,.       
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
121a0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
121b0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
121c0 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
121d0 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
121e0 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e   OOM:       %d\n
121f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12200 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a   iHiwtr);.    }.
12210 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12220 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12230 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12240 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12250 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69  S_CACHE_USED, &i
12260 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
12270 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12280 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12290 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73 61   "Pager Heap Usa
122a0 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
122b0 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
122c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
122d0 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
122e0 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
122f0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12300 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12310 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
12320 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  IT, &iCur, &iHiw
12330 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
12340 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12350 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68 69  , "Page cache hi
12360 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
12370 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12380 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
12390 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
123a0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
123b0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
123c0 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49  BSTATUS_CACHE_MI
123d0 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  SS, &iCur, &iHiw
123e0 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
123f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12400 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d 69  , "Page cache mi
12410 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20 20  sses:           
12420 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12430 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
12440 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
12450 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12460 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12470 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52  BSTATUS_CACHE_WR
12480 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ITE, &iCur, &iHi
12490 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
124a0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
124b0 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 77  t, "Page cache w
124c0 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20 20  rites:          
124d0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
124e0 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
124f0 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12500 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12510 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12520 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f  DBSTATUS_SCHEMA_
12530 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
12540 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
12550 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12560 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61  rg->out, "Schema
12570 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20   Heap Usage:    
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12590 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
125a0 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
125b0 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
125c0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
125d0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
125e0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
125f0 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43 75  _STMT_USED, &iCu
12600 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
12610 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12620 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12630 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c  Statement Heap/L
12640 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65 3a 20  ookaside Usage: 
12650 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
12660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
12670 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
12680 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75  pArg && pArg->ou
12690 74 20 26 26 20 64 62 20 26 26 20 70 41 72 67 2d  t && db && pArg-
126a0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43  >pStmt ){.    iC
126b0 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
126c0 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
126d0 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
126e0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
126f0 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20  _STEP,.         
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20        bReset);. 
12720 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12730 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63  rg->out, "Fullsc
12740 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  an Steps:       
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12760 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12770 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12780 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12790 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
127a0 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
127b0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
127c0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
127d0 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74  ut, "Sort Operat
127e0 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
127f0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12800 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
12810 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12820 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12830 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12840 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
12850 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12860 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12870 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e  t, "Autoindex In
12880 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20  serts:          
12890 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
128a0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
128b0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
128c0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
128d0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
128e0 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52  ATUS_VM_STEP, bR
128f0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12900 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12910 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e   "Virtual Machin
12920 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20  e Steps:        
12930 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12940 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ur);.  }..#ifdef
12950 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73   __linux__.  dis
12960 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
12970 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e  (pArg->out);.#en
12980 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  dif..  /* Do not
12990 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63   remove this mac
129a0 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f  hine readable co
129b0 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61  mment: extra-sta
129c0 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a  ts-output-here *
129d0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  /..  return 0;.}
129e0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
129f0 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73  scan stats..*/.s
12a00 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
12a10 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20  ay_scanstats(.  
12a20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
12a50 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
12a60 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20 20  tate *pArg      
12a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12a80 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
12a90 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  te */.){.#ifndef
12aa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12ab0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
12ac0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12ad0 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
12ae0 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b  PARAMETER(pArg);
12af0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20  .#else.  int i, 
12b00 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f  k, n, mx;.  raw_
12b10 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12b20 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e  , "-------- scan
12b30 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  stats --------\n
12b40 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20  ");.  mx = 0;.  
12b50 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20  for(k=0; k<=mx; 
12b60 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  k++){.    double
12b70 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b   rEstLoop = 1.0;
12b80 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
12b90 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  1; i++){.      s
12ba0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d  qlite3_stmt *p =
12bb0 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20   pArg->pStmt;.  
12bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12bd0 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b  4 nLoop, nVisit;
12be0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45  .      double rE
12bf0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  st;.      int iS
12c00 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  id;.      const 
12c10 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a  char *zExplain;.
12c20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12c30 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
12c40 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
12c50 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28  CANSTAT_NLOOP, (
12c60 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b  void*)&nLoop) ){
12c70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12c90 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12ca0 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12cb0 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45  TE_SCANSTAT_SELE
12cc0 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53  CTID, (void*)&iS
12cd0 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  id);.      if( i
12ce0 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53  Sid>mx ) mx = iS
12cf0 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  id;.      if( iS
12d00 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65  id!=k ) continue
12d10 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
12d20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74   ){.        rEst
12d30 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e  Loop = (double)n
12d40 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
12d50 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( k>0 ) raw_prin
12d60 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d  tf(pArg->out, "-
12d70 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79  ------- subquery
12d80 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20   %d -------\n", 
12d90 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
12da0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c    n++;.      sql
12db0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
12dc0 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
12dd0 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49  E_SCANSTAT_NVISI
12de0 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69  T, (void*)&nVisi
12df0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12e00 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
12e10 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
12e20 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
12e30 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
12e40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
12e50 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12e60 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12e70 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
12e80 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
12e90 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
12ea0 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25  rg->out, "Loop %
12eb0 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45  2d: %s\n", n, zE
12ec0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72  xplain);.      r
12ed0 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b  EstLoop *= rEst;
12ee0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
12ef0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
12f00 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
12f10 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52   nLoop=%-8lld nR
12f20 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
12f30 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c  =%-8lld estRow/L
12f40 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20  oop=%-8g\n",.   
12f50 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56         nLoop, nV
12f60 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69  isit, (sqlite3_i
12f70 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30  nt64)(rEstLoop+0
12f80 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20  .5), rEst.      
12f90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
12fa0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12fb0 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  out, "----------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fd0 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  -\n");.#endif.}.
12fe0 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
12ff0 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20   azArray points 
13000 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  to a zero-termin
13010 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73 74  ated array of st
13020 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70  rings. zStr.** p
13030 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c  oints to a singl
13040 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
13050 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
13060 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72  non-zero if zStr
13070 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63  .** is equal, ac
13080 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d  cording to strcm
13090 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74  p(), to any of t
130a0 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68  he strings in th
130b0 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65  e array..** Othe
130c0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65  rwise, return ze
130d0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
130e0 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63  t str_in_array(c
130f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
13100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
13110 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b  Array){.  int i;
13120 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72  .  for(i=0; azAr
13130 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ray[i]; i++){.  
13140 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
13150 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d  zStr, azArray[i]
13160 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
13170 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13180 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*.** If compil
13190 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71  ed statement pSq
131a0 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  l appears to be 
131b0 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
131c0 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a  ment, allocate.*
131d0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  * and populate t
131e0 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69  he ShellState.ai
131f0 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77  Indent[] array w
13200 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ith the number o
13210 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68  f.** spaces each
13220 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62   opcode should b
13230 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72  e indented befor
13240 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a  e it is output..
13250 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74  **.** The indent
13260 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a  ing rules are:.*
13270 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
13280 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65  ach "Next", "Pre
13290 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22  v", "VNext" or "
132a0 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74 69  VPrev" instructi
132b0 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20  on, indent.**   
132c0 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20      all opcodes 
132d0 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77 65  that occur betwe
132e0 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64  en the p2 jump d
132f0 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74  estination and t
13300 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20  he opcode.**    
13310 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20 73     itself by 2 s
13320 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  paces..**.**    
13330 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74   * For each "Got
13340 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20  o", if the jump 
13350 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65  destination is e
13360 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72  arlier in the pr
13370 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61  ogram.**       a
13380 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f  nd ends on one o
13390 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59  f:.**          Y
133a0 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65  ield  SeekGt  Se
133b0 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64  ekLt  RowSetRead
133c0 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20    Rewind.**     
133d0 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20 70    or if the P1 p
133e0 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20  arameter is one 
133f0 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c  instead of zero,
13400 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69  .**       then i
13410 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65  ndent all opcode
13420 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 61  s between the ea
13430 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f  rlier instructio
13440 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22  n.**       and "
13450 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63 65  Goto" by 2 space
13460 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13470 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  d explain_data_p
13480 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74  repare(ShellStat
13490 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  e *p, sqlite3_st
134a0 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e  mt *pSql){.  con
134b0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134d0 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
134e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
134f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13510 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68     /* Used to ch
13520 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
13530 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69  n EXPLAIN */.  i
13540 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b  nt *abYield = 0;
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13560 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73 20  * True if op is 
13570 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20  an OP_Yield */. 
13580 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
135b0 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e  ze of p->aiInden
135c0 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a  t[], abYield */.
135d0 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20    int iOp;      
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70    /* Index of op
13600 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69  eration in p->ai
13610 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63  Indent[] */..  c
13620 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78  onst char *azNex
13630 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20  t[] = { "Next", 
13640 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c  "Prev", "VPrev",
13650 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65   "VNext", "Sorte
13660 72 4e 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20  rNext",.        
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c     "NextIfOpen",
13690 20 22 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30   "PrevIfOpen", 0
136a0 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
136b0 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20   *azYield[] = { 
136c0 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54  "Yield", "SeekLT
136d0 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f  ", "SeekGT", "Ro
136e0 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20  wSetRead",.     
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 20 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c         "Rewind",
13710 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
13720 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b  ar *azGoto[] = {
13730 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20   "Goto", 0 };.. 
13740 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72   /* Try to figur
13750 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73  e out if this is
13760 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41   really an EXPLA
13770 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66  IN statement. If
13780 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f   this.  ** canno
13790 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72  t be verified, r
137a0 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f  eturn early.  */
137b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
137c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c  olumn_count(pSql
137d0 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63  )!=8 ){.    p->c
137e0 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
137f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13800 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13810 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66  _sql(pSql);.  if
13820 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
13830 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c  rn;.  for(z=zSql
13840 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d  ; *z==' ' || *z=
13850 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e  ='\t' || *z=='\n
13860 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c  ' || *z=='\f' ||
13870 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b   *z=='\r'; z++);
13880 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
13890 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c  trnicmp(z, "expl
138a0 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  ain", 7) ){.    
138b0 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
138c0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  de;.    return;.
138d0 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30    }..  for(iOp=0
138e0 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ; SQLITE_ROW==sq
138f0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
13900 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ; iOp++){.    in
13910 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64  t i;.    int iAd
13920 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dr = sqlite3_col
13930 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29  umn_int(pSql, 0)
13940 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13950 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63   *zOp = (const c
13960 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
13970 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31  umn_text(pSql, 1
13980 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70  );..    /* Set p
13990 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c  2 to the P2 fiel
139a0 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
139b0 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61   opcode. Then, a
139c0 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20  ssuming that.   
139d0 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73   ** p2 is an ins
139e0 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
139f0 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70  , set variable p
13a00 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78  2op to the index
13a10 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   of that.    ** 
13a20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  instruction in t
13a30 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  he aiIndent[] ar
13a40 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70  ray. p2 and p2op
13a50 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
13a60 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  t if.    ** the 
13a70 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74  current instruct
13a80 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
13a90 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e   sub-program gen
13aa0 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20  erated by an.   
13ab0 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20   ** SQL trigger 
13ac0 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  or foreign key. 
13ad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d   */.    int p2 =
13ae0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13af0 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20  int(pSql, 3);.  
13b00 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32    int p2op = (p2
13b10 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b   + (iOp-iAddr));
13b20 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68  ..    /* Grow th
13b30 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72  e p->aiIndent ar
13b40 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20  ray as required 
13b50 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d  */.    if( iOp>=
13b60 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
13b70 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20  if( iOp==0 ){.  
13b80 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74        /* Do furt
13b90 68 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20  her verfication 
13ba0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70  that this is exp
13bb0 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62  lain output.  Ab
13bc0 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ort if.        *
13bd0 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20  * it is not */. 
13be0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
13bf0 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69  nst char *explai
13c00 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  nCols[] = {.    
13c10 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22         "addr", "
13c20 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22  opcode", "p1", "
13c30 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c  p2", "p3", "p4",
13c40 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22   "p5", "comment"
13c50 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
13c60 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  jj;.        for(
13c70 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69  jj=0; jj<ArraySi
13c80 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b  ze(explainCols);
13c90 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
13ca0 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c    if( strcmp(sql
13cb0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
13cc0 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69  (pSql,jj),explai
13cd0 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b  nCols[jj])!=0 ){
13ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
13cf0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
13d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13d10 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29  ite3_reset(pSql)
13d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
13d30 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
13d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13d50 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63    }.      nAlloc
13d60 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70   += 100;.      p
13d70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e  ->aiIndent = (in
13d80 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
13d90 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74  oc64(p->aiIndent
13da0 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
13db0 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 61 62 59  int));.      abY
13dc0 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c  ield = (int*)sql
13dd0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61  ite3_realloc64(a
13de0 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73  bYield, nAlloc*s
13df0 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
13e00 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69   }.    abYield[i
13e10 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72  Op] = str_in_arr
13e20 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29  ay(zOp, azYield)
13e30 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e  ;.    p->aiInden
13e40 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20  t[iOp] = 0;.    
13e50 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70  p->nIndent = iOp
13e60 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72  +1;..    if( str
13e70 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
13e80 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20  zNext) ){.      
13e90 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f  for(i=p2op; i<iO
13ea0 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64  p; i++) p->aiInd
13eb0 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20  ent[i] += 2;.   
13ec0 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69   }.    if( str_i
13ed0 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47  n_array(zOp, azG
13ee0 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e  oto) && p2op<p->
13ef0 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20  nIndent.     && 
13f00 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c  (abYield[p2op] |
13f10 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
13f20 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20  _int(pSql, 2)). 
13f30 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28     ){.      for(
13f40 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69  i=p2op; i<iOp; i
13f50 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b  ++) p->aiIndent[
13f60 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  i] += 2;.    }. 
13f70 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74   }..  p->iIndent
13f80 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
13f90 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20  free(abYield);. 
13fa0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
13fb0 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Sql);.}../*.** F
13fc0 72 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c  ree the array al
13fd0 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61  located by expla
13fe0 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
13ff0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
14000 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64  d explain_data_d
14010 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65  elete(ShellState
14020 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
14030 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74  free(p->aiIndent
14040 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  );.  p->aiIndent
14050 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65   = 0;.  p->nInde
14060 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e  nt = 0;.  p->iIn
14070 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  dent = 0;.}../*.
14080 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72  ** Disable and r
14090 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61  estore .wheretra
140a0 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72  ce and .selecttr
140b0 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f  ace settings..*/
140c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
140d0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
140e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
140f0 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
14100 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
14110 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  te3SelectTrace;.
14120 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
14130 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e  SelectTrace;.#en
14140 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
14150 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
14160 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14170 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
14180 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  E).extern int sq
14190 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
141a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
141b0 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
141c0 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20  dif.static void 
141d0 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72  disable_debug_tr
141e0 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b  ace_modes(void){
141f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
14200 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
14210 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
14220 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
14230 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72  .  savedSelectTr
14240 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ace = sqlite3Sel
14250 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69  ectTrace;.  sqli
14260 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d  te3SelectTrace =
14270 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
14280 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14290 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
142a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
142b0 45 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65  ERETRACE).  save
142c0 64 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71  dWhereTrace = sq
142d0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
142e0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  .  sqlite3WhereT
142f0 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
14300 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
14310 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
14320 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
14330 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14340 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14350 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14360 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14370 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
14380 72 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65  race = savedSele
14390 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  ctTrace;.#endif.
143a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
143b0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
143c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
143d0 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20  LE_WHERETRACE). 
143e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
143f0 63 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54  ce = savedWhereT
14400 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  race;.#endif.}..
14410 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65 70  /*.** Run a prep
14420 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ared statement.*
14430 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
14440 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
14450 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
14460 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
14490 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
144a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
144b0 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20  *pStmt,         
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20      /* Statment 
144e0 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20  to run */.  int 
144f0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
14500 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
14510 61 72 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f 2a 20  ar**,int*)   /* 
14520 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
14530 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
14540 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
14550 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
14560 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
14570 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
14580 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
14590 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
145a0 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
145b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
145c0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
145d0 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
145e0 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
145f0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
14600 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
14610 69 66 20 77 65 20 68 61 76 65 20 61 20 63 61 6c  if we have a cal
14620 6c 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20  lback... */.    
14630 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b  if( xCallback ){
14640 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
14650 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c  te space for col
14660 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65   name ptr, value
14670 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a   ptr, and type *
14680 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  /.      int nCol
14690 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
146a0 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
146b0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
146c0 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
146d0 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65  oc64(3*nCol*size
146e0 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20  of(const char*) 
146f0 2b 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  + 1);.      if( 
14700 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
14710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14720 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
14730 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
14740 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
14750 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
14760 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
14770 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
14780 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61       char **azVa
14790 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f  ls = &azCols[nCo
147a0 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  l];       /* Res
147b0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ults */.        
147c0 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28  int *aiTypes = (
147d0 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43  int *)&azVals[nC
147e0 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74  ol]; /* Result t
147f0 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ypes */.        
14800 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20  int i, x;.      
14810 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
14820 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63  int) <= sizeof(c
14830 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 20  har *));.       
14840 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
14850 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
14860 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  s */.        for
14870 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
14880 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a  +){.          az
14890 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20  Cols[i] = (char 
148a0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
148b0 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
148c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
148d0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
148e0 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20   /* extract the 
148f0 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79  data and data ty
14900 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
14910 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
14920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14930 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d      aiTypes[i] =
14940 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   x = sqlite3_col
14950 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
14960 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
14970 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
14980 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
14990 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
149a0 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
149b0 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
149c0 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ] = "";.        
149d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
149e0 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
149f0 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
14a00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
14a10 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
14a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a30 20 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73       if( !azVals
14a40 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b  [i] && (aiTypes[
14a50 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]!=SQLITE_NULL)
14a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14a80 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
14a90 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f     break; /* fro
14aa0 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  m for */.       
14ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14ac0 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f   } /* end for */
14ad0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ..          /* i
14ae0 66 20 64 61 74 61 20 61 6e 64 20 74 79 70 65 73  f data and types
14af0 20 65 78 74 72 61 63 74 65 64 20 73 75 63 63 65   extracted succe
14b00 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20  ssfully... */.  
14b10 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
14b20 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
14b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
14b40 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
14b50 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
14b60 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
14b70 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
14b80 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28    if( xCallback(
14b90 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61  pArg, nCol, azVa
14ba0 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79  ls, azCols, aiTy
14bb0 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pes) ){.        
14bc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14bd0 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20  E_ABORT;.       
14be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14bf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
14c00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
14c10 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
14c20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
14c30 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53        } while( S
14c40 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
14c50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14c60 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
14c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14c80 65 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  e{.      do{.   
14c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14ca0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
14cb0 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63       } while( rc
14cc0 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29   == SQLITE_ROW )
14cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14ce0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73  *.** Execute a s
14cf0 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20  tatement or set 
14d00 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  of statements.  
14d10 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73  Print.** any res
14d20 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73  ult rows/columns
14d30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
14d40 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a  e current mode.*
14d50 2a 20 73 65 74 20 76 69 61 20 74 68 65 20 73 75  * set via the su
14d60 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e  pplied callback.
14d70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76  .**.** This is v
14d80 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53  ery similar to S
14d90 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e  QLite's built-in
14da0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
14db0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65  ** function exce
14dc0 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c  pt it takes a sl
14dd0 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
14de0 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64   callback.** and
14df0 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61   callback data a
14e00 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
14e10 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65  ic int shell_exe
14e20 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
14e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14e50 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  * An open databa
14e60 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
14e70 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65    /* SQL to be e
14ea0 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e  valuated */.  in
14eb0 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
14ec0 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c  oid*,int,char**,
14ed0 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c 20 20 20  char**,int*),   
14ee0 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
14ef0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74 68 65 20      /* (not the 
14f30 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
14f40 65 78 65 63 29 20 2a 2f 0a 20 20 53 68 65 6c 6c  exec) */.  Shell
14f50 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
14f80 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
14f90 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
14fa0 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sg              
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14fc0 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65  Error msg writte
14fd0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  n here */.){.  s
14fe0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
14ff0 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f  mt = NULL;     /
15000 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  * Statement to e
15010 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74  xecute. */.  int
15020 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15040 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
15050 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73   int rc2;.  cons
15060 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65  t char *zLeftove
15070 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
15080 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73  ail of unprocess
15090 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20 69 66 28  ed SQL */..  if(
150a0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
150b0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c   *pzErrMsg = NUL
150c0 4c 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  L;.  }..  while(
150d0 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c   zSql[0] && (SQL
150e0 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b  ITE_OK == rc) ){
150f0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
15100 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c  t char *zStmtSql
15110 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15120 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
15130 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
15140 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b  mt, &zLeftover);
15150 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15160 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20  OK != rc ){.    
15170 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
15180 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
15190 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d  Msg = save_err_m
151a0 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  sg(db);.      }.
151b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151c0 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20   if( !pStmt ){. 
151d0 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20 68         /* this h
151e0 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d  appens for a com
151f0 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73 70  ment or white-sp
15200 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ace */.        z
15210 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
15220 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
15230 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
15240 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
15250 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15260 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74     }.      zStmt
15270 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
15280 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
15290 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20  if( zStmtSql==0 
152a0 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b  ) zStmtSql = "";
152b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
152c0 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30  Space(zStmtSql[0
152d0 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b  ]) ) zStmtSql++;
152e0 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20  ..      /* save 
152f0 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65 64  off the prepared
15300 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65   statment handle
15310 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20 63   and reset row c
15320 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  ount */.      if
15330 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
15340 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
15350 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 70  pStmt;.        p
15360 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20  Arg->cnt = 0;.  
15370 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15380 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74 61  echo the sql sta
15390 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20 6f  tement if echo o
153a0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
153b0 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73 46  Arg && ShellHasF
153c0 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47 5f  lag(pArg, SHFLG_
153d0 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Echo) ){.       
153e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
153f0 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  g->out, "%s\n", 
15400 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74  zStmtSql ? zStmt
15410 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20  Sql : zSql);.   
15420 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
15430 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e 20  how the EXPLAIN 
15440 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e 65  QUERY PLAN if .e
15450 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20  qp is on */.    
15460 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
15470 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20 73  rg->autoEQP && s
15480 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
15490 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74 6d 74 53  EXPLAIN%",zStmtS
154a0 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  ql,0)!=0 ){.    
154b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
154c0 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20   *pExplain;.    
154d0 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a      char *zEQP;.
154e0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f          disable_
154f0 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
15500 73 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 51  s();.        zEQ
15510 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
15520 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45  ntf("EXPLAIN QUE
15530 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74  RY PLAN %s", zSt
15540 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
15550 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15560 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
15570 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
15580 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
15590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
155a0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
155b0 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
155c0 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54  pExplain)==SQLIT
155d0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
155e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
155f0 70 41 72 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50  pArg->out,"--EQP
15600 2d 2d 20 25 64 2c 22 2c 73 71 6c 69 74 65 33 5f  -- %d,",sqlite3_
15610 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
15620 61 69 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ain, 0));.      
15630 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15640 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22  (pArg->out,"%d,"
15650 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
15660 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31  _int(pExplain, 1
15670 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
15680 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
15690 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69  >out,"%d,", sqli
156a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
156b0 45 78 70 6c 61 69 6e 2c 20 32 29 29 3b 0a 20 20  Explain, 2));.  
156c0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
156d0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
156e0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
156f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
15700 6c 61 69 6e 2c 20 33 29 29 3b 0a 20 20 20 20 20  lain, 3));.     
15710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15730 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
15740 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  in);.        sql
15750 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
15760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
15770 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 32 20 29 7b  g->autoEQP>=2 ){
15780 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
15790 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e  so do an EXPLAIN
157a0 20 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22   for ".eqp full"
157b0 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   mode */.       
157c0 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65     zEQP = sqlite
157d0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
157e0 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c  IN %s", zStmtSql
157f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
15800 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
15810 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
15820 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
15830 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15850 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72  .            pAr
15860 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
15870 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
15880 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
15890 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20  a_prepare(pArg, 
158a0 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
158b0 20 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70         exec_prep
158c0 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
158d0 70 45 78 70 6c 61 69 6e 2c 20 78 43 61 6c 6c 62  pExplain, xCallb
158e0 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ack);.          
158f0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
15900 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20  elete(pArg);.   
15910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15920 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
15930 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
15940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15950 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
15960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
15970 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
15980 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
15990 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
159a0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
159b0 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
159c0 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
159d0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
159e0 78 70 6c 61 69 6e 0a 20 20 20 20 20 20 20 20 20  xplain.         
159f0 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  && sqlite3_colum
15a00 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d  n_count(pStmt)==
15a10 38 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  8.         && sq
15a20 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45  lite3_strlike("E
15a30 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53  XPLAIN%", zStmtS
15a40 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  ql,0)==0.       
15a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
15a60 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45  rg->cMode = MODE
15a70 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  _Explain;.      
15a80 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
15a90 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  If the shell is 
15aa0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65  currently in ".e
15ab0 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61  xplain" mode, ga
15ac0 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20  ther the extra. 
15ad0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72         ** data r
15ae0 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69  equired to add i
15af0 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75  ndents to the ou
15b00 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20  tput.*/.        
15b10 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d  if( pArg->cMode=
15b20 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
15b30 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
15b40 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
15b50 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
15b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15b70 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70  .      exec_prep
15b80 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
15b90 70 53 74 6d 74 2c 20 78 43 61 6c 6c 62 61 63 6b  pStmt, xCallback
15ba0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
15bb0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
15bc0 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72  g);..      /* pr
15bd0 69 6e 74 20 75 73 61 67 65 20 73 74 61 74 73 20  int usage stats 
15be0 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20  if stats on */. 
15bf0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
15c00 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29   pArg->statsOn )
15c10 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61  {.        displa
15c20 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41 72 67  y_stats(db, pArg
15c30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
15c40 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f       /* print lo
15c50 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72  op-counters if r
15c60 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20  equired */.     
15c70 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
15c80 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29  g->scanstatsOn )
15c90 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61  {.        displa
15ca0 79 5f 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20  y_scanstats(db, 
15cb0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  pArg);.      }..
15cc0 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a        /* Finaliz
15cd0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
15ce0 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e 20 49  just executed. I
15cf0 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61  f this fails, sa
15d00 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ve a.      ** co
15d10 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  py of the error 
15d20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69  message. Otherwi
15d30 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20  se, set zSql to 
15d40 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  point to the.   
15d50 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65     ** next state
15d60 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e  ment to execute.
15d70 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
15d80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
15d90 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
15da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
15db0 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  MEM ) rc = rc2;.
15dc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15de0 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f     zSql = zLefto
15df0 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ver;.        whi
15e00 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c  le( IsSpace(zSql
15e10 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20  [0]) ) zSql++;. 
15e20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
15e30 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
15e40 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
15e50 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b  ave_err_msg(db);
15e60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15e70 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64 20 73  /* clear saved s
15e80 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  tmt handle */.  
15e90 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a      if( pArg ){.
15ea0 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53          pArg->pS
15eb0 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tmt = NULL;.    
15ec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
15ed0 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20   end while */.. 
15ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15ef0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d  *.** Release mem
15f00 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ory previously a
15f10 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c  llocated by tabl
15f20 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a  eColumnList()..*
15f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
15f40 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61  eeColumnList(cha
15f50 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
15f60 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  t i;.  for(i=1; 
15f70 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
15f80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15f90 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a  (azCol[i]);.  }.
15fa0 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73    /* azCol[0] is
15fb0 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
15fc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
15fd0 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  ee(azCol);.}../*
15fe0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .** Return a lis
15ff0 74 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  t of pointers to
16000 20 73 74 72 69 6e 67 73 20 77 68 69 63 68 20 61   strings which a
16010 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  re the names of 
16020 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  all.** columns i
16030 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20  n table zTab.   
16040 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f  The memory to ho
16050 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20  ld the names is 
16060 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
16070 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73  llocated and mus
16080 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79  t be released by
16090 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
160a0 67 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  g a subsequent c
160b0 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f  all.** to freeCo
160c0 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a  lumnList()..**.*
160d0 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65  * The azCol[0] e
160e0 6e 74 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20  ntry is usually 
160f0 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20  NULL.  However, 
16100 69 66 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73  if zTab contains
16110 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75   a rowid.** valu
16120 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
16130 62 65 20 70 72 65 73 65 72 76 65 64 2c 20 74 68  be preserved, th
16140 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66  en azCol[0] is f
16150 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68  illed in with th
16160 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
16170 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a   rowid column..*
16180 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72  *.** The first r
16190 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e  egular column in
161a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a   the table is az
161b0 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73  Col[1].  The lis
161c0 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  t is terminated.
161d0 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77  ** by an entry w
161e0 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e  ith azCol[i]==0.
161f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
16200 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73  **tableColumnLis
16210 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  t(ShellState *p,
16220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
16230 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43  b){.  char **azC
16240 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ol = 0;.  sqlite
16250 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
16260 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
16270 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  nt nCol = 0;.  i
16280 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  nt nAlloc = 0;. 
16290 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20   int nPK = 0;   
162a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
162b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
162c0 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  umns seen */.  i
162d0 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20  nt isIPK = 0;   
162e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65    /* True if one
162f0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
16300 75 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45  umn of type INTE
16310 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  GER */.  int pre
16320 73 65 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65  serveRowid = She
16330 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
16340 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
16350 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  );.  int rc;..  
16360 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
16370 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74  printf("PRAGMA t
16380 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a  able_info=%Q", z
16390 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Tab);.  rc = sql
163a0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
163b0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
163c0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
163d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
163e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
163f0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
16400 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
16410 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
16420 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   ){.    if( nCol
16430 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20  >=nAlloc-2 ){.  
16440 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c      nAlloc = nAl
16450 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31  loc*2 + nCol + 1
16460 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d  0;.      azCol =
16470 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
16480 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73  (azCol, nAlloc*s
16490 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29  izeof(azCol[0]))
164a0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f  ;.      if( azCo
164b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
164c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
164d0 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
164e0 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
164f0 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
16500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16510 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
16520 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16530 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
16540 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
16550 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
16560 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16570 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
16580 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
16590 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
165a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
165b0 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
165c0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
165d0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
165e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
165f0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
16600 45 47 45 52 22 29 3d 3d 30 20 0a 20 20 20 20 20  EGER")==0 .     
16610 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50   ){.        isIP
16620 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  K = 1;.      }el
16630 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50  se{.        isIP
16640 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  K = 0;.      }. 
16650 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16660 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16670 74 29 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d  t);.  azCol[0] =
16680 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c   0;.  azCol[nCol
16690 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  +1] = 0;..  /* T
166a0 68 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77  he decision of w
166b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
166c0 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65  rowid really nee
166d0 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  ds to be preserv
166e0 65 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b  ed.  ** is trick
166f0 79 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65  y.  We never nee
16700 64 20 74 6f 20 70 72 65 73 65 72 76 65 20 61 20  d to preserve a 
16710 72 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54 48  rowid for a WITH
16720 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a  OUT ROWID table.
16730 20 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20    ** or a table 
16740 77 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20  with an INTEGER 
16750 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65  PRIMARY KEY.  We
16760 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70   are unable to p
16770 72 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77  reserve.  ** row
16780 69 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68  ids on tables wh
16790 65 72 65 20 74 68 65 20 72 6f 77 69 64 20 69 73  ere the rowid is
167a0 20 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65   inaccessible be
167b0 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
167c0 6f 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d  other.  ** colum
167d0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
167e0 6e 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22  named "rowid", "
167f0 5f 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f  _rowid_", and "o
16800 69 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  id"..  */.  if( 
16810 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 26 26  preserveRowid &&
16820 20 69 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a   isIPK ){.    /*
16830 20 49 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49   If a single PRI
16840 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
16850 77 69 74 68 20 74 79 70 65 20 49 4e 54 45 47 45  with type INTEGE
16860 52 20 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e  R was seen, then
16870 20 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74   it.    ** might
16880 20 62 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72   be an alise for
16890 20 74 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74   the ROWID.  But
168a0 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62   it might also b
168b0 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  e a WITHOUT ROWI
168c0 44 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f  D.    ** table o
168d0 72 20 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  r a INTEGER PRIM
168e0 41 52 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c  ARY KEY DESC col
168f0 75 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20  umn, neither of 
16900 77 68 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a  which are.    **
16910 20 52 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20   ROWID aliases. 
16920 20 54 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20   To distinguish 
16930 74 68 65 73 65 20 63 61 73 65 73 2c 20 63 68 65  these cases, che
16940 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  ck to see if.   
16950 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 22   ** there is a "
16960 70 6b 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52  pk" entry in "PR
16970 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22  AGMA index_list"
16980 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  .  There will be
16990 0a 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20  .    ** no "pk" 
169a0 69 6e 64 65 78 20 69 66 20 74 68 65 20 50 52 49  index if the PRI
169b0 4d 41 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20  MARY KEY really 
169c0 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  is an alias for 
169d0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  the ROWID..    *
169e0 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
169f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
16a00 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67  LECT 1 FROM prag
16a10 6d 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51  ma_index_list(%Q
16a20 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
16a40 57 48 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b  WHERE origin='pk
16a50 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 72  '", zTab);.    r
16a60 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
16a70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
16a80 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
16a90 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
16aa0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
16ab0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
16ac0 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61  freeColumnList(a
16ad0 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  zCol);.      ret
16ae0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
16af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
16b00 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  ep(pStmt);.    s
16b10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
16b20 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 72 65 73  pStmt);.    pres
16b30 65 72 76 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d  erveRowid = rc==
16b40 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
16b50 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f    if( preserveRo
16b60 77 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  wid ){.    /* On
16b70 6c 79 20 70 72 65 73 65 72 76 65 20 74 68 65 20  ly preserve the 
16b80 72 6f 77 69 64 20 69 66 20 77 65 20 63 61 6e 20  rowid if we can 
16b90 66 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20 75  find a name to u
16ba0 73 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  se for the.    *
16bb0 2a 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73  * rowid */.    s
16bc0 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 52 6f  tatic char *azRo
16bd0 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64  wid[] = { "rowid
16be0 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f  ", "_rowid_", "o
16bf0 69 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69  id" };.    int i
16c00 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  , j;.    for(j=0
16c10 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
16c20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
16c30 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
16c40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
16c50 74 72 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a  tricmp(azRowid[j
16c60 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29  ],azCol[i])==0 )
16c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16c80 20 20 20 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c        if( i>nCol
16c90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
16ca0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
16cb0 20 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f 77   know that azRow
16cc0 69 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65  id[j] is not the
16cd0 20 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20   name of any.   
16ce0 20 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79       ** ordinary
16cf0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
16d00 61 62 6c 65 2e 20 20 56 65 72 69 66 79 20 74 68  able.  Verify th
16d10 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73  at azRowid[j] is
16d20 20 61 20 76 61 6c 69 64 0a 20 20 20 20 20 20 20   a valid.       
16d30 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65   ** name for the
16d40 20 72 6f 77 69 64 20 62 65 66 6f 72 65 20 61 64   rowid before ad
16d50 64 69 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c  ding it to azCol
16d60 5b 30 5d 2e 20 20 57 49 54 48 4f 55 54 20 52 4f  [0].  WITHOUT RO
16d70 57 49 44 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  WID.        ** t
16d80 61 62 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c 20  ables will fail 
16d90 74 68 69 73 20 6c 61 73 74 20 63 68 65 63 6b 20  this last check 
16da0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
16db0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
16dc0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d  lumn_metadata(p-
16dd0 3e 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77  >db,0,zTab,azRow
16de0 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29  id[j],0,0,0,0,0)
16df0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16e00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a  ==SQLITE_OK ) az
16e10 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64  Col[0] = azRowid
16e20 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  [j];.        bre
16e30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16e40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
16e50 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zCol;.}../*.** T
16e60 6f 67 67 6c 65 20 74 68 65 20 72 65 76 65 72 73  oggle the revers
16e70 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
16e80 63 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a  cts setting..*/.
16e90 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 67 67  static void togg
16ea0 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 73 71  leSelectOrder(sq
16eb0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 71  lite3 *db){.  sq
16ec0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16ed0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 65  t = 0;.  int iSe
16ee0 74 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61  tting = 0;.  cha
16ef0 72 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20  r zStmt[100];.  
16f00 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
16f10 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20 72  v2(db, "PRAGMA r
16f20 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
16f30 5f 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26  _selects", -1, &
16f40 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
16f50 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
16f60 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
16f70 20 29 7b 0a 20 20 20 20 69 53 65 74 74 69 6e 67   ){.    iSetting
16f80 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
16f90 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
16fa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
16fb0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
16fc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
16fd0 74 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29  tf(sizeof(zStmt)
16fe0 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20  , zStmt,.       
16ff0 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
17000 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
17010 73 28 25 64 29 22 2c 20 21 69 53 65 74 74 69 6e  s(%d)", !iSettin
17020 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  g);.  sqlite3_ex
17030 65 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c  ec(db, zStmt, 0,
17040 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
17050 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66 65   This is a diffe
17060 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f  rent callback ro
17070 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64  utine used for d
17080 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  umping the datab
17090 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77  ase..** Each row
170a0 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68 69   received by thi
170b0 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  s callback consi
170c0 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  sts of a table n
170d0 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ame,.** the tabl
170e0 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22 20  e type ("index" 
170f0 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20  or "table") and 
17100 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68  SQL to create th
17110 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  e table..** This
17120 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
17130 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66 69  print text suffi
17140 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74  cient to recreat
17150 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e the table..*/.
17160 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f  static int dump_
17170 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
17180 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
17190 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
171a0 72 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a  r **azNotUsed){.
171b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
171c0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
171d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
171e0 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
171f0 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c  r *zSql;.  Shell
17200 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
17210 6c 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a  lState *)pArg;..
17220 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17230 45 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  ER(azNotUsed);. 
17240 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 20 72   if( nArg!=3 ) r
17250 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54 61 62 6c  eturn 1;.  zTabl
17260 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
17270 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zType = azArg[1]
17280 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67  ;.  zSql = azArg
17290 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72 63  [2];..  if( strc
172a0 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
172b0 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
172c0 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
172d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45  tf(p->out, "DELE
172e0 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  TE FROM sqlite_s
172f0 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20  equence;\n");.  
17300 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
17310 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74  3_strglob("sqlit
17320 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65  e_stat?", zTable
17330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  )==0 ){.    raw_
17340 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
17350 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
17360 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65  aster;\n");.  }e
17370 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
17380 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
17390 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
173a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
173b0 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
173c0 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  ql, "CREATE VIRT
173d0 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d  UAL TABLE", 20)=
173e0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
173f0 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70  zIns;.    if( !p
17400 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
17410 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
17420 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
17430 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
17440 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  hema=ON;\n");.  
17450 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
17460 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d  chema = 1;.    }
17470 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69  .    zIns = sqli
17480 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
17490 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
174a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74   sqlite_master(t
174b0 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
174c0 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22  e,rootpage,sql)"
174d0 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  .       "VALUES(
174e0 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71  'table','%q','%q
174f0 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20  ',0,'%q');",.   
17500 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62      zTable, zTab
17510 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 75  le, zSql);.    u
17520 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
17530 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29  t, "%s\n", zIns)
17540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
17550 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65  ee(zIns);.    re
17560 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
17570 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61  .    printSchema
17580 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53 71  Line(p->out, zSq
17590 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a  l, ";\n");.  }..
175a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79    if( strcmp(zTy
175b0 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20  pe, "table")==0 
175c0 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  ){.    ShellText
175d0 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68   sSelect;.    Sh
175e0 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b 0a  ellText sTable;.
175f0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
17600 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
17610 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73 74   char *savedDest
17620 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 73  Table;.    int s
17630 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20 61  avedMode;..    a
17640 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c 75  zCol = tableColu
17650 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c 65  mnList(p, zTable
17660 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
17670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
17680 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
17690 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
176a0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f     /* Always quo
176b0 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
176c0 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61 70  e, even if it ap
176d0 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72 65  pears to be pure
176e0 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69   ascii,.    ** i
176f0 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20 6b  n case it is a k
17700 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53  eyword. Ex:  INS
17710 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65 22  ERT INTO "table"
17720 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69 74   ... */.    init
17730 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20  Text(&sTable);. 
17740 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
17750 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 71  Table, zTable, q
17760 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29  uoteChar(zTable)
17770 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72 65  );.    /* If pre
17780 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77 69  serving the rowi
17790 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20  d, add a column 
177a0 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20 74  list after the t
177b0 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 2a  able name..    *
177c0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
177d0 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  :  "INSERT INTO 
177e0 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c  tab(rowid,a,b,c,
177f0 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e 29  ...) VALUES(...)
17800 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64  ".    ** instead
17810 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22 49   of the usual "I
17820 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20 56  NSERT INTO tab V
17830 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20 20  ALUES(...)"..   
17840 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   */.    if( azCo
17850 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70  l[0] ){.      ap
17860 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
17870 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  , "(", 0);.     
17880 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
17890 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ble, azCol[0], 0
178a0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
178b0 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
178c0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
178d0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 2c  Text(&sTable, ",
178e0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
178f0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
17900 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f  e, azCol[i], quo
17910 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29  teChar(azCol[i])
17920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17930 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
17940 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20  ble, ")", 0);.  
17950 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c    }..    /* Buil
17960 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  d an appropriate
17970 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17980 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78  t */.    initTex
17990 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
179a0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
179b0 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22 2c  lect, "SELECT ",
179c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43   0);.    if( azC
179d0 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
179e0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
179f0 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29  ct, azCol[0], 0)
17a00 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
17a10 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22  xt(&sSelect, ","
17a20 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
17a30 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
17a40 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ]; i++){.      a
17a50 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
17a60 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  ct, azCol[i], qu
17a70 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
17a80 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
17a90 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  Col[i+1] ){.    
17aa0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
17ab0 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29  sSelect, ",", 0)
17ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17ad0 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69      freeColumnLi
17ae0 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 61  st(azCol);.    a
17af0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
17b00 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30 29  ct, " FROM ", 0)
17b10 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
17b20 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c  (&sSelect, zTabl
17b30 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61  e, quoteChar(zTa
17b40 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76 65  ble));..    save
17b50 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d 3e  dDestTable = p->
17b60 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  zDestTable;.    
17b70 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d  savedMode = p->m
17b80 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  ode;.    p->zDes
17b90 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65 2e  tTable = sTable.
17ba0 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  z;.    p->mode =
17bb0 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45   p->cMode = MODE
17bc0 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20  _Insert;.    rc 
17bd0 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e  = shell_exec(p->
17be0 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73  db, sSelect.z, s
17bf0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
17c00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
17c10 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
17c20 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
17c30 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
17c40 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
17c50 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
17c60 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
17c70 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
17c80 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
17c90 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e    shell_exec(p->
17ca0 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73  db, sSelect.z, s
17cb0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
17cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  , 0);.      togg
17cd0 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
17ce0 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >db);.    }.    
17cf0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
17d00 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
17d10 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61      p->mode = sa
17d20 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65  vedMode;.    fre
17d30 65 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  eText(&sTable);.
17d40 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 53      freeText(&sS
17d50 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
17d60 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  rc ) p->nErr++;.
17d70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17d80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75  }../*.** Run zQu
17d90 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63  ery.  Use dump_c
17da0 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65  allback() as the
17db0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
17dc0 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  e so that.** the
17dd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17de0 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70 75   query are outpu
17df0 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65  t as SQL stateme
17e00 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nts..**.** If we
17e10 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f   get a SQLITE_CO
17e20 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72  RRUPT error, rer
17e30 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66 74  un the query aft
17e40 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20  er appending.** 
17e50 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
17e60 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64  DESC" to the end
17e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17e80 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
17e90 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
17ea0 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20  ate *p,.  const 
17eb0 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a  char *zQuery.){.
17ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
17ed0 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72 63   *zErr = 0;.  rc
17ee0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
17ef0 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64  p->db, zQuery, d
17f00 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
17f10 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72   &zErr);.  if( r
17f20 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
17f30 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
17f40 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20  Q2;.    int len 
17f50 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72  = strlen30(zQuer
17f60 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  y);.    raw_prin
17f70 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
17f80 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45  *** CORRUPTION E
17f90 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  RROR *******/\n"
17fa0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20  );.    if( zErr 
17fb0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
17fc0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
17fd0 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  ***** %s ******/
17fe0 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
17ff0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18000 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45 72 72  Err);.      zErr
18010 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18020 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65  zQ2 = malloc( le
18030 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28  n+100 );.    if(
18040 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e   zQ2==0 ) return
18050 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
18060 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30  _snprintf(len+10
18070 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45  0, zQ2, "%s ORDE
18080 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
18090 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  , zQuery);.    r
180a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
180b0 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d  (p->db, zQ2, dum
180c0 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  p_callback, p, &
180d0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
180e0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
180f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
18100 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25  /****** ERROR: %
18110 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
18120 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rr);.    }else{.
18130 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18140 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  E_CORRUPT;.    }
18150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18160 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66 72 65  e(zErr);.    fre
18170 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65  e(zQ2);.  }.  re
18180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18190 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70  * Text of a help
181a0 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74   message.*/.stat
181b0 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20  ic char zHelp[] 
181c0 3d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  =.#ifndef SQLITE
181d0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
181e0 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c  ION.  ".auth ON|
181f0 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 53 68  OFF           Sh
18200 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ow authorizer ca
18210 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64 69  llbacks\n".#endi
18220 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  f.  ".backup ?DB
18230 3f 20 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b  ? FILE      Back
18240 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  up DB (default \
18250 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45  "main\") to FILE
18260 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c  \n".  ".bail on|
18270 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 53 74  off           St
18280 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67  op after hitting
18290 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61   an error.  Defa
182a0 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62  ult OFF\n".  ".b
182b0 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20  inary on|off    
182c0 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79       Turn binary
182d0 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66   output on or of
182e0 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  f.  Default OFF\
182f0 6e 22 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f  n".  ".changes o
18300 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f  n|off        Sho
18310 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  w number of rows
18320 20 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c   changed by SQL\
18330 6e 22 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f  n".  ".check GLO
18340 42 20 20 20 20 20 20 20 20 20 20 20 20 46 61 69  B            Fai
18350 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63  l if output sinc
18360 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73  e .testcase does
18370 20 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20   not match\n".  
18380 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20  ".clone NEWDB   
18390 20 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61          Clone da
183a0 74 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72  ta into NEWDB fr
183b0 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  om the existing 
183c0 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e  database\n".  ".
183d0 64 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20  databases       
183e0 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
183f0 20 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74   and files of at
18400 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
18410 5c 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f  \n".  ".dbinfo ?
18420 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 53 68  DB?           Sh
18430 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  ow status inform
18440 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
18450 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e  database\n".  ".
18460 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e  dump ?TABLE? ...
18470 20 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64        Dump the d
18480 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51  atabase in an SQ
18490 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22  L text format\n"
184a0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
184c0 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
184d0 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65   only dump table
184e0 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20  s matching\n".  
184f0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18500 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70            LIKE p
18510 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22  attern TABLE.\n"
18520 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66  .  ".echo on|off
18530 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
18540 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20  command echo on 
18550 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71  or off\n".  ".eq
18560 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20  p on|off|full   
18570 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69      Enable or di
18580 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20  sable automatic 
18590 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
185a0 41 4e 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20  AN\n".  ".exit  
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185c0 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
185d0 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c 61 69 6e  m\n".  ".explain
185e0 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54   ?on|off|auto? T
185f0 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70  urn EXPLAIN outp
18600 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66  ut mode on or of
18610 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69  f or to automati
18620 63 5c 6e 22 0a 20 20 22 2e 66 75 6c 6c 73 63 68  c\n".  ".fullsch
18630 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53  ema ?--indent? S
18640 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74  how schema and t
18650 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71  he content of sq
18660 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73  lite_stat tables
18670 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 73 20  \n".  ".headers 
18680 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75  on|off        Tu
18690 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65  rn display of he
186a0 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  aders on or off\
186b0 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20 20  n".  ".help     
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
186d0 77 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e  w this message\n
186e0 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c  ".  ".import FIL
186f0 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70 6f  E TABLE     Impo
18700 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
18710 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a  E into TABLE\n".
18720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18730 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
18740 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e  .  ".imposter IN
18750 44 45 58 20 54 41 42 4c 45 20 20 43 72 65 61 74  DEX TABLE  Creat
18760 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
18770 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20   TABLE on index 
18780 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69 66 0a  INDEX\n".#endif.
18790 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
187a0 4c 45 3f 20 20 20 20 20 20 20 53 68 6f 77 20 6e  LE?       Show n
187b0 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64 65  ames of all inde
187c0 78 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  xes\n".  "      
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187e0 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
187f0 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77  ified, only show
18800 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74 61 62   indexes for tab
18810 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18830 20 20 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45     matching LIKE
18840 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
18850 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n".#ifdef SQLITE
18860 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
18870 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45    ".iotrace FILE
18880 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65            Enable
18890 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20   I/O diagnostic 
188a0 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c  logging to FILE\
188b0 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69  n".#endif.  ".li
188c0 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c  mit ?LIMIT? ?VAL
188d0 3f 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63  ?   Display or c
188e0 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
188f0 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
18900 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74 20 4f  IT\n".  ".lint O
18910 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20  PTIONS          
18920 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c  Report potential
18930 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 20   schema issues. 
18940 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20  Options:\n".  " 
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e 64          fkey-ind
18970 65 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d 69  exes     Find mi
18980 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  ssing foreign ke
18990 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23 69 66  y indexes\n".#if
189a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
189b0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
189c0 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
189d0 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20 61  NTRY?     Load a
189e0 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72  n extension libr
189f0 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ary\n".#endif.  
18a00 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20  ".log FILE|off  
18a10 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67          Turn log
18a20 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ging on or off. 
18a30 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64   FILE can be std
18a40 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20  err/stdout\n".  
18a50 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42  ".mode MODE ?TAB
18a60 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70  LE?     Set outp
18a70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f  ut mode where MO
18a80 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22  DE is one of:\n"
18a90 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 63               asc
18ab0 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f  ii    Columns/ro
18ac0 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  ws delimited by 
18ad0 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c 6e 22  0x1F and 0x1E\n"
18ae0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 76               csv
18b00 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61        Comma-sepa
18b10 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
18b20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
18b30 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
18b40 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
18b50 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
18b60 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20   .width)\n".  " 
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20          html    
18b90 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f   HTML <table> co
18ba0 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69    insert   SQL i
18bd0 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  nsert statements
18be0 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20   for TABLE\n".  
18bf0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18c00 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20            line  
18c10 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
18c20 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20   line\n".  "    
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61       list     Va
18c50 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62  lues delimited b
18c60 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22 20 20  y \"|\"\n".  "  
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 71 75 6f 74 65 20 20 20 20         quote    
18c90 45 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61  Escape answers a
18ca0 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20 20 22  s for SQL\n".  "
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20 20           tabs   
18cd0 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20    Tab-separated 
18ce0 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54        tcl      T
18d10 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
18d20 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75  \n".  ".nullvalu
18d30 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 55 73  e STRING      Us
18d40 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
18d50 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
18d60 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 46 49 4c  \n".  ".once FIL
18d70 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 4f 75  ENAME         Ou
18d80 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78  tput for the nex
18d90 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e  t SQL command on
18da0 6c 79 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e  ly to FILENAME\n
18db0 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 2d 2d 6e 65  ".  ".open ?--ne
18dc0 77 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73  w? ?FILE?   Clos
18dd0 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
18de0 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46  ase and reopen F
18df0 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ILE\n".  "      
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 54 68 65 20 2d 2d 6e 65 77 20 73 74 61     The --new sta
18e20 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70 74  rts with an empt
18e30 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e 6f 75  y file\n".  ".ou
18e40 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d 45 3f 20  tput ?FILENAME? 
18e50 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
18e60 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f 72 20 73  to FILENAME or s
18e70 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69  tdout\n".  ".pri
18e80 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
18e90 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c     Print literal
18ea0 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70   STRING\n".  ".p
18eb0 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49  rompt MAIN CONTI
18ec0 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74 68 65  NUE  Replace the
18ed0 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
18ee0 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20  s\n".  ".quit   
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
18f00 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
18f10 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  \n".  ".read FIL
18f20 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45 78  ENAME         Ex
18f30 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c  ecute SQL in FIL
18f40 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73  ENAME\n".  ".res
18f50 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20  tore ?DB? FILE  
18f60 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
18f70 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
18f80 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
18f90 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76   FILE\n".  ".sav
18fa0 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  e FILE          
18fb0 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f     Write in-memo
18fc0 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f  ry database into
18fd0 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61   FILE\n".  ".sca
18fe0 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20  nstats on|off   
18ff0 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f     Turn sqlite3_
19000 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
19010 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20  ) metrics on or 
19020 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d  off\n".  ".schem
19030 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20  a ?PATTERN?     
19040 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45   Show the CREATE
19050 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63   statements matc
19060 68 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22 0a  hing PATTERN\n".
19070 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64               Add
19090 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70 72   --indent for pr
190a0 65 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e 22  etty-printing\n"
190b0 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 2d  .  ".selftest ?-
190c0 2d 69 6e 69 74 3f 20 20 20 20 20 52 75 6e 20 74  -init?     Run t
190d0 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ests defined in 
190e0 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
190f0 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61  le\n".  ".separa
19100 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20  tor COL ?ROW?   
19110 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d  Change the colum
19120 6e 20 73 65 70 61 72 61 74 6f 72 20 61 6e 64 20  n separator and 
19130 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20 72  optionally the r
19140 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ow\n".  "       
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 73 65 70 61 72 61 74 6f 72 20 66 6f 72 20    separator for 
19170 62 6f 74 68 20 74 68 65 20 6f 75 74 70 75 74 20  both the output 
19180 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74  mode and .import
19190 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28  \n".#if defined(
191a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
191b0 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
191c0 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20  on CMD ...      
191d0 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72   Create or contr
191e0 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a 23  ol sessions\n".#
191f0 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75  endif.  ".sha3su
19200 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20  m ?OPTIONS...?  
19210 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68  Compute a SHA3 h
19220 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  ash of database 
19230 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 2e 73  content\n".  ".s
19240 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e  hell CMD ARGS...
19250 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47       Run CMD ARG
19260 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
19270 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68   shell\n".  ".sh
19280 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
19290 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72      Show the cur
192a0 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
192b0 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73  various settings
192c0 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f  \n".  ".stats ?o
192d0 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53 68  n|off?        Sh
192e0 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e  ow stats or turn
192f0 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66   stats on or off
19300 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20 43  \n".  ".system C
19310 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75  MD ARGS...    Ru
19320 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
19330 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c   a system shell\
19340 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  n".  ".tables ?T
19350 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73  ABLE?        Lis
19360 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
19370 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
193a0 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74  ied, only list t
193b0 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
193c0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
193e0 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
193f0 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63 61 73  .\n".  ".testcas
19400 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 42  e NAME         B
19410 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67  egin redirecting
19420 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74   output to 'test
19430 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22  case-out.txt'\n"
19440 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20  .  ".timeout MS 
19450 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f             Try o
19460 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61  pening locked ta
19470 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c  bles for MS mill
19480 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e  iseconds\n".  ".
19490 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20  timer on|off    
194a0 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74        Turn SQL t
194b0 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  imer on or off\n
194c0 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45  ".  ".trace FILE
194d0 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74 70  |off        Outp
194e0 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
194f0 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
19500 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e 66  un\n".  ".vfsinf
19510 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  o ?AUX?         
19520 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
19530 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  t the top-level 
19540 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c 69  VFS\n".  ".vfsli
19550 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
19560 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61   List all availa
19570 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20 20 22  ble VFSes\n".  "
19580 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20  .vfsname ?AUX?  
19590 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65         Print the
195a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
195b0 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69   stack\n".  ".wi
195c0 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e  dth NUM1 NUM2 ..
195d0 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77  .   Set column w
195e0 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75  idths for \"colu
195f0 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22  mn\" mode\n".  "
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 20 20 20 20 4e 65 67 61 74 69 76           Negativ
19620 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a  e values right-j
19630 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66  ustify\n".;..#if
19640 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19650 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
19660 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c 70  /*.** Print help
19670 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19680 20 74 68 65 20 22 2e 73 65 73 73 69 6f 6e 73 22   the ".sessions"
19690 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64   command.*/.void
196a0 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53 68   session_help(Sh
196b0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
196c0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
196d0 74 2c 0a 20 20 20 20 22 2e 73 65 73 73 69 6f 6e  t,.    ".session
196e0 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d 41   ?NAME? SUBCOMMA
196f0 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a  ND ?ARGS...?\n".
19700 20 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20 69      "If ?NAME? i
19710 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66  s omitted, the f
19720 69 72 73 74 20 64 65 66 69 6e 65 64 20 73 65 73  irst defined ses
19730 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e 22  sion is used.\n"
19740 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e 64  .    "Subcommand
19750 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 61 74  s:\n".    "   at
19760 74 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20  tach TABLE      
19770 20 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41         Attach TA
19780 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63  BLE\n".    "   c
19790 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20  hangeset FILE   
197a0 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
197b0 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46  changeset into F
197c0 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63  ILE\n".    "   c
197d0 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
197e0 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e          Close on
197f0 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20 20  e session\n".   
19800 20 22 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f   "   enable ?BOO
19810 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65  LEAN?         Se
19820 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65  t or query the e
19830 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20 20  nable bit\n".   
19840 20 22 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42   "   filter GLOB
19850 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65  ...           Re
19860 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63  ject tables matc
19870 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20 20  hing GLOBs\n".  
19880 20 20 22 20 20 20 69 6e 64 69 72 65 63 74 20 3f    "   indirect ?
19890 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d  BOOLEAN?       M
198a0 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65  ark or query the
198b0 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73   indirect status
198c0 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 73 65 6d  \n".    "   isem
198d0 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20  pty             
198e0 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68       Query wheth
198f0 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69  er the session i
19900 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20 22  s empty\n".    "
19910 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
19920 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
19930 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
19940 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22  session names\n"
19950 0a 20 20 20 20 22 20 20 20 6f 70 65 6e 20 44 42  .    "   open DB
19960 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
19970 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73    Open a new ses
19980 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20 20  sion on DB\n".  
19990 20 20 22 20 20 20 70 61 74 63 68 73 65 74 20 46    "   patchset F
199a0 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57  ILE            W
199b0 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20  rite a patchset 
199c0 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 29  into FILE\n".  )
199d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ;.}.#endif.../* 
199e0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
199f0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
19a00 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68  process_input(Sh
19a10 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c  ellState *p, FIL
19a20 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  E *in);../*.** R
19a30 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
19a40 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e  of file zName in
19a50 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
19a60 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
19a70 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e  malloc64().** an
19a80 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
19a90 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  er to the buffer
19aa0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  . The caller is 
19ab0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
19ac0 66 72 65 65 69 6e 67 20 0a 2a 2a 20 74 68 65 20  freeing .** the 
19ad0 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49  memory. .**.** I
19ae0 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
19af0 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
19b00 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
19b10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
19b20 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
19b30 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
19b40 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
19b50 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
19b60 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
19b70 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
19b80 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
19b90 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
19ba0 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
19bb0 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
19bc0 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
19bd0 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
19be0 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
19bf0 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
19c00 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
19c10 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
19c20 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
19c30 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
19c40 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
19c50 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
19c60 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
19c70 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
19c80 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
19c90 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
19ca0 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
19cb0 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
19cc0 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
19cd0 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
19ce0 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
19cf0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
19d00 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
19d10 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
19d20 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
19d30 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
19d40 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
19d50 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
19d60 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
19d70 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  uf==0 ) return 0
19d80 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  ;.  nRead = frea
19d90 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
19da0 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
19db0 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
19dc0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
19dd0 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
19de0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
19df0 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
19e00 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
19e10 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
19e20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
19e30 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
19e40 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 72 65 61  tion of the "rea
19e50 64 66 69 6c 65 28 58 29 22 20 53 51 4c 20 66 75  dfile(X)" SQL fu
19e60 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 6e 74  nction.  The ent
19e70 69 72 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  ire content.** o
19e80 66 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  f the file named
19e90 20 58 20 69 73 20 72 65 61 64 20 61 6e 64 20 72   X is read and r
19ea0 65 74 75 72 6e 65 64 20 61 73 20 61 20 42 4c 4f  eturned as a BLO
19eb0 42 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  B.  NULL is retu
19ec0 72 6e 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 66  rned.** if the f
19ed0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
19ee0 73 74 20 6f 72 20 69 73 20 75 6e 72 65 61 64 61  st or is unreada
19ef0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
19f00 6f 69 64 20 72 65 61 64 66 69 6c 65 46 75 6e 63  oid readfileFunc
19f10 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
19f20 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
19f30 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
19f40 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
19f50 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
19f60 20 2a 7a 4e 61 6d 65 3b 0a 20 20 76 6f 69 64 20   *zName;.  void 
19f70 2a 70 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75  *pBuf;.  int nBu
19f80 66 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f;..  UNUSED_PAR
19f90 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
19fa0 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
19fb0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
19fc0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
19fd0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
19fe0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 75   ) return;.  pBu
19ff0 66 20 3d 20 72 65 61 64 46 69 6c 65 28 7a 4e 61  f = readFile(zNa
1a000 6d 65 2c 20 26 6e 42 75 66 29 3b 0a 20 20 69 66  me, &nBuf);.  if
1a010 28 20 70 42 75 66 20 29 20 73 71 6c 69 74 65 33  ( pBuf ) sqlite3
1a020 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
1a030 74 65 78 74 2c 20 70 42 75 66 2c 20 6e 42 75 66  text, pBuf, nBuf
1a040 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
1a050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1a060 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1a070 22 77 72 69 74 65 66 69 6c 65 28 58 2c 59 29 22  "writefile(X,Y)"
1a080 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
1a090 54 68 65 20 61 72 67 75 6d 65 6e 74 20 59 0a 2a  The argument Y.*
1a0a0 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
1a0b0 6f 20 66 69 6c 65 20 58 2e 20 20 54 68 65 20 6e  o file X.  The n
1a0c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1a0d0 72 69 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e  ritten is return
1a0e0 65 64 2e 20 20 4f 72 0a 2a 2a 20 4e 55 4c 4c 20  ed.  Or.** NULL 
1a0f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
1a100 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
1a110 6f 6e 67 2c 20 73 75 63 68 20 61 73 20 62 65 69  ong, such as bei
1a120 6e 67 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  ng unable to ope
1a130 6e 0a 2a 2a 20 66 69 6c 65 20 58 20 66 6f 72 20  n.** file X for 
1a140 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  writing..*/.stat
1a150 69 63 20 76 6f 69 64 20 77 72 69 74 65 66 69 6c  ic void writefil
1a160 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
1a170 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1a180 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
1a190 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1a1a0 2a 61 72 67 76 0a 29 7b 0a 20 20 46 49 4c 45 20  *argv.){.  FILE 
1a1b0 2a 6f 75 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *out;.  const ch
1a1c0 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
1a1d0 5f 69 6e 74 36 34 20 72 63 3b 0a 20 20 63 6f 6e  _int64 rc;.  con
1a1e0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
1a1f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a200 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 46 69  TER(argc);.  zFi
1a210 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
1a220 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1a230 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1a240 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20   if( zFile==0 ) 
1a250 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20  return;.  out = 
1a260 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62  fopen(zFile, "wb
1a270 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
1a280 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
1a290 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1a2a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
1a2b0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
1a2c0 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   z==0 ){.    rc 
1a2d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1a2e0 20 20 72 63 20 3d 20 66 77 72 69 74 65 28 7a 2c    rc = fwrite(z,
1a2f0 20 31 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   1, sqlite3_valu
1a300 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
1a310 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 66 63  , out);.  }.  fc
1a320 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 73 71 6c  lose(out);.  sql
1a330 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
1a340 34 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  4(context, rc);.
1a350 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1a360 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1a370 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  SION)./*.** Clos
1a380 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53  e a single OpenS
1a390 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e  ession object an
1a3a0 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  d release all of
1a3b0 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a   its associated.
1a3c0 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ** resources..*/
1a3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
1a3e0 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53  sion_close(OpenS
1a3f0 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
1a400 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
1a410 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c  lite3session_del
1a420 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  ete(pSession->p)
1a430 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1a440 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65  (pSession->zName
1a450 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a460 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
1a470 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
1a480 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1a490 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29  on->azFilter[i])
1a4a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1a4b0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
1a4c0 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73  zFilter);.  mems
1a4d0 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20  et(pSession, 0, 
1a4e0 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69  sizeof(OpenSessi
1a4f0 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  on));.}.#endif..
1a500 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
1a510 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1a520 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20  cts and release 
1a530 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72  all associated r
1a540 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66  esources..*/.#if
1a550 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a560 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1a570 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
1a580 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68  ion_close_all(Sh
1a590 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
1a5a0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1a5b0 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
1a5c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69   i++){.    sessi
1a5d0 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65  on_close(&p->aSe
1a5e0 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20  ssion[i]);.  }. 
1a5f0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30   p->nSession = 0
1a600 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1a610 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  ne session_close
1a620 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a  _all(X).#endif..
1a630 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1a640 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c  tion of the xFil
1a650 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ter function for
1a660 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e   an open session
1a670 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74  .  Omit.** any t
1a680 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22  ables named by "
1a690 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22  .session filter"
1a6a0 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68   but let all oth
1a6b0 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68  er table through
1a6c0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
1a6d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
1a6e0 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69  ESSION).static i
1a6f0 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65  nt session_filte
1a700 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f  r(void *pCtx, co
1a710 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
1a720 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a  .  OpenSession *
1a730 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e  pSession = (Open
1a740 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20  Session*)pCtx;. 
1a750 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1a760 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1a770 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1a780 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1a790 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e  rglob(pSession->
1a7a0 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61  azFilter[i], zTa
1a7b0 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  b)==0 ) return 0
1a7c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1a7d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a7e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1a7f0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1a800 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1a810 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20   then open it.  
1a820 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  If.** the databa
1a830 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e  se fails to open
1a840 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  , print an error
1a850 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69   message and exi
1a860 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1a870 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53  d open_db(ShellS
1a880 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6b 65 65  tate *p, int kee
1a890 70 41 6c 69 76 65 29 7b 0a 20 20 69 66 28 20 70  pAlive){.  if( p
1a8a0 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ->db==0 ){.    s
1a8b0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1a8c0 65 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e();.    sqlite3
1a8d0 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65  _open(p->zDbFile
1a8e0 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  name, &p->db);. 
1a8f0 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d     globalDb = p-
1a900 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >db;.    if( p->
1a910 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  db==0 || SQLITE_
1a920 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
1a930 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
1a940 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1a950 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75  stderr,"Error: u
1a960 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
1a970 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25  tabase \"%s\": %
1a980 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1a990 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1a9a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1a9b0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  ->db));.      if
1a9c0 28 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65  ( keepAlive ) re
1a9d0 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74  turn;.      exit
1a9e0 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  (1);.    }.#ifnd
1a9f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1aa00 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
1aa10 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
1aa20 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
1aa30 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69  p->db, 1);.#endi
1aa40 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
1aa50 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1aa60 3e 64 62 2c 20 22 72 65 61 64 66 69 6c 65 22 2c  >db, "readfile",
1aa70 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1aa80 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 72 65 61 64 66 69 6c 65 46 75 6e 63 2c 20 30 2c  readfileFunc, 0,
1aab0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1aac0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1aad0 28 70 2d 3e 64 62 2c 20 22 77 72 69 74 65 66 69  (p->db, "writefi
1aae0 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  le", 2, SQLITE_U
1aaf0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 20 20 20 77 72 69 74 65 66 69 6c 65 46 75 6e      writefileFun
1ab20 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  c, 0, 0);.    sq
1ab30 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1ab40 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1ab50 61 33 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  a3", 1, SQLITE_U
1ab60 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 20 20 20 73 68 61 33 46 75 6e 63 2c 20 30 2c      sha3Func, 0,
1ab90 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1aba0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1abb0 28 70 2d 3e 64 62 2c 20 22 73 68 61 33 22 2c 20  (p->db, "sha3", 
1abc0 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
1abd0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1abf0 68 61 33 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ha3Func, 0, 0);.
1ac00 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1ac10 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1ac20 62 2c 20 22 73 68 61 33 5f 71 75 65 72 79 22 2c  b, "sha3_query",
1ac30 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1ac40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 73 68 61 33 51 75 65 72 79 46 75 6e 63 2c 20 30  sha3QueryFunc, 0
1ac70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1ac80 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1ac90 6e 28 70 2d 3e 64 62 2c 20 22 73 68 61 33 5f 71  n(p->db, "sha3_q
1aca0 75 65 72 79 22 2c 20 32 2c 20 53 51 4c 49 54 45  uery", 2, SQLITE
1acb0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 20 73 68 61 33 51 75 65 72 79 46        sha3QueryF
1ace0 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
1acf0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61  }../*.** Do C-la
1ad00 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71  nguage style deq
1ad10 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  uoting..**.**   
1ad20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a   \a    -> alarm.
1ad30 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62  **    \b    -> b
1ad40 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c  ackspace.**    \
1ad50 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20  t    -> tab.**  
1ad60 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69    \n    -> newli
1ad70 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d  ne.**    \v    -
1ad80 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a  > vertical tab.*
1ad90 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f  *    \f    -> fo
1ada0 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72  rm feed.**    \r
1adb0 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20      -> carriage 
1adc0 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20  return.**    \s 
1add0 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20     -> space.**  
1ade0 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20    \"    -> ".** 
1adf0 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a     \'    -> '.**
1ae00 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63      \\    -> bac
1ae10 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e  kslash.**    \NN
1ae20 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72  N  -> ascii char
1ae30 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74  acter NNN in oct
1ae40 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  al.*/.static voi
1ae50 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  d resolve_backsl
1ae60 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a  ashes(char *z){.
1ae70 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
1ae80 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a  ar c;.  while( *
1ae90 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20  z && *z!='\\' ) 
1aea0 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  z++;.  for(i=j=0
1aeb0 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
1aec0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1aed0 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a  if( c=='\\' && z
1aee0 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  [i+1]!=0 ){.    
1aef0 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20    c = z[++i];.  
1af00 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29      if( c=='a' )
1af10 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1af20 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  a';.      }else 
1af30 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20  if( c=='b' ){.  
1af40 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
1af50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1af60 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
1af70 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20    c = '\t';.    
1af80 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1af90 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  n' ){.        c 
1afa0 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65  = '\n';.      }e
1afb0 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29  lse if( c=='v' )
1afc0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1afd0 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  v';.      }else 
1afe0 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20  if( c=='f' ){.  
1aff0 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a        c = '\f';.
1b000 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b010 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
1b020 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
1b030 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1b040 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  "' ){.        c 
1b050 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '"';.      }el
1b060 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29  se if( c=='\'' )
1b070 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1b080 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  '';.      }else 
1b090 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
1b0a0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b         c = '\\';
1b0b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b0c0 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37   c>='0' && c<='7
1b0d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d  ' ){.        c -
1b0e0 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  = '0';.        i
1b0f0 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
1b100 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
1b110 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
1b120 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
1b130 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
1b140 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
1b150 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
1b160 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
1b170 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
1b180 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
1b190 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
1b1a0 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
1b1b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b1c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
1b1d0 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = c;.  }.  if(
1b1e0 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b   j<i ) z[j] = 0;
1b1f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b200 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1b210 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69  hexadecimal digi
1b220 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  t.  Return -1 if
1b230 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73   the input.** is
1b240 20 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74   not a hex digit
1b250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b260 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68  hexDigitValue(ch
1b270 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d  ar c){.  if( c>=
1b280 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20  '0' && c<='9' ) 
1b290 72 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a  return c - '0';.
1b2a0 20 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20    if( c>='a' && 
1b2b0 63 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20  c<='f' ) return 
1b2c0 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20  c - 'a' + 10;.  
1b2d0 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c  if( c>='A' && c<
1b2e0 3d 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='F' ) return c 
1b2f0 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65  - 'A' + 10;.  re
1b300 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1b310 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67  * Interpret zArg
1b320 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76   as an integer v
1b330 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77  alue, possibly w
1b340 69 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f  ith suffixes..*/
1b350 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1b360 69 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c  int64 integerVal
1b370 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ue(const char *z
1b380 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Arg){.  sqlite3_
1b390 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73  int64 v = 0;.  s
1b3a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1b3b0 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66  ct { char *zSuff
1b3c0 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d  ix; int iMult; }
1b3d0 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20   aMult[] = {.   
1b3e0 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d   { "KiB", 1024 }
1b3f0 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31  ,.    { "MiB", 1
1b400 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
1b410 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30  { "GiB", 1024*10
1b420 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
1b430 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a   "KB",  1000 },.
1b440 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30      { "MB",  100
1b450 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47  0000 },.    { "G
1b460 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20  B",  1000000000 
1b470 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20  },.    { "K",   
1b480 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1000 },.    { "M
1b490 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a  ",   1000000 },.
1b4a0 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30      { "G",   100
1b4b0 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
1b4c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
1b4d0 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  sNeg = 0;.  if( 
1b4e0 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  zArg[0]=='-' ){.
1b4f0 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20      isNeg = 1;. 
1b500 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c     zArg++;.  }el
1b510 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  se if( zArg[0]==
1b520 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b  '+' ){.    zArg+
1b530 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72  +;.  }.  if( zAr
1b540 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
1b550 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
1b560 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67   int x;.    zArg
1b570 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65   += 2;.    while
1b580 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56  ( (x = hexDigitV
1b590 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d  alue(zArg[0]))>=
1b5a0 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28  0 ){.      v = (
1b5b0 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20  v<<4) + x;.     
1b5c0 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
1b5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1b5e0 65 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b  e( IsDigit(zArg[
1b5f0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  0]) ){.      v =
1b600 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20   v*10 + zArg[0] 
1b610 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72  - '0';.      zAr
1b620 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  g++;.    }.  }. 
1b630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1b640 79 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b  ySize(aMult); i+
1b650 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1b660 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c  te3_stricmp(aMul
1b670 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41  t[i].zSuffix, zA
1b680 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
1b690 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d  v *= aMult[i].iM
1b6a0 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ult;.      break
1b6b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b6c0 74 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a  turn isNeg? -v :
1b6d0 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   v;.}../*.** Int
1b6e0 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65  erpret zArg as e
1b6f0 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1b700 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   or a boolean va
1b710 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  lue.  Return 1 o
1b720 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20  r 0.** for TRUE 
1b730 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75  and FALSE.  Retu
1b740 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rn the integer v
1b750 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69  alue if appropri
1b760 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
1b770 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  nt booleanValue(
1b780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1b790 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1b7a0 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26  ( zArg[0]=='0' &
1b7b0 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29  & zArg[1]=='x' )
1b7c0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68  {.    for(i=2; h
1b7d0 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72  exDigitValue(zAr
1b7e0 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d  g[i])>=0; i++){}
1b7f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1b800 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d  r(i=0; zArg[i]>=
1b810 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d  '0' && zArg[i]<=
1b820 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a  '9'; i++){}.  }.
1b830 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72    if( i>0 && zAr
1b840 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  g[i]==0 ) return
1b850 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61   (int)(integerVa
1b860 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66  lue(zArg) & 0xff
1b870 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73  ffffff);.  if( s
1b880 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1b890 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c  Arg, "on")==0 ||
1b8a0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1b8b0 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
1b8c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1b8d0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1b8e0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1b8f0 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71   "off")==0 || sq
1b900 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1b910 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20  rg,"no")==0 ){. 
1b920 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b930 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
1b940 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
1b950 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  ot a boolean val
1b960 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75  ue: \"%s\". Assu
1b970 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c  ming \"no\".\n",
1b980 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29  .          zArg)
1b990 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1b9a0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c  ./*.** Set or cl
1b9b0 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67  ear a shell flag
1b9c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20   according to a 
1b9d0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
1b9e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1b9f0 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65  tOrClearFlag(She
1ba00 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69  llState *p, unsi
1ba10 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73  gned mFlag, cons
1ba20 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
1ba30 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
1ba40 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53  e(zArg) ){.    S
1ba50 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d  hellSetFlag(p, m
1ba60 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Flag);.  }else{.
1ba70 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c      ShellClearFl
1ba80 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1ba90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1baa0 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c   an output file,
1bab0 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20   assuming it is 
1bac0 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74  not stderr or st
1bad0 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1bae0 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  oid output_file_
1baf0 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a  close(FILE *f){.
1bb00 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74    if( f && f!=st
1bb10 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72  dout && f!=stder
1bb20 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d  r ) fclose(f);.}
1bb30 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
1bb40 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69  pen an output fi
1bb50 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20  le.   The names 
1bb60 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74  "stdout" and "st
1bb70 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63  derr" are.** rec
1bb80 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74  ognized and do t
1bb90 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20  he right thing. 
1bba0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1bbb0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a  d if the output.
1bbc0 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22  ** filename is "
1bbd0 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  off"..*/.static 
1bbe0 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c  FILE *output_fil
1bbf0 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
1bc00 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 46 49 4c  r *zFile){.  FIL
1bc10 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63  E *f;.  if( strc
1bc20 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74  mp(zFile,"stdout
1bc30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1bc40 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65   stdout;.  }else
1bc50 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1bc60 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20  e, "stderr")==0 
1bc70 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72  ){.    f = stder
1bc80 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  r;.  }else if( s
1bc90 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66  trcmp(zFile, "of
1bca0 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  f")==0 ){.    f 
1bcb0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1bcc0 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c    f = fopen(zFil
1bcd0 65 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66  e, "wb");.    if
1bce0 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( f==0 ){.      
1bcf0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1bd00 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
1bd10 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
1bd20 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ", zFile);.    }
1bd30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
1bd40 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
1bd50 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42  (SQLITE_UNTESTAB
1bd60 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e 65 64  LE).#if !defined
1bd70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
1bd80 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
1bd90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1bda0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a  TING_POINT)./*.*
1bdb0 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  * A routine for 
1bdc0 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20  handling output 
1bdd0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61  from sqlite3_tra
1bde0 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ce()..*/.static 
1bdf0 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61  int sql_trace_ca
1be00 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e  llback(.  unsign
1be10 65 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64  ed mType,.  void
1be20 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a   *pArg,.  void *
1be30 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29  pP,.  void *pX.)
1be40 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46  {.  FILE *f = (F
1be50 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55  ILE*)pArg;.  UNU
1be60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 54  SED_PARAMETER(mT
1be70 79 70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ype);.  UNUSED_P
1be80 41 52 41 4d 45 54 45 52 28 70 50 29 3b 0a 20 20  ARAMETER(pP);.  
1be90 69 66 28 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e  if( f ){.    con
1bea0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
1beb0 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20  nst char*)pX;.  
1bec0 20 20 69 6e 74 20 69 20 3d 20 28 69 6e 74 29 73    int i = (int)s
1bed0 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 77 68  trlen(z);.    wh
1bee0 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d  ile( i>0 && z[i-
1bef0 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20  1]==';' ){ i--; 
1bf00 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
1bf10 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20  f(f, "%.*s;\n", 
1bf20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i, z);.  }.  ret
1bf30 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1bf40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1bf50 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
1bf60 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
1bf70 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
1bf80 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
1bf90 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
1bfa0 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
1bfb0 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
1bfc0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1bfd0 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
1bfe0 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
1bff0 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
1c000 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
1c010 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1c020 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
1c030 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c  SV and other fil
1c040 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a  es for import..*
1c050 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1c060 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72   ImportCtx Impor
1c070 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70  tCtx;.struct Imp
1c080 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74  ortCtx {.  const
1c090 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f   char *zFile;  /
1c0a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
1c0b0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49  put file */.  FI
1c0c0 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
1c0d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53    /* Read the CS
1c0e0 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73  V text from this
1c0f0 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
1c100 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1c110 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
1c120 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61  lated text for a
1c130 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
1c140 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c150 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1c160 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74  es in z */.  int
1c170 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
1c180 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
1c190 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20  ted for z[] */. 
1c1a0 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
1c1b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1c1c0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
1c1d0 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20   int cTerm;     
1c1e0 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65       /* Characte
1c1f0 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  r that terminate
1c200 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  d the most recen
1c210 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  t field */.  int
1c220 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20   cColSep;       
1c230 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73   /* The column s
1c240 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
1c250 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c  er.  (Usually ",
1c260 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77  ") */.  int cRow
1c270 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Sep;        /* T
1c280 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
1c290 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73   character.  (Us
1c2a0 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d  ually "\n") */.}
1c2b0 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73  ;../* Append a s
1c2c0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b  ingle byte to z[
1c2d0 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ] */.static void
1c2e0 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1c2f0 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  har(ImportCtx *p
1c300 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20  , int c){.  if( 
1c310 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f  p->n+1>=p->nAllo
1c320 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
1c330 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20  oc += p->nAlloc 
1c340 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20  + 100;.    p->z 
1c350 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
1c360 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  c64(p->z, p->nAl
1c370 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
1c380 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  >z==0 ){.      r
1c390 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1c3a0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1c3b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
1c3c0 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (1);.    }.  }. 
1c3d0 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20   p->z[p->n++] = 
1c3e0 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52  (char)c;.}../* R
1c3f0 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
1c400 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20  ld of CSV text. 
1c410 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   Compatible with
1c420 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74   rfc4180 and ext
1c430 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ended.** with th
1c440 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69  e option of havi
1c450 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f  ng a separator o
1c460 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a  ther than ","..*
1c470 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20  *.**   +  Input 
1c480 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e  comes from p->in
1c490 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1c4a0 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20  results in p->z 
1c4b0 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20  of length p->n. 
1c4c0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70   Space to hold p
1c4d0 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  ->z comes.**    
1c4e0 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d    from sqlite3_m
1c4f0 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20  alloc64()..**   
1c500 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61  +  Use p->cSep a
1c510 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  s the column sep
1c520 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1c530 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20  ault is ","..** 
1c540 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
1c550 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
1c560 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1c570 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20  ult is "\n"..** 
1c580 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20    +  Keep track 
1c590 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  of the line numb
1c5a0 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a  er in p->nLine..
1c5b0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68  **   +  Store th
1c5c0 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
1c5d0 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20   terminates the 
1c5e0 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72  field in p->cTer
1c5f0 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20  m.  Store.**    
1c600 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d    EOF on end-of-
1c610 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65  file..**   +  Re
1c620 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f  port syntax erro
1c630 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a  rs on stderr.*/.
1c640 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c  static char *SQL
1c650 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65  ITE_CDECL csv_re
1c660 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
1c670 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
1c680 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
1c690 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
1c6a0 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
1c6b0 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
1c6c0 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
1c6d0 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
1c6e0 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
1c6f0 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
1c700 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
1c710 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1c720 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
1c730 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20    int pc, ppc;. 
1c740 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
1c750 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20   = p->nLine;.   
1c760 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b   int cQuote = c;
1c770 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20  .    pc = ppc = 
1c780 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  0;.    while( 1 
1c790 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  ){.      c = fge
1c7a0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
1c7b0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70   if( c==rSep ) p
1c7c0 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
1c7d0 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29   if( c==cQuote )
1c7e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  {.        if( pc
1c7f0 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
1c800 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20        pc = 0;.  
1c810 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1c820 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c830 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63    }.      if( (c
1c840 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==cSep && pc==cQ
1c850 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
1c860 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
1c870 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1c880 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63  | (c==rSep && pc
1c890 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63  =='\r' && ppc==c
1c8a0 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1c8b0 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d   (c==EOF && pc==
1c8c0 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b  cQuote).      ){
1c8d0 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e  .        do{ p->
1c8e0 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e  n--; }while( p->
1c8f0 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20  z[p->n]!=cQuote 
1c900 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1c910 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1c920 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c930 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
1c940 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20  uote && c!='\r' 
1c950 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1c960 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1c970 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64  %s:%d: unescaped
1c980 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22   %c character\n"
1c990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c9a0 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e    p->zFile, p->n
1c9b0 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
1c9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c9d0 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20   c==EOF ){.     
1c9e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1c9f0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
1ca00 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71  nterminated %c-q
1ca10 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a  uoted field\n",.
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  p->zFile, startL
1ca40 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20  ine, cQuote);.  
1ca50 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
1ca60 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
1ca70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ca80 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1ca90 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
1caa0 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20   ppc = pc;.     
1cab0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20   pc = c;.    }. 
1cac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1cad0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1cae0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1caf0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
1cb00 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1cb10 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
1cb20 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
1cb30 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
1cb40 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
1cb50 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1cb60 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
1cb70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
1cb80 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
1cb90 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1cba0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
1cbb0 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
1cbc0 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
1cbd0 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
1cbe0 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49  le field of ASCI
1cbf0 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74  I delimited text
1cc00 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
1cc10 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
1cc20 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
1cc30 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
1cc40 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
1cc50 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
1cc60 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
1cc70 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
1cc80 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
1cc90 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
1cca0 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
1ccb0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1ccc0 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46  default is "\x1F
1ccd0 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
1cce0 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
1ccf0 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
1cd00 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78  e default is "\x
1cd10 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  1E"..**   +  Kee
1cd20 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72  p track of the r
1cd30 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ow number in p->
1cd40 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
1cd50 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
1cd60 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1cd70 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
1cd80 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
1cd90 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
1cda0 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
1cdb0 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
1cdc0 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
1cdd0 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
1cde0 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
1cdf0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
1ce00 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20  field(ImportCtx 
1ce10 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *p){.  int c;.  
1ce20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43  int cSep = p->cC
1ce30 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65  olSep;.  int rSe
1ce40 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a  p = p->cRowSep;.
1ce50 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20    p->n = 0;.  c 
1ce60 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1ce70 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20    if( c==EOF || 
1ce80 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
1ce90 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
1cea0 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EOF;.    return 
1ceb0 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
1cec0 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
1ced0 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
1cee0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
1cef0 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
1cf00 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1cf10 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  n);.  }.  if( c=
1cf20 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e  =rSep ){.    p->
1cf30 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70  nLine++;.  }.  p
1cf40 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69  ->cTerm = c;.  i
1cf50 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1cf60 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  ->n] = 0;.  retu
1cf70 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn p->z;.}../*.*
1cf80 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
1cf90 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  r data for table
1cfa0 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20   zTable.  If an 
1cfb0 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68  error is seen wh
1cfc0 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f  ile.** moving fo
1cfd0 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f  rward, try to go
1cfe0 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65   backwards.  The
1cff0 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d   backwards movem
1d000 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72  ent won't.** wor
1d010 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  k for WITHOUT RO
1d020 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  WID tables..*/.s
1d030 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
1d040 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65  CloneData(.  She
1d050 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1d060 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1d070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1d080 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  le.){.  sqlite3_
1d090 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
1d0a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1d0b0 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
1d0c0 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
1d0d0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
1d0e0 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
1d0f0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
1d100 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
1d110 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 62  (int)strlen(zTab
1d120 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
1d130 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
1d140 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
1d150 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
1d160 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1d170 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1d180 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
1d190 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
1d1a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1d1b0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1d1c0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1d1d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1d1e0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1d1f0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1d200 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1d210 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d220 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1d230 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1d240 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1d250 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1d260 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1d270 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1d280 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
1d290 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1d2a0 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
1d2b0 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
1d2c0 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
1d2d0 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
1d2e0 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
1d2f0 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
1d300 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
1d310 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
1d320 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1d330 78 66 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xfer;.  }.  sqli
1d340 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
1d350 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
1d360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d370 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
1d380 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
1d390 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
1d3a0 62 6c 65 29 3b 0a 20 20 69 20 3d 20 28 69 6e 74  ble);.  i = (int
1d3b0 29 73 74 72 6c 65 6e 28 7a 49 6e 73 65 72 74 29  )strlen(zInsert)
1d3c0 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e  ;.  for(j=1; j<n
1d3d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63  ; j++){.    memc
1d3e0 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c  py(zInsert+i, ",
1d3f0 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d  ?", 2);.    i +=
1d400 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79   2;.  }.  memcpy
1d410 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22  (zInsert+i, ");"
1d420 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 3);.  rc = sql
1d430 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1d440 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20  newDb, zInsert, 
1d450 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29  -1, &pInsert, 0)
1d460 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d470 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1d480 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
1d490 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d4b0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
1d4c0 63 6f 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c  code(newDb), sql
1d4d0 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
1d4e0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
1d4f0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74  zQuery);.    got
1d500 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
1d510 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  .  }.  for(k=0; 
1d520 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77  k<2; k++){.    w
1d530 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1d540 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1d550 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1d560 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d570 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
1d580 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
1d590 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1d5a0 51 75 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20  Query, i) ){.   
1d5b0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1d5c0 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
1d5d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1d5e0 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74  ind_null(pInsert
1d5f0 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
1d600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d620 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
1d630 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
1d640 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1d650 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20  _int64(pInsert, 
1d660 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
1d670 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79  umn_int64(pQuery
1d680 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
1d690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
1d6b0 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
1d6c0 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
1d6d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
1d6e0 62 6c 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ble(pInsert, i+1
1d6f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1d700 5f 64 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69  _double(pQuery,i
1d710 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1d720 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d730 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
1d740 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
1d750 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d760 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
1d770 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20  Insert, i+1,.   
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
1d7a0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1d7b0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
1d7c0 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54     -1, SQLITE_ST
1d7f0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
1d800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d820 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
1d830 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
1d840 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
1d850 62 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  b(pInsert, i+1, 
1d860 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d870 6c 6f 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  lob(pQuery,i),. 
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d8b0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1d8c0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
1d900 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
1d910 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d930 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66        } /* End f
1d940 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  or */.      rc =
1d950 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
1d960 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66  nsert);.      if
1d970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d980 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
1d990 57 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  W && rc!=SQLITE_
1d9a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1d9b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1d9c0 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
1d9d0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78  s\n", sqlite3_ex
1d9e0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
1d9f0 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ewDb),.         
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1da10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
1da20 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wDb));.      }. 
1da30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1da40 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  et(pInsert);.   
1da50 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
1da60 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74  if( (cnt%spinRat
1da70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
1da80 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20   printf("%c\b", 
1da90 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69  "|/-\\"[(cnt/spi
1daa0 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20  nRate)%4]);.    
1dab0 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
1dac0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1dad0 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a  } /* End while *
1dae0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1daf0 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61  LITE_DONE ) brea
1db00 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  k;.    sqlite3_f
1db10 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1db20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1db30 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a  e(zQuery);.    z
1db40 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
1db50 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1db60 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52  * FROM \"%w\" OR
1db70 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
1db80 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  C;",.           
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72    zTable);.    r
1dbb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1dbc0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1dbd0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1dbe0 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1dbf0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1dc00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1dc10 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20  Warning: cannot 
1dc20 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b  step \"%s\" back
1dc30 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b  wards", zTable);
1dc40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1dc50 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66    }.  } /* End f
1dc60 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65  or(k=0...) */..e
1dc70 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20  nd_data_xfer:.  
1dc80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1dc90 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
1dca0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e  te3_finalize(pIn
1dcb0 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  sert);.  sqlite3
1dcc0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1dcd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
1dce0 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nsert);.}.../*.*
1dcf0 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
1dd00 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  r all rows of th
1dd10 65 20 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61  e schema that ma
1dd20 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72  tch zWhere.  For
1dd30 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e  .** each row, in
1dd40 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20  voke xForEach() 
1dd50 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65  on the object de
1dd60 66 69 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f  fined by that ro
1dd70 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  w..** If an erro
1dd80 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1dd90 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f   while moving fo
1dda0 72 77 61 72 64 20 74 68 72 6f 75 67 68 20 74 68  rward through th
1ddb0 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  e.** sqlite_mast
1ddc0 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67  er table, try ag
1ddd0 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77  ain moving backw
1dde0 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ards..*/.static 
1ddf0 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53  void tryToCloneS
1de00 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74  chema(.  ShellSt
1de10 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
1de20 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
1de30 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a  t char *zWhere,.
1de40 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63    void (*xForEac
1de50 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73  h)(ShellState*,s
1de60 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68  qlite3*,const ch
1de70 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
1de80 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
1de90 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
1dea0 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ry = 0;.  int rc
1deb0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1dec0 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  ed char *zName;.
1ded0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1dee0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1def0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
1df00 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71  ;..  zQuery = sq
1df10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1df20 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1df30 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1df40 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1df60 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65   WHERE %s", zWhe
1df70 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  re);.  rc = sqli
1df80 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1df90 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1dfa0 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1dfb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1dfc0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1dfd0 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20  r, "Error: (%d) 
1dfe0 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1e010 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
1e020 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1e030 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1e050 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
1e060 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
1e070 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28  ;.  }.  while( (
1e080 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1e090 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
1e0a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e  TE_ROW ){.    zN
1e0b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
1e0c0 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
1e0d0 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  , 0);.    zSql =
1e0e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e0f0 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
1e100 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e  .    printf("%s.
1e110 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66  .. ", zName); ff
1e120 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
1e130 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
1e140 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
1e150 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  r*)zSql, 0, 0, &
1e160 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
1e170 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1e180 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e190 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
1e1a0 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
1e1b0 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
1e1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1e1d0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
1e1e0 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b      zErrMsg = 0;
1e1f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
1e200 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
1e210 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77   xForEach(p, new
1e220 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1e230 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  )zName);.    }. 
1e240 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1e250 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  n");.  }.  if( r
1e260 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1e270 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1e280 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
1e290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e2a0 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51  (zQuery);.    zQ
1e2b0 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
1e2c0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e  printf("SELECT n
1e2d0 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ame, sql FROM sq
1e2e0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
1e310 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
1e320 77 69 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72  wid DESC", zWher
1e330 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
1e340 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1e350 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
1e360 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
1e370 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e380 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1e390 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1e3a0 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
1e3b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e3c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e3d0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1e3e0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1e3f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1e400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e410 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
1e420 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1e430 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20  schema_xfer;.   
1e440 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
1e450 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1e460 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
1e470 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a  E_ROW ){.      z
1e480 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Name = sqlite3_c
1e490 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
1e4a0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71  y, 0);.      zSq
1e4b0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1e4c0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1e4d0 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  1);.      printf
1e4e0 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
1e4f0 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
1e500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e510 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1e520 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1e530 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1e540 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d  .      if( zErrM
1e550 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  sg ){.        ut
1e560 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e570 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51  , "Error: %s\nSQ
1e580 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72  L: [%s]\n", zErr
1e590 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  Msg, zSql);.    
1e5a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e5b0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
1e5c0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
1e5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e5e0 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20  ( xForEach ){.  
1e5f0 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
1e600 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
1e610 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
1e620 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
1e630 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20  tf("done\n");.  
1e640 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65    }.  }.end_sche
1e650 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74  ma_xfer:.  sqlit
1e660 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1e670 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
1e680 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a  ree(zQuery);.}..
1e690 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
1e6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
1e6b0 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20  amed "zNewDb".  
1e6c0 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61  Try to recover a
1e6d0 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69  s much informati
1e6e0 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c  on.** as possibl
1e6f0 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  e out of the mai
1e700 6e 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63  n database (whic
1e710 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75  h might be corru
1e720 70 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74  pt) and write it
1e730 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e  .** into zNewDb.
1e740 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e750 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c  tryToClone(Shell
1e760 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
1e770 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20  char *zNewDb){. 
1e780 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1e790 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20  e3 *newDb = 0;. 
1e7a0 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77   if( access(zNew
1e7b0 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Db,0)==0 ){.    
1e7c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e7d0 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22  rr, "File \"%s\"
1e7e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
1e7f0 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20  \n", zNewDb);.  
1e800 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1e810 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
1e820 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62  n(zNewDb, &newDb
1e830 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1e840 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e850 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63  tderr, "Cannot c
1e860 72 65 61 74 65 20 6f 75 74 70 75 74 20 64 61 74  reate output dat
1e870 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20  abase: %s\n",.  
1e880 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e890 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29  3_errmsg(newDb))
1e8a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1e8b0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1e8c0 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
1e8d0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c  ble_schema=ON;",
1e8e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1e8f0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1e900 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53  b, "BEGIN EXCLUS
1e910 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  IVE;", 0, 0, 0);
1e920 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
1e930 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
1e940 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20  "type='table'", 
1e950 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b  tryToCloneData);
1e960 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
1e970 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
1e980 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c  "type!='table'",
1e990 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1e9a0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f  _exec(newDb, "CO
1e9b0 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29  MMIT;", 0, 0, 0)
1e9c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1e9d0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1e9e0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1e9f0 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
1ea00 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1ea10 5f 63 6c 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d  _close(newDb);.}
1ea20 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1ea30 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 62  he output file b
1ea40 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 0a 2a 2f  ack to stdout.*/
1ea50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
1ea60 70 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53  put_reset(ShellS
1ea70 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  tate *p){.  if( 
1ea80 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27  p->outfile[0]=='
1ea90 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  |' ){.#ifndef SQ
1eaa0 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
1eab0 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75      pclose(p->ou
1eac0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  t);.#endif.  }el
1ead0 73 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66  se{.    output_f
1eae0 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74  ile_close(p->out
1eaf0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  );.  }.  p->outf
1eb00 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
1eb10 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
1eb20 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
1eb30 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
1eb40 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
1eb50 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
1eb60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1eb70 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
1eb80 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1eb90 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
1eba0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ebb0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
1ebc0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1ebd0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
1ebe0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1ebf0 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
1ec00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1ec10 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1ec20 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
1ec30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1ec40 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
1ec50 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1ec60 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
1ec70 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
1ec80 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
1ec90 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
1eca0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
1ecb0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
1ecc0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
1ecd0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
1ece0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1ecf0 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1ed00 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
1ed10 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
1ed20 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
1ed30 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1ed40 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1ed50 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
1ed60 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
1ed70 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
1ed80 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1ed90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
1eda0 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
1edb0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
1edc0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
1edd0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
1ede0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1edf0 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
1ee00 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
1ee10 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
1ee20 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
1ee30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1ee40 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
1ee50 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
1ee60 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
1ee70 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
1ee80 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
1ee90 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
1eea0 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
1eeb0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
1eec0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
1eed0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1eee0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
1eef0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
1ef00 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
1ef10 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
1ef20 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
1ef30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
1ef40 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
1ef50 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
1ef60 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
1ef70 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
1ef80 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
1ef90 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
1efa0 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
1efb0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
1efc0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
1efd0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
1efe0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
1eff0 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
1f000 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
1f010 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
1f020 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
1f030 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
1f040 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
1f050 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1f060 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
1f070 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
1f080 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
1f090 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
1f0a0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
1f0b0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1f0c0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1f0d0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1f0e0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
1f0f0 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
1f100 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
1f110 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1f120 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1f130 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
1f140 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1f150 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
1f160 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
1f170 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
1f180 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
1f190 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1f1a0 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
1f1b0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
1f1c0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
1f1d0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
1f1e0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
1f1f0 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
1f200 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
1f210 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
1f220 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
1f230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1f240 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
1f250 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68   i;.  char *zSch
1f260 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a  emaTab;.  char *
1f270 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  zDb = nArg>=2 ? 
1f280 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e  azArg[1] : "main
1f290 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ";.  unsigned ch
1f2a0 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar aHdr[100];.  
1f2b0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
1f2c0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20   if( p->db==0 ) 
1f2d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69  return 1;.  sqli
1f2e0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1f2f0 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c  (p->db, zDb, SQL
1f300 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
1f310 4f 49 4e 54 45 52 2c 20 26 70 46 69 6c 65 29 3b  OINTER, &pFile);
1f320 0a 20 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20  .  if( pFile==0 
1f330 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
1f340 64 73 3d 3d 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ds==0 || pFile->
1f350 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 3d  pMethods->xRead=
1f360 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f370 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 70 46   1;.  }.  i = pF
1f380 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
1f390 52 65 61 64 28 70 46 69 6c 65 2c 20 61 48 64 72  Read(pFile, aHdr
1f3a0 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69 66 28  , 100, 0);.  if(
1f3b0 20 69 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   i!=SQLITE_OK ){
1f3c0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
1f3d0 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20  stderr, "unable 
1f3e0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
1f3f0 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20   header\n");.   
1f400 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1f410 20 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74   i = get2byteInt
1f420 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28  (aHdr+16);.  if(
1f430 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33   i==1 ) i = 6553
1f440 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  6;.  utf8_printf
1f450 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1f460 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65  %d\n", "database
1f470 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29   page size:", i)
1f480 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1f490 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1f4a0 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72  d\n", "write for
1f4b0 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29  mat:", aHdr[18])
1f4c0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1f4d0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1f4e0 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d  d\n", "read form
1f4f0 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b  at:", aHdr[19]);
1f500 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1f510 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1f520 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62  \n", "reserved b
1f530 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d  ytes:", aHdr[20]
1f540 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1f550 41 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64  ArraySize(aField
1f560 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
1f570 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69   ofst = aField[i
1f580 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69  ].ofst;.    unsi
1f590 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67  gned int val = g
1f5a0 65 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20  et4byteInt(aHdr 
1f5b0 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66  + ofst);.    utf
1f5c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
1f5d0 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69   "%-20s %u", aFi
1f5e0 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  eld[i].zName, va
1f5f0 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  l);.    switch( 
1f600 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  ofst ){.      ca
1f610 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20  se 56: {.       
1f620 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61   if( val==1 ) ra
1f630 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
1f640 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20   " (utf8)");.   
1f650 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20       if( val==2 
1f660 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
1f670 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29  out, " (utf16le)
1f680 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
1f690 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69  val==3 ) raw_pri
1f6a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
1f6b0 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20  tf16be)");.     
1f6c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77   }.    }.    raw
1f6d0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1f6e0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1f6f0 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a   zDb==0 ){.    z
1f700 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
1f710 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69  te3_mprintf("mai
1f720 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  n.sqlite_master"
1f730 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
1f740 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22  trcmp(zDb,"temp"
1f750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  )==0 ){.    zSch
1f760 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
1f770 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22  _mprintf("%s", "
1f780 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
1f790 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  er");.  }else{. 
1f7a0 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
1f7b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f7c0 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d  "\"%w\".sqlite_m
1f7d0 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20  aster", zDb);.  
1f7e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  }.  for(i=0; i<A
1f7f0 72 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29  rraySize(aQuery)
1f800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1f810 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
1f820 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b  _mprintf(aQuery[
1f830 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61  i].zSql, zSchema
1f840 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61  Tab);.    int va
1f850 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53  l = db_int(p, zS
1f860 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
1f870 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
1f880 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
1f890 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
1f8a0 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61  ", aQuery[i].zNa
1f8b0 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  me, val);.  }.  
1f8c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63  sqlite3_free(zSc
1f8d0 68 65 6d 61 54 61 62 29 3b 0a 20 20 72 65 74 75  hemaTab);.  retu
1f8e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
1f8f0 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74  rint the current
1f900 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1f910 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72  ) value to stder
1f920 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
1f930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1f940 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
1f950 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
1f960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
1f970 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
1f980 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70  sg(db);.  utf8_p
1f990 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1f9a0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
1f9b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  r);.  return 1;.
1f9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
1f9d0 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
1f9e0 6d 65 73 73 61 67 65 20 74 6f 20 73 74 64 65 72  message to stder
1f9f0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
1fa00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1fa10 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f  ellNomemError(vo
1fa20 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
1fa30 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1fa40 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
1fa50 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n");.  return 1;
1fa60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1fa70 65 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e  e the pattern in
1fa80 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74   zGlob[] against
1fa90 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d   the text in z[]
1faa0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a  .  Return TRUE.*
1fab0 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20  * if they match 
1fac0 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66  and FALSE (0) if
1fad0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
1fae0 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  ch..**.** Globbi
1faf0 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
1fb00 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
1fb10 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
1fb20 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
1fb30 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
1fb40 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
1fb50 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
1fb60 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
1fb70 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
1fb80 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
1fb90 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
1fba0 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
1fbb0 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
1fbc0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
1fbd0 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
1fbe0 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
1fbf0 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
1fc00 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
1fc10 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
1fc20 2a 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20  *      '#'      
1fc30 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
1fc40 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20  uence of one or 
1fc50 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68  more digits with
1fc60 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   an.**          
1fc70 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b        optional +
1fc80 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72   or - sign in fr
1fc90 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  ont.**.**      '
1fca0 20 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61   '       Any spa
1fcb0 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20  n of whitespace 
1fcc0 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65  matches any othe
1fcd0 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20  r span of.**    
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74              whit
1fcf0 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  espace..**.** Ex
1fd00 74 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61  tra whitespace a
1fd10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d  t the end of z[]
1fd20 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
1fd30 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63  static int testc
1fd40 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63  ase_glob(const c
1fd50 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73  har *zGlob, cons
1fd60 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
1fd70 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69  t c, c2;.  int i
1fd80 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
1fd90 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  n;..  while( (c 
1fda0 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21  = (*(zGlob++)))!
1fdb0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73  =0 ){.    if( Is
1fdc0 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
1fdd0 20 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a    if( !IsSpace(*
1fde0 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
1fdf0 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
1fe00 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47  ace(*zGlob) ) zG
1fe10 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  lob++;.      whi
1fe20 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
1fe30 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ) z++;.    }else
1fe40 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20   if( c=='*' ){. 
1fe50 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28       while( (c=(
1fe60 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20  *(zGlob++))) == 
1fe70 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b  '*' || c=='?' ){
1fe80 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
1fe90 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d  '?' && (*(z++))=
1fea0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1feb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1fec0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1fed0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1fee0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
1fef0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
1ff00 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61  le( *z && testca
1ff10 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c  se_glob(zGlob-1,
1ff20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
1ff30 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
1ff40 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1ff50 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20   (*z)!=0;.      
1ff60 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
1ff70 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d  c2 = (*(z++)))!=
1ff80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
1ff90 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20  le( c2!=c ){.   
1ffa0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b         c2 = *(z+
1ffb0 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
1ffc0 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
1ffd0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ffe0 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61        if( testca
1fff0 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29  se_glob(zGlob,z)
20000 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
20010 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
20020 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
20030 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
20040 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d     if( (*(z++))=
20050 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20060 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
20070 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '[' ){.      int
20080 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
20090 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
200a0 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
200b0 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29        c = *(z++)
200c0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
200d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
200e0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
200f0 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  +);.      if( c2
20100 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
20110 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
20120 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
20130 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
20140 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
20150 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
20160 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
20170 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
20180 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
20190 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
201a0 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
201b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
201c0 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  ='-' && zGlob[0]
201d0 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  !=']' && zGlob[0
201e0 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
201f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
20200 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
20210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e            if( c>
20220 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63  =prior_c && c<=c
20230 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  2 ) seen = 1;.  
20240 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
20250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
20260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
20270 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20  ( c==c2 ){.     
20280 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b         seen = 1;
20290 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
202a0 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
202b0 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   c2;.        }. 
202c0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
202d0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
202e0 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
202f0 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
20300 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
20310 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20320 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c=='#' ){.      
20330 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c  if( (z[0]=='-' |
20340 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20  | z[0]=='+') && 
20350 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20  IsDigit(z[1]) ) 
20360 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  z++;.      if( !
20370 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20  IsDigit(z[0]) ) 
20380 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
20390 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
203a0 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20  ( IsDigit(z[0]) 
203b0 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65  ){ z++; }.    }e
203c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63  lse{.      if( c
203d0 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74  !=(*(z++)) ) ret
203e0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
203f0 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63  .  while( IsSpac
20400 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  e(*z) ){ z++; }.
20410 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
20420 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
20430 65 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  e the string as 
20440 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  a command-line o
20450 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65  ption with eithe
20460 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20  r one or two.** 
20470 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  initial "-" char
20480 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
20490 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63  c int optionMatc
204a0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  h(const char *zS
204b0 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
204c0 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74  zOpt){.  if( zSt
204d0 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  r[0]!='-' ) retu
204e0 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a  rn 0;.  zStr++;.
204f0 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27    if( zStr[0]=='
20500 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72  -' ) zStr++;.  r
20510 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74  eturn strcmp(zSt
20520 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a  r, zOpt)==0;.}..
20530 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66  /*.** Delete a f
20540 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c  ile..*/.int shel
20550 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73  lDeleteFile(cons
20560 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
20570 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  e){.  int rc;.#i
20580 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
20590 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
205a0 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
205b0 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  _unicode(zFilena
205c0 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e  me);.  rc = _wun
205d0 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74  link(z);.  sqlit
205e0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
205f0 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28  e.  rc = unlink(
20600 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  zFilename);.#end
20610 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
20620 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
20630 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20640 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
20650 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  ion fkey_collate
20660 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a  _clause(), used.
20670 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74  ** by the ".lint
20680 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63   fkey-indexes" c
20690 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61  ommand. This sca
206a0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  lar function is 
206b0 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64  always.** called
206c0 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d   with four argum
206d0 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e  ents - the paren
206e0 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68  t table name, th
206f0 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20  e parent column 
20700 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69  name,.** the chi
20710 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  ld table name an
20720 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75  d the child colu
20730 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  mn name..**.**  
20740 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
20750 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62  ause('parent-tab
20760 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c  ', 'parent-col',
20770 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63   'child-tab', 'c
20780 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a  hild-col').**.**
20790 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
207a0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f  e named tables o
207b0 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74  r columns do not
207c0 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e   exist, this fun
207d0 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
207e0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
207f0 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  . An empty strin
20800 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  g is also return
20810 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65  ed if both table
20820 73 20 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e  s .** and column
20830 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65  s exist but have
20840 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c   the same defaul
20850 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
20860 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  ence. Or,.** if 
20870 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74  both exist but t
20880 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
20890 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
208a0 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
208b0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
208c0 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
208d0 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72  g " COLLATE <par
208e0 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c  ent-collation>",
208f0 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e   where.** <paren
20900 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20  t-collation> is 
20910 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
20920 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
20930 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c  f the parent col
20940 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
20950 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c  oid shellFkeyCol
20960 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71  lateClause(.  sq
20970 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
20980 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c  Ctx, .  int nVal
20990 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
209a0 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
209b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
209c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
209d0 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20  _handle(pCtx);. 
209e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
209f0 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rent;.  const ch
20a00 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a  ar *zParentCol;.
20a10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
20a20 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73  arentSeq;.  cons
20a30 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a  t char *zChild;.
20a40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
20a50 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74  hildCol;.  const
20a60 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71   char *zChildSeq
20a70 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61   = 0;  /* Initia
20a80 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61  lize to avoid fa
20a90 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72  lse-positive war
20aa0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ning */.  int rc
20ab0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6e  ;.  .  assert( n
20ac0 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
20ad0 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
20ae0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
20af0 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
20b00 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
20b10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
20b20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
20b30 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
20b40 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
20b50 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
20b60 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
20b70 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
20b80 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
20b90 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
20ba0 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
20bb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
20bc0 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
20bd0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
20be0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
20bf0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
20c00 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
20c10 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
20c20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
20c30 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
20c40 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
20c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20c60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20c70 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
20c80 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
20c90 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
20ca0 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
20cb0 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
20cc0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
20cd0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20ce0 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
20cf0 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
20d00 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
20d10 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
20d20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20d30 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
20d40 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
20d50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
20d60 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
20d70 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
20d80 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
20d90 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
20da0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
20db0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
20dc0 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
20dd0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
20de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
20df0 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
20e00 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
20e10 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
20e20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
20e30 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
20e40 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
20e70 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
20e80 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
20e90 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ec0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
20ed0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
20ee0 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
20ef0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
20f00 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
20f10 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
20f20 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
20f30 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
20f40 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
20f50 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
20f60 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
20f70 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
20f80 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
20f90 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
20fa0 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
20fb0 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
20fc0 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
20fd0 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
20fe0 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
20ff0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
21020 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
21030 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
21040 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
21050 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
21060 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
21070 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
21080 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
210b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
210c0 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
210d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
210e0 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
210f0 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
21100 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
21110 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
21120 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
21130 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
21140 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
21150 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
21160 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
21170 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
21180 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
21190 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
211a0 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
211b0 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
211c0 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
211d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
211e0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
211f0 41 4e 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20  AN SELECT rowid 
21200 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65  FROM child_table
21210 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79   WHERE child_key
21220 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  =?".  **.  **   
21230 20 54 68 69 73 20 69 73 20 74 68 65 20 73 61 6d   This is the sam
21240 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 74 68  e SELECT that th
21250 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69  e foreign keys i
21260 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 65  mplementation ne
21270 65 64 73 0a 20 20 2a 2a 20 20 20 20 74 6f 20 72  eds.  **    to r
21280 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e  un internally on
21290 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49   child tables. I
212a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  f there is an in
212b0 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  dex that can.  *
212c0 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f 20  *    be used to 
212d0 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75  optimize this qu
212e0 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ery, then it can
212f0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79   also be used by
21300 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20   the FK.  **    
21310 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
21320 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54  o optimize DELET
21330 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
21340 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
21350 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62  rent.  **    tab
21360 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e  le..  **.  ** 1.
21370 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20   A GLOB pattern 
21380 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c  suitable for sql
21390 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20  ite3_strglob(). 
213a0 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70  If the plan outp
213b0 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68  ut by.  **    th
213c0 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
213d0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74  PLAN command mat
213e0 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65 72  ches this patter
213f0 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68 65  n, then the sche
21400 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61  ma.  **    conta
21410 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ins an index tha
21420 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
21430 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75   optimize the qu
21440 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ery..  **.  ** 2
21450 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
21460 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
21470 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20 74  ibes the child t
21480 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
21490 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
214a0 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61         "child_ta
214b0 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20  ble(child_key1, 
214c0 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a  child_key2)".  *
214d0 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20  *.  ** 3. Human 
214e0 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
214f0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
21500 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e   parent table an
21510 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a  d columns. e.g..
21520 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21530 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61  "parent_table(pa
21540 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e  rent_key1, paren
21550 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20  t_key2)".  **.  
21560 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45  ** 4. A full CRE
21570 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
21580 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
21590 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75   that could be u
215a0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f  sed to.  **    o
215b0 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f  ptimize DELETE o
215c0 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
215d0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  nts on the paren
215e0 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20  t table. e.g..  
215f0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43  **.  **       "C
21600 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c  REATE INDEX chil
21610 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65  d_table_child_ke
21620 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65  y ON child_table
21630 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a  (child_key)".  *
21640 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61  *.  ** 5. The na
21650 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  me of the parent
21660 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
21670 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c 75  * These six valu
21680 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20 74  es are used by t
21690 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77  he C logic below
216a0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
216b0 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20   report..  */.  
216c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
216d0 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20   =.  "SELECT ". 
216e0 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41 49     "     'EXPLAI
216f0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
21700 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 27  ECT rowid FROM '
21710 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
21720 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a  ) || ' WHERE '".
21730 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
21740 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e  concat(quote(s.n
21750 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71  ame) || '.' || q
21760 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
21770 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20  | '=?' ".    "  
21780 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  || fkey_collate_
21790 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
217a0 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
217b0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
217c0 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
217d0 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20  me, f.[from]),' 
217e0 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22  AND ')".    ", "
217f0 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52  .    "     'SEAR
21800 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e  CH TABLE ' || s.
21810 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20  name || ' USING 
21820 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28  COVERING INDEX*(
21830 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
21840 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c  up_concat('*=?',
21850 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27   ' AND ') || ')'
21860 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
21870 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20       s.name  || 
21880 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
21890 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27  cat(f.[from],  '
218a0 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  , ') || ')'".   
218b0 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
218c0 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27  f.[table] || '('
218d0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
218e0 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d  (COALESCE(f.[to]
218f0 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20  , p.[name])) || 
21900 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
21910 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20    "     'CREATE 
21920 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65  INDEX ' || quote
21930 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20  (s.name ||'_'|| 
21940 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b  group_concat(f.[
21950 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20  from], '_'))".  
21960 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c    "  || ' ON ' |
21970 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  | quote(s.name) 
21980 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c  || '('".    "  |
21990 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71  | group_concat(q
219a0 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
219b0 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
219c0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
219d0 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
219e0 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
219f0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
21a00 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
21a10 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27  me, f.[from]), '
21a20 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20  , ')".    "  || 
21a30 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20  ');'".    ", ". 
21a40 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c     "     f.[tabl
21a50 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  e] ".    "FROM s
21a60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20  qlite_master AS 
21a70 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67  s, pragma_foreig
21a80 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d  n_key_list(s.nam
21a90 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c  e) AS f ".    "L
21aa0 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f  EFT JOIN pragma_
21ab0 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20  table_info AS p 
21ac0 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44  ON (pk-1=seq AND
21ad0 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d   p.arg=f.[table]
21ae0 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42  ) ".    "GROUP B
21af0 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22  Y s.name, f.id "
21b00 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28  .    "ORDER BY (
21b10 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e  CASE WHEN ? THEN
21b20 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20   f.[table] ELSE 
21b30 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b  s.name END)".  ;
21b40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21b50 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43  GlobIPK = "SEARC
21b60 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20  H TABLE * USING 
21b70 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
21b80 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a  KEY (rowid=?)";.
21b90 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41  .  for(i=2; i<nA
21ba0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  rg; i++){.    in
21bb0 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
21bc0 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  n(azArg[i]);.   
21bd0 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
21be0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
21bf0 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
21c00 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
21c10 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
21c20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
21c30 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
21c40 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
21c50 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
21c60 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
21c70 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
21c80 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
21c90 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
21ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
21cb0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
21cc0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
21cd0 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
21ce0 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
21cf0 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
21d00 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
21d10 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
21d20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21d30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
21d40 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69    }.  .  /* Regi
21d50 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
21d60 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
21d70 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
21d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
21d90 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
21da0 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
21db0 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
21dc0 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
21dd0 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
21de0 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
21df0 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
21e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
21e20 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
21e30 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
21e40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
21e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
21e70 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
21e80 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
21e90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
21eb0 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
21ec0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
21ed0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
21ee0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
21ef0 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
21f00 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
21f10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
21f20 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
21f30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21f40 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
21f50 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
21f60 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
21f70 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
21f80 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
21f90 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
21fa0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
21fb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
21fc0 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
21fd0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
21fe0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
21ff0 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
22000 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
22010 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
22020 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
22030 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
22040 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
22050 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
22060 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
22070 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
22080 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
22090 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
220a0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
220b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
220c0 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
220d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
220e0 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
220f0 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
22100 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
22110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22120 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
22130 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
22140 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
22150 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
22160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
22170 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
22180 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
22190 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
221a0 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
221b0 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
221c0 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
221d0 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
221e0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
221f0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
22200 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
22210 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
22220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
22230 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
22240 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
22250 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22260 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
22270 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
22280 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
22290 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
222a0 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
222b0 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
222c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
222d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
222e0 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20   bGroupByParent 
222f0 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
22300 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
22310 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
22320 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
22330 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
22340 2c 20 7a 50 72 65 76 29 29 20 0a 20 20 20 20 20  , zPrev)) .     
22350 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22360 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
22370 22 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65  "-- Parent table
22380 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29   %s\n", zParent)
22390 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
223a0 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b  te3_free(zPrev);
223b0 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76  .          zPrev
223c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
223d0 74 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74  tf("%s", zParent
223e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
223f0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
22400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
22410 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
22420 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a  s%s --> %s\n", z
22430 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61  Indent, zCI, zTa
22440 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
22450 65 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73  else if( bVerbos
22460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
22470 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
22480 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e  %s/* no extra in
22490 64 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66  dexes required f
224a0 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e  or %s -> %s */\n
224b0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
224c0 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d    zIndent, zFrom
224d0 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20  , zTarget.      
224e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
224f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22500 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22510 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28  zPrev);..    if(
22520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22530 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
22540 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
22550 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
22560 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  g(db));.    }.. 
22570 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
22580 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b  _finalize(pSql);
22590 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
225a0 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53  ITE_OK && rc2!=S
225b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
225c0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
225d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
225e0 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
225f0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
22600 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
22610 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
22620 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
22630 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
22640 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  b));.  }..  retu
22650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22660 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
22670 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f  f ".lint" dot co
22680 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
22690 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d   int lintDotComm
226a0 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
226b0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
226c0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
226d0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
226e0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
226f0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
22700 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
22710 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
22720 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
22730 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
22740 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
22750 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22760 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
22770 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
22780 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e   int n;.  n = (n
22790 41 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29 73 74  Arg>=2 ? (int)st
227a0 72 6c 65 6e 28 61 7a 41 72 67 5b 31 5d 29 20 3a  rlen(azArg[1]) :
227b0 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c   0);.  if( n<1 |
227c0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  | sqlite3_strnic
227d0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b  mp(azArg[1], "fk
227e0 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20  ey-indexes", n) 
227f0 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20  ) goto usage;.  
22800 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49  return lintFkeyI
22810 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61  ndexes(pState, a
22820 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75  zArg, nArg);.. u
22830 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e  sage:.  raw_prin
22840 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
22850 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  e %s sub-command
22860 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e   ?switches...?\n
22870 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
22880 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
22890 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f  r, "Where sub-co
228a0 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b  mmands are:\n");
228b0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
228c0 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d  derr, "    fkey-
228d0 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72  indexes\n");.  r
228e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
228f0 4f 52 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  OR;.}.../*.** If
22900 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62   an input line b
22910 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74  egins with "." t
22920 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  hen invoke this 
22930 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72  routine to.** pr
22940 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e  ocess that line.
22950 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
22960 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
22970 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
22980 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
22990 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  int do_meta_comm
229a0 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  and(char *zLine,
229b0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b   ShellState *p){
229c0 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20  .  int h = 1;.  
229d0 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
229e0 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20  int n, c;.  int 
229f0 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rc = 0;.  char *
22a00 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a  azArg[50];..  /*
22a10 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
22a20 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
22a30 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
22a40 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72   zLine[h] && nAr
22a50 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
22a60 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
22a70 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68   IsSpace(zLine[h
22a80 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
22a90 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30   if( zLine[h]==0
22aa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
22ab0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27  ( zLine[h]=='\''
22ac0 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22   || zLine[h]=='"
22ad0 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
22ae0 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b  elim = zLine[h++
22af0 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
22b00 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
22b10 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
22b20 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69   zLine[h] && zLi
22b30 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]!=delim ){.
22b40 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
22b50 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65  e[h]=='\\' && de
22b60 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e  lim=='"' && zLin
22b70 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b  e[h+1]!=0 ) h++;
22b80 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20  .        h++;.  
22b90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22ba0 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20  zLine[h]==delim 
22bb0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
22bc0 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
22bd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
22be0 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76  im=='"' ) resolv
22bf0 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
22c00 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
22c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
22c20 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
22c30 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
22c40 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
22c50 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e  && !IsSpace(zLin
22c60 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a  e[h]) ){ h++; }.
22c70 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
22c80 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20  h] ) zLine[h++] 
22c90 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
22ca0 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
22cb0 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
22cc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
22cd0 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
22ce0 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
22cf0 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
22d00 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
22d10 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
22d20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
22d30 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
22d40 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 0a 23 69  azArg[0][0];..#i
22d50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22d60 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
22d70 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20    if( c=='a' && 
22d80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
22d90 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20  , "auth", n)==0 
22da0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  ){.    if( nArg!
22db0 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
22dc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
22dd0 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c  Usage: .auth ON|
22de0 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  OFF\n");.      r
22df0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
22e00 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
22e10 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
22e20 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
22e30 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
22e40 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
22e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
22e60 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
22e70 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70  db, shellAuth, p
22e80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22e90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
22ea0 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
22eb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
22ec0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
22ed0 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
22ee0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
22ef0 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
22f00 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
22f10 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
22f20 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
22f30 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
22f40 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
22f50 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
22f60 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
22f70 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
22f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
22f90 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
22fa0 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
22fb0 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
22fc0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
22fd0 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
22fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
22ff0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
23000 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
23010 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
23020 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
23030 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70          /* No op
23040 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73  tions to process
23050 20 61 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f   at this time */
23060 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
23070 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23080 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
23090 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
230a0 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20   azArg[j]);.    
230b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
230c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
230d0 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46  }else if( zDestF
230e0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
230f0 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
23100 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65  Arg[j];.      }e
23110 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29  lse if( zDb==0 )
23120 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20  {.        zDb = 
23130 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20  zDestFile;.     
23140 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
23150 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
23160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61  else{.        ra
23170 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
23180 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
23190 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c  ents to .backup\
231a0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
231b0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
231c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
231d0 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
231e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
231f0 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
23200 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
23210 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
23220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
23230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
23240 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
23250 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
23260 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73  qlite3_open(zDes
23270 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a  tFile, &pDest);.
23280 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
232a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
232b0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
232c0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
232d0 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
232e0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
232f0 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
23300 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23310 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
23320 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d  );.    pBackup =
23330 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
23340 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69  init(pDest, "mai
23350 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b  n", p->db, zDb);
23360 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
23370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
23380 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23390 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
233a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
233b0 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71  Dest));.      sq
233c0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
233d0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
233e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
233f0 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
23400 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
23410 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
23420 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
23430 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
23440 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
23450 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23460 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
23470 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
23480 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
23490 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
234a0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
234b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
234c0 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
234d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
234e0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
234f0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
23500 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
23510 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
23520 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e  rg[0], "bail", n
23530 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
23540 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
23550 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
23560 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
23570 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
23580 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
23590 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
235a0 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66  age: .bail on|of
235b0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
235c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
235d0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
235e0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
235f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
23600 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b  inary", n)==0 ){
23610 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
23620 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f   ){.      if( bo
23630 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
23640 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [1]) ){.        
23650 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
23660 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
23670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
23680 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75  etTextMode(p->ou
23690 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
236a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
236b0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
236c0 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61  r, "Usage: .bina
236d0 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ry on|off\n");. 
236e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
236f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
23700 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
23710 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
23720 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
23730 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
23740 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
23750 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
23760 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
23770 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
23780 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
23790 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
237a0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
237b0 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
237c0 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
237d0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
237e0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
237f0 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
23800 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
23810 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
23820 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
23830 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
23840 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
23850 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
23860 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
23870 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
23880 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
23890 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
238a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
238b0 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
238c0 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
238d0 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
238e0 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
238f0 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
23900 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
23910 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
23920 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
23930 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
23940 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
23950 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
23960 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
23970 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
23980 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
23990 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
239a0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
239b0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
239c0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
239d0 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
239e0 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
239f0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
23a00 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
23a10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
23a20 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
23a30 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
23a40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
23a50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
23a60 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
23a70 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
23a80 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
23a90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
23aa0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
23ab0 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
23ac0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
23ad0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
23ae0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
23af0 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
23b00 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
23b10 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
23b20 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
23b30 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
23b40 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
23b50 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
23b60 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
23b70 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
23b80 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
23b90 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
23ba0 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
23bb0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
23bc0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23bd0 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
23be0 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
23bf0 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
23c00 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
23c10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23c20 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
23c30 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
23c40 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
23c50 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
23c60 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
23c70 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
23c80 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
23c90 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
23ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
23cb0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23cc0 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
23cd0 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
23ce0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
23cf0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
23d00 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
23d10 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
23d20 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
23d30 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
23d40 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
23d50 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
23d60 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
23d70 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
23d80 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
23d90 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
23da0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
23db0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
23dc0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
23dd0 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
23de0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23df0 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
23e00 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
23e10 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
23e20 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
23e30 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
23e40 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
23e50 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
23e60 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
23e70 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
23e90 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
23ea0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
23eb0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
23ec0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23ed0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
23ee0 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
23ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23f00 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
23f10 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
23f20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
23f30 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
23f40 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69  p(azArg[0], "dbi
23f50 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  nfo", n)==0 ){. 
23f60 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62     rc = shell_db
23f70 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20  info_command(p, 
23f80 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20  nArg, azArg);.  
23f90 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
23fa0 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
23fb0 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c  zArg[0], "dump",
23fc0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
23fd0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20  nst char *zLike 
23fe0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
23ff0 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f      int savedSho
24000 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f  wHeader = p->sho
24010 77 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65  wHeader;.    She
24020 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
24030 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
24040 69 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  id);.    for(i=1
24050 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
24060 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b        if( azArg[
24070 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
24080 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
24090 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31   *z = azArg[i]+1
240a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
240b0 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  0]=='-' ) z++;. 
240c0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
240d0 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f  p(z,"preserve-ro
240e0 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66  wids")==0 ){.#if
240f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24100 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
24110 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
24120 66 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d  f(stderr, "The -
24130 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
24140 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63   option is not c
24150 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20  ompatible".     
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53          " with S
24180 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24190 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  ALTABLE\n");.   
241a0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
241b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
241c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
241d0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
241e0 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
241f0 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
24200 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  owid);.#endif.  
24210 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
24220 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
24230 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
24240 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
24250 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e  on \"%s\" on \".
24260 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  dump\"\n", azArg
24270 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
24280 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
24290 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
242a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
242b0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
242c0 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20  if( zLike ){.   
242d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
242e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
242f0 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76  .dump ?--preserv
24300 65 2d 72 6f 77 69 64 73 3f 20 3f 4c 49 4b 45 2d  e-rowids? ?LIKE-
24310 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
24320 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
24330 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
24340 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
24350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24360 20 20 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67     zLike = azArg
24370 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
24380 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
24390 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65  , 0);.    /* Whe
243a0 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61  n playing back a
243b0 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e   "dump", the con
243c0 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61  tent might appea
243d0 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20  r in an order.  
243e0 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65    ** which cause
243f0 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  s immediate fore
24400 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
24410 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74  nts to be violat
24420 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69  ed..    ** So di
24430 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  sable foreign-ke
24440 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y constraint enf
24450 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76  orcement to prev
24460 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f  ent problems. */
24470 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
24480 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
24490 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
244a0 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70  ;\n");.    raw_p
244b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42  rintf(p->out, "B
244c0 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
244d0 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72  ;\n");.    p->wr
244e0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
244f0 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61  ;.    p->showHea
24500 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  der = 0;.    /* 
24510 53 65 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68  Set writable_sch
24520 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69  ema=ON since doi
24530 6e 67 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c  ng so forces SQL
24540 69 74 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ite to initializ
24550 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68  e.    ** as much
24560 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 61   of the schema a
24570 73 20 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66  s it can even if
24580 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
24590 65 72 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20  er table is.    
245a0 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  ** corrupt. */. 
245b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
245c0 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  p->db, "SAVEPOIN
245d0 54 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77  T dump; PRAGMA w
245e0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
245f0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
24600 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20    p->nErr = 0;. 
24610 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20     if( zLike==0 
24620 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  ){.      run_sch
24630 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
24640 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
24650 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
24660 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24670 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
24680 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
24690 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  LL AND type=='ta
246a0 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27  ble' AND name!='
246b0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
246c0 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
246d0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
246e0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
246f0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
24700 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
24710 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
24720 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61         "WHERE na
24730 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me=='sqlite_sequ
24740 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
24750 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
24760 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
24770 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
24780 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24790 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
247a0 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
247b0 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  LL AND type IN (
247c0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
247d0 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20  ','view')", 0.  
247e0 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
247f0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
24800 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  ql;.      zSql =
24810 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
24820 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
24830 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
24840 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24850 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
24860 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c  WHERE tbl_name L
24870 49 4b 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d  IKE %Q AND type=
24880 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20  ='table'".      
24890 20 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54    "  AND sql NOT
248a0 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a   NULL", zLike);.
248b0 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
248c0 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53  _dump_query(p,zS
248d0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
248e0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
248f0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
24900 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
24910 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
24920 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
24930 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
24940 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
24950 4c 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  L".        "  AN
24960 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
24970 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
24980 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 22 20  ew')".        " 
24990 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
249a0 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a  KE %Q", zLike);.
249b0 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
249c0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53  dump_query(p, zS
249d0 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ql, 0);.      sq
249e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
249f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24a00 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
24a10 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
24a20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
24a30 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
24a40 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  chema=OFF;\n");.
24a50 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
24a60 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
24a70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
24a80 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
24a90 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
24aa0 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ma=OFF;", 0, 0, 
24ab0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
24ac0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
24ad0 45 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20  EASE dump;", 0, 
24ae0 30 2c 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70  0, 0);.    raw_p
24af0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d  rintf(p->out, p-
24b00 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43  >nErr ? "ROLLBAC
24b10 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72  K; -- due to err
24b20 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54  ors\n" : "COMMIT
24b30 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68  ;\n");.    p->sh
24b40 6f 77 48 65 61 64 65 72 20 3d 20 73 61 76 65 64  owHeader = saved
24b50 53 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 7d 65  ShowHeader;.  }e
24b60 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
24b70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
24b80 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e  rg[0], "echo", n
24b90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
24ba0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
24bb0 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
24bc0 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61  p, SHFLG_Echo, a
24bd0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
24be0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
24bf0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
24c00 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f  sage: .echo on|o
24c10 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
24c20 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
24c30 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
24c40 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
24c50 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29  rg[0], "eqp", n)
24c60 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
24c70 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
24c80 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
24c90 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29  [1],"full")==0 )
24ca0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
24cb0 6f 45 51 50 20 3d 20 32 3b 0a 20 20 20 20 20 20  oEQP = 2;.      
24cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
24cd0 2d 3e 61 75 74 6f 45 51 50 20 3d 20 62 6f 6f 6c  ->autoEQP = bool
24ce0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
24cf0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
24d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
24d10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24d20 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 6e 7c  "Usage: .eqp on|
24d30 6f 66 66 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20  off|full\n");.  
24d40 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
24d50 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
24d60 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
24d70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
24d80 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
24d90 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
24da0 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  (rc = (int)integ
24db0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
24dc0 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63 29  ))!=0 ) exit(rc)
24dd0 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  ;.    rc = 2;.  
24de0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
24df0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
24e00 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69  zArg[0], "explai
24e10 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n", n)==0 ){.   
24e20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20   int val = 1;.  
24e30 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b    if( nArg>=2 ){
24e40 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
24e50 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f  p(azArg[1],"auto
24e60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
24e70 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20   val = 99;.     
24e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24e90 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61  val =  booleanVa
24ea0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
24eb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24ec0 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70   if( val==1 && p
24ed0 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70  ->mode!=MODE_Exp
24ee0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lain ){.      p-
24ef0 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d  >normalMode = p-
24f00 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  >mode;.      p->
24f10 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  mode = MODE_Expl
24f20 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ain;.      p->au
24f30 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
24f40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
24f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
24f60 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45   p->mode==MODE_E
24f70 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65  xplain ) p->mode
24f80 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65   = p->normalMode
24f90 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  ;.      p->autoE
24fa0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
24fb0 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39  }else if( val==9
24fc0 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  9 ){.      if( p
24fd0 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
24fe0 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
24ff0 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
25000 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
25010 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lain = 1;.    }.
25020 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
25030 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70  =='f' && strncmp
25040 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c  (azArg[0], "full
25050 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29  schema", n)==0 )
25060 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
25070 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
25080 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
25090 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20    int doStats = 
250a0 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  0;.    memcpy(&d
250b0 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
250c0 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
250d0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
250e0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
250f0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
25100 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20  E_Semi;.    if( 
25110 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f  nArg==2 && optio
25120 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c  nMatch(azArg[1],
25130 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20   "indent") ){.  
25140 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
25150 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
25160 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
25170 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nArg = 1;.    }.
25180 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
25190 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
251a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
251b0 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  ge: .fullschema 
251c0 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a  ?--indent?\n");.
251d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
251e0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
251f0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
25200 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
25210 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
25220 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
25230 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
25240 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20   sql FROM".     
25250 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
25260 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
25270 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
25280 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
25290 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22  owid x".       "
252a0 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
252b0 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
252c0 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45  L".       "   SE
252d0 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20  LECT sql, type, 
252e0 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
252f0 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74  rowid FROM sqlit
25300 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22  e_temp_master) "
25310 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74  .       "WHERE t
25320 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
25330 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20  sql NOTNULL AND 
25340 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
25350 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20  qlite_%' ".     
25360 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
25370 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62  d",.       callb
25380 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
25390 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  rMsg.    );.    
253a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
253b0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
253c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
253d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
253e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
253f0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
25400 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69      "SELECT rowi
25410 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
25420 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
25430 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d       " WHERE nam
25440 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73  e GLOB 'sqlite_s
25450 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20  tat[134]'",.    
25460 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
25470 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
25480 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74   doStats = sqlit
25490 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
254a0 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
254b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
254c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
254d0 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73  .    if( doStats
254e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
254f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
25500 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c  "/* No STAT tabl
25510 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c  es available */\
25520 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
25530 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25540 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
25550 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
25560 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
25570 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
25580 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45  "SELECT 'ANALYZE
25590 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22   sqlite_master'"
255a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
255b0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
255c0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
255d0 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  .      data.cMod
255e0 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
255f0 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
25600 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
25610 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
25620 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t1";.      shell
25630 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
25640 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
25650 74 65 5f 73 74 61 74 31 22 2c 0a 20 20 20 20 20  te_stat1",.     
25660 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
25670 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
25680 61 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  a,&zErrMsg);.   
25690 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
256a0 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
256b0 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t3";.      shell
256c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
256d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
256e0 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20  te_stat3",.     
256f0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
25700 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
25710 61 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  a,&zErrMsg);.   
25720 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
25730 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
25740 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t4";.      shell
25750 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
25760 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
25770 74 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20  te_stat4",.     
25780 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
25790 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
257a0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
257b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
257c0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
257d0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
257e0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
257f0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
25800 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
25810 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20  [0], "headers", 
25820 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
25830 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
25840 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
25850 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
25860 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
25870 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
25880 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
25890 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f  sage: .headers o
258a0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
258b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
258c0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
258d0 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
258e0 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
258f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , n)==0 ){.    u
25900 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
25910 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b  t, "%s", zHelp);
25920 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
25930 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
25940 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
25950 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ort", n)==0 ){. 
25960 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25980 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
25990 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
259a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
259b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
259c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
259d0 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e   to extra conten
259e0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71  t from */.    sq
259f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
25a00 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73  t = NULL; /* A s
25a10 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
25a20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
25a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a40 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
25a50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
25a60 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
25a90 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
25aa0 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
25ab0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
25ac0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25ad0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
25ae0 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20  int needCommit; 
25af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25b00 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72  rue to COMMIT or
25b10 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64   ROLLBACK at end
25b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
25b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25b50 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c   bytes in p->col
25b60 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20  Separator[] */. 
25b70 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b90 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
25ba0 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74  nt */.    Import
25bb0 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20  Ctx sCtx;       
25bc0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
25bd0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63  context */.    c
25be0 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45  har *(SQLITE_CDE
25bf0 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72  CL *xRead)(Impor
25c00 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20  tCtx*); /* Func 
25c10 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75  to read one valu
25c20 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51  e */.    int (SQ
25c30 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f  LITE_CDECL *xClo
25c40 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20  ser)(FILE*);    
25c50 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f    /* Func to clo
25c60 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
25c70 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
25c80 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
25c90 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
25ca0 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
25cb0 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f  LE\n");.      go
25cc0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
25cd0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
25ce0 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
25cf0 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61  ;.    zTable = a
25d00 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65  zArg[2];.    see
25d10 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
25d20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78      memset(&sCtx
25d30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78  , 0, sizeof(sCtx
25d40 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  ));.    open_db(
25d50 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  p, 0);.    nSep 
25d60 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f  = strlen30(p->co
25d70 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
25d80 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
25d90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25da0 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
25db0 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
25dc0 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d  : non-null colum
25dd0 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  n separator requ
25de0 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
25df0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
25e00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
25e10 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
25e20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
25e30 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
25e40 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f  lti-character co
25e50 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20  lumn separators 
25e60 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20  not allowed".   
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c     " for import\
25e90 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
25ea0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
25eb0 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
25ec0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
25ed0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
25ee0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
25ef0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
25f00 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f  ror: non-null ro
25f10 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  w separator requ
25f20 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
25f30 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
25f40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
25f50 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d  f( nSep==2 && p-
25f60 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20  >mode==MODE_Csv 
25f70 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77  && strcmp(p->row
25f80 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
25f90 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rLf)==0 ){.     
25fa0 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69   /* When importi
25fb0 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69  ng CSV (only), i
25fc0 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  f the row separa
25fd0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  tor is set to th
25fe0 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75  e.      ** defau
25ff0 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  lt output row se
26000 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20  parator, change 
26010 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  it to the defaul
26020 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
26030 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
26040 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76   This avoids hav
26050 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20  ing to maintain 
26060 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a  different input.
26070 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74        ** and out
26080 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f  put row separato
26090 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  rs. */.      sql
260a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
260b0 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
260c0 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
260d0 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
260e0 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73  ;.      nSep = s
260f0 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65  trlen30(p->rowSe
26100 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  parator);.    }.
26110 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
26120 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
26130 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
26140 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
26150 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  er row separator
26160 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20  s not allowed". 
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72       " for impor
26190 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
261a0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
261b0 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46   sCtx.zFile = zF
261c0 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c  ile;.    sCtx.nL
261d0 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ine = 1;.    if(
261e0 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d   sCtx.zFile[0]==
261f0 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51  '|' ){.#ifdef SQ
26200 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
26210 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
26220 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
26230 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73   pipes are not s
26240 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73  upported in this
26250 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72   OS\n");.      r
26260 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
26270 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70       sCtx.in = p
26280 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b  open(sCtx.zFile+
26290 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73  1, "r");.      s
262a0 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69  Ctx.zFile = "<pi
262b0 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f  pe>";.      xClo
262c0 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65  ser = pclose;.#e
262d0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
262e0 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
262f0 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  fopen(sCtx.zFile
26300 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78  , "rb");.      x
26310 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b  Closer = fclose;
26320 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
26330 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
26340 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61  ii ){.      xRea
26350 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  d = ascii_read_o
26360 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65  ne_field;.    }e
26370 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64  lse{.      xRead
26380 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f   = csv_read_one_
26390 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20  field;.    }.   
263a0 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20   if( sCtx.in==0 
263b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
263c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
263d0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
263e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
263f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
26400 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
26410 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e  tx.cColSep = p->
26420 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b  colSeparator[0];
26430 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65  .    sCtx.cRowSe
26440 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  p = p->rowSepara
26450 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c  tor[0];.    zSql
26460 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
26470 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
26480 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  M %s", zTable);.
26490 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
264a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
264b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
264c0 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
264d0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c  y\n");.      xCl
264e0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
264f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
26500 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
26510 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
26520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26530 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
26540 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
26550 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d  Stmt, 0);.    im
26560 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
26570 28 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f  (&sCtx, 0);    /
26580 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78  * To ensure sCtx
26590 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  .z is allocated 
265a0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26 26  */.    if( rc &&
265b0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
265c0 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  ("no such table:
265d0 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72   *", sqlite3_err
265e0 6d 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29  msg(p->db))==0 )
265f0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
26600 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
26610 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  mprintf("CREATE 
26620 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c  TABLE %s", zTabl
26630 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63  e);.      char c
26640 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20  Sep = '(';.     
26650 20 77 68 69 6c 65 28 20 78 52 65 61 64 28 26 73   while( xRead(&s
26660 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ctx) ){.        
26670 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65  zCreate = sqlite
26680 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c  3_mprintf("%z%c\
26690 6e 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c  n  \"%w\" TEXT",
266a0 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20   zCreate, cSep, 
266b0 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20  sCtx.z);.       
266c0 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20   cSep = ',';.   
266d0 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
266e0 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm!=sCtx.cColSe
266f0 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  p ) break;.     
26700 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65   }.      if( cSe
26710 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  p=='(' ){.      
26720 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26730 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20  Create);.       
26740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
26750 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78  tx.z);.        x
26760 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
26770 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
26780 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
26790 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20   empty file\n", 
267a0 73 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20  sCtx.zFile);.   
267b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
267c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72       }.      zCr
267d0 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
267e0 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20  printf("%z\n)", 
267f0 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
26800 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
26810 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65  c(p->db, zCreate
26820 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
26830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26840 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Create);.      i
26850 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26860 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
26870 65 72 72 2c 20 22 43 52 45 41 54 45 20 54 41 42  err, "CREATE TAB
26880 4c 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65  LE %s(...) faile
26890 64 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65  d: %s\n", zTable
268a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
268b0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
268c0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
268d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
268e0 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
268f0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
26900 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26910 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
26920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
26930 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
26940 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
26950 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
26960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
26970 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
26980 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  ){.      if (pSt
26990 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
269a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
269b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
269c0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
269d0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
269e0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
269f0 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
26a00 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
26a10 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
26a20 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
26a30 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
26a40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
26a50 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
26a60 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
26a70 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29     if( nCol==0 )
26a80 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f   return 0; /* no
26a90 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72   columns, no err
26aa0 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d  or */.    zSql =
26ab0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
26ac0 34 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20  4( nByte*2 + 20 
26ad0 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
26ae0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
26af0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
26b00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
26b10 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
26b20 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
26b30 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
26b40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
26b60 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20  rintf(nByte+20, 
26b70 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e  zSql, "INSERT IN
26b80 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53  TO \"%w\" VALUES
26b90 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
26ba0 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    j = strlen30(z
26bb0 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Sql);.    for(i=
26bc0 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  1; i<nCol; i++){
26bd0 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
26be0 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53   = ',';.      zS
26bf0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20  ql[j++] = '?';. 
26c00 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b     }.    zSql[j+
26c10 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53  +] = ')';.    zS
26c20 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ql[j] = 0;.    r
26c30 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
26c40 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
26c50 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
26c60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
26c70 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
26c80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26c90 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
26ca0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
26cb0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
26cc0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
26cd0 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
26ce0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
26cf0 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  mt);.      xClos
26d00 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
26d10 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
26d20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69   }.    needCommi
26d30 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  t = sqlite3_get_
26d40 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62  autocommit(p->db
26d50 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43  );.    if( needC
26d60 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f  ommit ) sqlite3_
26d70 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47  exec(p->db, "BEG
26d80 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
26d90 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74     do{.      int
26da0 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74   startLine = sCt
26db0 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  x.nLine;.      f
26dc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
26dd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
26de0 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73  ar *z = xRead(&s
26df0 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Ctx);.        /*
26e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20  .        ** Did 
26e10 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d  we reach end-of-
26e20 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64  file before find
26e30 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f  ing any columns?
26e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73  .        ** If s
26e50 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20  o, stop instead 
26e60 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20  of NULL filling 
26e70 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  the remaining co
26e80 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a  lumns..        *
26e90 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  /.        if( z=
26ea0 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  =0 && i==0 ) bre
26eb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  ak;.        /*. 
26ec0 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65         ** Did we
26ed0 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
26ee0 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e  le OR end-of-lin
26ef0 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67  e before finding
26f00 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   any.        ** 
26f10 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49  columns in ASCII
26f20 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73   mode?  If so, s
26f30 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e  top instead of N
26f40 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20  ULL filling.    
26f50 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69      ** the remai
26f60 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  ning columns..  
26f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26f80 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
26f90 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d  DE_Ascii && (z==
26fa0 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26  0 || z[0]==0) &&
26fb0 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   i==0 ) break;. 
26fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
26fd0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
26fe0 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  i+1, z, -1, SQLI
26ff0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
27000 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
27010 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65 72  l-1 && sCtx.cTer
27020 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m!=sCtx.cColSep 
27030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
27040 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27050 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65   "%s:%d: expecte
27060 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74  d %d columns but
27070 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20   found %d - ".  
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27090 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67          "filling
270a0 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e   the rest with N
270b0 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74    sCtx.zFile, st
270e0 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69  artLine, nCol, i
270f0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
27100 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
27110 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20   while( i<=nCol 
27120 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ){ sqlite3_bind_
27130 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20  null(pStmt, i); 
27140 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  i++; }.        }
27150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27160 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  f( sCtx.cTerm==s
27170 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20  Ctx.cColSep ){. 
27180 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
27190 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74 78       xRead(&sCtx
271a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  );.          i++
271b0 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65  ;.        }while
271c0 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43  ( sCtx.cTerm==sC
271d0 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20  tx.cColSep );.  
271e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
271f0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
27200 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
27210 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20  lumns but found 
27220 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20  %d - ".         
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27240 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e  extras ignored\n
27250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27260 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e             sCtx.
27270 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65  zFile, startLine
27280 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20  , nCol, i);.    
27290 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
272a0 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
272b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
272c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
272d0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
272e0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
272f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27310 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27320 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45  rr, "%s:%d: INSE
27330 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  RT failed: %s\n"
27340 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20  , sCtx.zFile,.  
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73      startLine, s
27370 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
27380 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  >db));.        }
27390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
273a0 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21  ile( sCtx.cTerm!
273b0 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c  =EOF );..    xCl
273c0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
273d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
273e0 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c  sCtx.z);.    sql
273f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
27400 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  tmt);.    if( ne
27410 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74  edCommit ) sqlit
27420 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
27430 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
27440 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
27450 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
27460 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
27470 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
27480 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65  Arg[0], "imposte
27490 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  r", n)==0 ){.   
274a0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
274b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20   char *zCollist 
274c0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
274d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
274e0 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a    int tnum = 0;.
274f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
27500 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
27510 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27520 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
27530 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
27540 49 4d 50 4f 53 54 45 52 5c 6e 22 29 3b 0a 20 20  IMPOSTER\n");.  
27550 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
27560 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
27570 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
27580 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
27590 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
275a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
275b0 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
275c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
275d0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
275f0 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20  WHERE name='%q' 
27600 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
27610 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
27620 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
27630 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
27640 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
27650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27660 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
27670 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
27680 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
27690 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20  W ){.      tnum 
276a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
276b0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
276c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
276d0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
276e0 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d  );.    if( tnum=
276f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
27700 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27710 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
27720 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
27730 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
27740 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
27750 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
27760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
27770 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
27780 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
27790 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a  _xinfo='%q'", az
277a0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20  Arg[1]);.    rc 
277b0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
277c0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
277d0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
277e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
277f0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20  ee(zSql);.    i 
27800 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
27810 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
27820 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
27830 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  ){.      char zL
27840 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20  abel[20];.      
27850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
27860 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27870 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27880 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  ext(pStmt,2);.  
27890 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
278a0 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
278b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
278c0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
278d0 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  mt,1)==-1 ){.   
278e0 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
278f0 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
27900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27910 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27920 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  tf(sizeof(zLabel
27930 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64  ),zLabel,"expr%d
27940 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",i);.          
27950 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20  zCol = zLabel;. 
27960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27970 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
27980 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
27990 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
279a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
279b0 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20  %w\"", zCol);.  
279c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
279d0 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
279e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
279f0 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c  z,\"%w\"", zColl
27a00 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist, zCol);.    
27a10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
27a20 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
27a30 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
27a40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
27a50 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  f(.          "CR
27a60 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
27a70 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59  "(%s,PRIMARY KEY
27a80 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57  (%s))WITHOUT ROW
27a90 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  ID",.          a
27aa0 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73  zArg[2], zCollis
27ab0 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  t, zCollist);.  
27ac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27ad0 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63  Collist);.    rc
27ae0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
27af0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
27b00 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
27b10 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
27b20 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69   1, tnum);.    i
27b30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27b40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27b50 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
27b60 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
27b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27b80 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
27b90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
27ba0 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
27bb0 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
27bc0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27bd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27be0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
27bf0 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c   in [%s]: %s\n",
27c00 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65   zSql, sqlite3_e
27c10 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
27c20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27c30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27c40 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  stdout, "%s;\n",
27c50 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
27c60 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  raw_printf(stdou
27c70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57  t,.           "W
27c80 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20  ARNING: writing 
27c90 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74  to an imposter t
27ca0 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70  able will corrup
27cb0 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a  t the index!\n".
27cc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27cd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
27ce0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
27cf0 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54  tderr, "SQLITE_T
27d00 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
27d10 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
27d20 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc);.      rc = 
27d30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
27d40 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
27d50 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
27d60 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
27d70 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
27d80 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TROL) */..#ifdef
27d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
27da0 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d  OTRACE.  if( c==
27db0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
27dc0 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63  zArg[0], "iotrac
27dd0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
27de0 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65   SQLITE_API exte
27df0 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f  rn void (SQLITE_
27e00 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f  CDECL *sqlite3Io
27e10 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  Trace)(const cha
27e20 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66  r*, ...);.    if
27e30 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74  ( iotrace && iot
27e40 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66  race!=stdout ) f
27e50 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a  close(iotrace);.
27e60 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b      iotrace = 0;
27e70 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
27e80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27e90 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
27ea0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
27eb0 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
27ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
27ed0 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
27ee0 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
27ef0 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64     iotrace = std
27f00 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
27f10 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
27f20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
27f30 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
27f40 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20  iotrace==0 ){.  
27f50 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27f60 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
27f70 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
27f80 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
27f90 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
27fa0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
27fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
27fc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27fd0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
27fe0 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
27ff0 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ntf;.      }.   
28000 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
28010 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
28020 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
28030 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
28040 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mits", n)==0 ){.
28050 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
28060 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
28070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
28080 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  mitName;   /* Na
28090 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f  me of a limit */
280a0 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69  .       int limi
280b0 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  tCode;          
280c0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64    /* Integer cod
280d0 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74  e for that limit
280e0 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74   */.    } aLimit
280f0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
28100 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
28110 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
28120 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
28140 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c  ,.      { "sql_l
28150 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
28160 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
28170 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
28180 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
28190 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20     { "column",  
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
281b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
281c0 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
281d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
281e0 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20  "expr_depth",   
281f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
28200 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28220 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  },.      { "comp
28230 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20  ound_select",   
28240 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
28250 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
28260 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
28270 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c      { "vdbe_op",
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
28290 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
282a0 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
282b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
282c0 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c   "function_arg",
282d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
282e0 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
282f0 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ARG             
28300 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74   },.      { "att
28310 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20  ached",         
28320 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
28330 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
28340 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
28350 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74       { "like_pat
28360 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20  tern_length",   
28370 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
28380 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
28390 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
283a0 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62  { "variable_numb
283b0 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
283c0 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
283d0 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20  _NUMBER         
283e0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72    },.      { "tr
283f0 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20  igger_depth",   
28400 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
28410 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
28430 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f        { "worker_
28440 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20  threads",       
28450 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
28460 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
28470 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
28480 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
28490 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
284a0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
284b0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==1 ){.      for
284c0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
284d0 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
284e0 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
284f0 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69  "%20s %d\n", aLi
28500 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
28510 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
28520 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
28530 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d  p->db, aLimit[i]
28540 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
28550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
28560 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29  lse if( nArg>3 )
28570 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28580 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
28590 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f  e: .limit NAME ?
285a0 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a  NEW-VALUE?\n");.
285b0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
285c0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
285d0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
285e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
285f0 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   iLimit = -1;.  
28600 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
28610 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
28620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
28630 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
28640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
28650 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
28660 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  cmp(aLimit[i].zL
28670 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b  imitName, azArg[
28680 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  1], n2)==0 ){.  
28690 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d          if( iLim
286a0 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
286b0 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a      iLimit = i;.
286c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
286d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
286e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
286f0 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69   "ambiguous limi
28700 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  t: \"%s\"\n", az
28710 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
28720 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
28730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
28740 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
28750 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28770 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
28780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
28790 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
287a0 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a   "unknown limit:
287b0 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d     "enter \".lim
287e0 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  its\" with no ar
287f0 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
28800 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  st.\n",.        
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
28830 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
28840 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
28850 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
28860 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41    }.      if( nA
28870 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
28880 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
28890 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
288a0 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a  mit].limitCode,.
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67        (int)integ
288d0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  erValue(azArg[2]
288e0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
288f0 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
28900 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  d\n", aLimit[iLi
28910 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  mit].zLimitName,
28920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
28930 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
28940 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
28950 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
28960 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28970 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
28980 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  & n>2 && strncmp
28990 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74  (azArg[0], "lint
289a0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
289b0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
289c0 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e     lintDotComman
289d0 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
289e0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
289f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28a00 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
28a10 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
28a20 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
28a30 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
28a40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
28a50 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
28a60 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
28a70 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
28a80 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
28a90 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
28aa0 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
28ab0 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
28ac0 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
28ad0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
28ae0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
28af0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
28b00 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
28b10 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
28b20 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
28b30 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
28b40 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
28b50 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
28b60 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
28b70 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
28b80 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
28b90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28ba0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28bb0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
28bc0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
28bd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28be0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
28bf0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
28c00 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
28c10 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
28c20 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28c30 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d  g[0], "log", n)=
28c40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
28c50 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
28c60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28c70 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46  , "Usage: .log F
28c80 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
28c90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
28ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
28cb0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
28cc0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
28cd0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
28ce0 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  e(p->pLog);.    
28cf0 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70    p->pLog = outp
28d00 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
28d10 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  le);.    }.  }el
28d20 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27  se..  if( c=='m'
28d30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28d40 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29  g[0], "mode", n)
28d50 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
28d60 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e   char *zMode = n
28d70 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
28d80 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  ] : "";.    int 
28d90 6e 32 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  n2 = (int)strlen
28da0 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74  (zMode);.    int
28db0 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a   c2 = zMode[0];.
28dc0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20      if( c2=='l' 
28dd0 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
28de0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e  mp(azArg[1],"lin
28df0 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  es",n2)==0 ){.  
28e00 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
28e10 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73  DE_Line;.      s
28e20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28e30 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
28e40 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
28e50 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
28e60 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
28e70 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
28e80 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
28e90 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29  olumns",n2)==0 )
28ea0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
28eb0 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
28ec0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
28ed0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
28ee0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
28ef0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
28f00 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
28f10 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20  lse if( c2=='l' 
28f20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
28f30 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73  mp(azArg[1],"lis
28f40 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
28f50 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
28f60 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  E_List;.      sq
28f70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28f80 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
28f90 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
28fa0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c  parator, SEP_Col
28fb0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
28fc0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
28fd0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
28fe0 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
28ff0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
29000 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
29010 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  2=='h' && strncm
29020 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c  p(azArg[1],"html
29030 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
29040 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
29050 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
29060 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20   if( c2=='t' && 
29070 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
29080 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"tcl",n2)==0 ){
29090 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
290a0 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20   MODE_Tcl;.     
290b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
290c0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
290d0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
290e0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
290f0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71  Space);.      sq
29100 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
29110 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
29120 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
29130 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
29140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
29150 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
29160 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
29170 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
29180 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
29190 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c  E_Csv;.      sql
291a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
291b0 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
291c0 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
291d0 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d  arator, SEP_Comm
291e0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
291f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
29200 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
29210 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
29220 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
29230 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
29240 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70  =='t' && strncmp
29250 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22  (azArg[1],"tabs"
29260 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
29270 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
29280 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
29290 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
292a0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
292b0 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
292c0 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b  rator, SEP_Tab);
292d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
292e0 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  2=='i' && strncm
292f0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65  p(azArg[1],"inse
29300 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  rt",n2)==0 ){.  
29310 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
29320 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
29330 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
29340 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41  p, nArg>=3 ? azA
29350 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29  rg[2] : "table")
29360 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
29370 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63  c2=='q' && strnc
29380 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f  mp(azArg[1],"quo
29390 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  te",n2)==0 ){.  
293a0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
293b0 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65  DE_Quote;.    }e
293c0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20  lse if( c2=='a' 
293d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
293e0 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d  [1],"ascii",n2)=
293f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
29400 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69  ode = MODE_Ascii
29410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29420 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
29430 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
29440 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
29450 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20  r, SEP_Unit);.  
29460 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29470 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
29480 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
29490 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
294a0 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  EP_Record);.    
294b0 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 61  }else {.      ra
294c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
294d0 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68   "Error: mode sh
294e0 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
294f0 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69  ".         "asci
29500 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d  i column csv htm
29510 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69  l insert line li
29520 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63  st quote tabs tc
29530 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
29540 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
29550 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
29560 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  e;.  }else..  if
29570 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e  ( c=='n' && strn
29580 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e  cmp(azArg[0], "n
29590 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30  ullvalue", n)==0
295a0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
295b0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
295c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
295d0 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  zeof(p->nullValu
295e0 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  e), p->nullValue
295f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29600 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
29610 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
29620 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c  p->nullValue)-1,
29630 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
29640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
29650 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29660 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c  "Usage: .nullval
29670 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20  ue STRING\n");. 
29680 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
29690 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
296a0 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e  ( c=='o' && strn
296b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
296c0 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  pen", n)==0 && n
296d0 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=2 ){.    char 
296e0 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20  *zNewFilename;  
296f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
29700 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29710 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
29720 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20  iName = 1;      
29730 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41   /* Index in azA
29740 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65  rg[] of the file
29750 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  name */.    int 
29760 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  newFlag = 0;    
29770 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
29780 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f  te file before o
29790 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a  pening */.    /*
297a0 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74   Close the exist
297b0 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ing database */.
297c0 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
297d0 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71  e_all(p);.    sq
297e0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
297f0 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
29800 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  0;.    p->zDbFil
29810 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  ename = 0;.    s
29820 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
29830 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  FreeOnClose);.  
29840 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
29850 65 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 43 68  e = 0;.    /* Ch
29860 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d  eck for command-
29870 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a  line arguments *
29880 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d  /.    for(iName=
29890 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26  1; iName<nArg &&
298a0 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d   azArg[iName][0]
298b0 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b  =='-'; iName++){
298c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
298d0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61  r *z = azArg[iNa
298e0 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  me];.      if( o
298f0 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65  ptionMatch(z,"ne
29900 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  w") ){.        n
29910 65 77 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  ewFlag = 1;.    
29920 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
29930 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
29940 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29950 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
29960 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
29970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
29980 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
29990 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
299a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
299b0 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e     /* If a filen
299c0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
299d0 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74  , try to open it
299e0 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e   first */.    zN
299f0 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72  ewFilename = nAr
29a00 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  g>iName ? sqlite
29a10 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
29a20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20  azArg[iName]) : 
29a30 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46  0;.    if( zNewF
29a40 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
29a50 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
29a60 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
29a70 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
29a80 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
29a90 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
29aa0 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
29ab0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  (p, 1);.      if
29ac0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
29ad0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29ae0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
29af0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
29b00 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
29b10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
29b20 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
29b30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
29b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
29b50 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
29b60 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
29b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29b80 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
29b90 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
29ba0 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
29bb0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
29bc0 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
29bd0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
29be0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
29bf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
29c00 20 69 66 28 20 63 3d 3d 27 6f 27 0a 20 20 20 26   if( c=='o'.   &
29c10 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
29c20 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e  [0], "output", n
29c30 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28  )==0 || strncmp(
29c40 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22  azArg[0], "once"
29c50 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  , n)==0).  ){.  
29c60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
29c70 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  ile = nArg>=2 ? 
29c80 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f  azArg[1] : "stdo
29c90 75 74 22 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  ut";.    if( nAr
29ca0 67 3e 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66  g>2 ){.      utf
29cb0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29cc0 20 22 55 73 61 67 65 3a 20 2e 25 73 20 46 49 4c   "Usage: .%s FIL
29cd0 45 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  E\n", azArg[0]);
29ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
29cf0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
29d00 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
29d10 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26   }.    if( n>1 &
29d20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
29d30 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d  0], "once", n)==
29d40 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
29d50 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  Arg<2 ){.       
29d60 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29d70 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63  rr, "Usage: .onc
29d80 65 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  e FILE\n");.    
29d90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29da0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
29db0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
29dc0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74    }.      p->out
29dd0 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d  Count = 2;.    }
29de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
29df0 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  utCount = 0;.   
29e00 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65   }.    output_re
29e10 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
29e20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
29e30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
29e40 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
29e50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29e60 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
29e70 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
29e80 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
29e90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
29ea0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
29eb0 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
29ec0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
29ed0 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
29ee0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
29ef0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
29f00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29f10 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
29f20 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
29f30 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
29f40 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
29f50 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
29f60 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
29f70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29f80 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29f90 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
29fa0 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
29fb0 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
29fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
29fd0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
29fe0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
29ff0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
2a000 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
2a010 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->out==0 ){.    
2a020 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2a030 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20 29  File,"off")!=0 )
2a040 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
2a050 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2a060 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
2a070 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
2a080 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
2a090 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f    }.        p->o
2a0a0 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
2a0b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a0c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2a0d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a0e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
2a0f0 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
2a100 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
2a110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a120 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a130 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26  c=='p' && n>=3 &
2a140 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a150 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d  0], "print", n)=
2a160 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
2a170 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2a180 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2a190 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77 5f    if( i>1 ) raw_
2a1a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2a1b0 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   ");.      utf8_
2a1c0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2a1d0 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
2a1e0 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
2a1f0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
2a200 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ");.  }else..  i
2a210 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72  f( c=='p' && str
2a220 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2a230 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29  prompt", n)==0 )
2a240 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  {.    if( nArg >
2a250 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 2) {.      str
2a260 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c  ncpy(mainPrompt,
2a270 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72  azArg[1],(int)Ar
2a280 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d  raySize(mainProm
2a290 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
2a2a0 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29    if( nArg >= 3)
2a2b0 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
2a2c0 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c  (continuePrompt,
2a2d0 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72  azArg[2],(int)Ar
2a2e0 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65  raySize(continue
2a2f0 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
2a300 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2a310 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63   c=='q' && strnc
2a320 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75  mp(azArg[0], "qu
2a330 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
2a340 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
2a350 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
2a360 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2a370 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
2a380 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
2a390 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20    FILE *alt;.   
2a3a0 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
2a3b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2a3c0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2a3d0 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b   .read FILE\n");
2a3e0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2a3f0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2a400 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2a410 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f 70   }.    alt = fop
2a420 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
2a430 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
2a440 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2a450 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2a460 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2a470 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
2a480 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
2a490 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
2a4a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
2a4b0 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c  cess_input(p, al
2a4c0 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  t);.      fclose
2a4d0 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (alt);.    }.  }
2a4e0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2a4f0 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  r' && n>=3 && st
2a500 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2a510 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30  "restore", n)==0
2a520 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2a530 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
2a540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2a550 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
2a560 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
2a570 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
2a580 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
2a590 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
2a5a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2a5b0 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
2a5c0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[1];.      zD
2a5d0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
2a5e0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
2a5f0 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  3 ){.      zSrcF
2a600 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  ile = azArg[2];.
2a610 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72        zDb = azAr
2a620 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  g[1];.    }else{
2a630 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2a640 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2a650 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20  : .restore ?DB? 
2a660 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
2a670 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2a680 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2a690 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2a6a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2a6b0 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  n(zSrcFile, &pSr
2a6c0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
2a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a6e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2a6f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
2a700 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
2a710 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b  "\n", zSrcFile);
2a720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
2a730 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
2a740 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a750 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
2a760 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
2a770 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
2a780 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a 44  p_init(p->db, zD
2a790 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29  b, pSrc, "main")
2a7a0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
2a7b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  p==0 ){.      ut
2a7c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a7d0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2a7e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2a7f0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73  p->db));.      s
2a800 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
2a810 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
2a820 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
2a830 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
2a840 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
2a850 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
2a860 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
2a870 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
2a880 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69  BUSY  ){.      i
2a890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
2a8a0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
2a8b0 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
2a8c0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
2a8d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
2a8e0 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
2a8f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a900 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
2a910 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
2a920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2a930 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
2a940 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a950 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
2a960 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  || rc==SQLITE_LO
2a970 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72 61  CKED ){.      ra
2a980 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a990 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65 20   "Error: source 
2a9a0 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73 79  database is busy
2a9b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2a9c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2a9d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2a9e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2a9f0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2aa00 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2aa10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2aa20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2aa30 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d  close(pSrc);.  }
2aa40 65 6c 73 65 0a 0a 0a 20 20 69 66 28 20 63 3d 3d  else...  if( c==
2aa50 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
2aa60 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
2aa70 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
2aa80 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2aa90 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
2aaa0 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  tatsOn = boolean
2aab0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
2aac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aad0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
2aae0 53 54 41 54 55 53 0a 20 20 20 20 20 20 72 61 77  STATUS.      raw
2aaf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ab00 22 57 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73  "Warning: .scans
2ab10 74 61 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  tats not availab
2ab20 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
2ab30 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
2ab40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ab50 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ab60 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73  , "Usage: .scans
2ab70 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  tats on|off\n");
2ab80 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ab90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2aba0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
2abb0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2abc0 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20  "schema", n)==0 
2abd0 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  ){.    ShellStat
2abe0 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
2abf0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2ac00 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2ac10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2ac20 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
2ac30 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
2ac40 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2ac50 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2ac60 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2ac70 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e  _Semi;.    if( n
2ac80 41 72 67 3e 3d 32 20 26 26 20 6f 70 74 69 6f 6e  Arg>=2 && option
2ac90 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20  Match(azArg[1], 
2aca0 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20  "indent") ){.   
2acb0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2acc0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2acd0 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e  _Pretty;.      n
2ace0 41 72 67 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  Arg--;.      if(
2acf0 20 6e 41 72 67 3d 3d 32 20 29 20 61 7a 41 72 67   nArg==2 ) azArg
2ad00 5b 31 5d 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  [1] = azArg[2];.
2ad10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
2ad20 72 67 3d 3d 32 20 26 26 20 61 7a 41 72 67 5b 31  rg==2 && azArg[1
2ad30 5d 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]!='-' ){.   
2ad40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2ad50 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31  for(i=0; azArg[1
2ad60 5d 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67  ][i]; i++) azArg
2ad70 5b 31 5d 5b 69 5d 20 3d 20 54 6f 4c 6f 77 65 72  [1][i] = ToLower
2ad80 28 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20  (azArg[1][i]);. 
2ad90 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2ada0 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65  azArg[1],"sqlite
2adb0 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a  _master")==0 ){.
2adc0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65          char *ne
2add0 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f  w_argv[2], *new_
2ade0 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  colv[2];.       
2adf0 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22   new_argv[0] = "
2ae00 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c  CREATE TABLE sql
2ae10 69 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a  ite_master (\n".
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae30 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
2ae40 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2ae60 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae80 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
2ae90 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2aeb0 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
2aec0 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2aee0 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 20 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e    ")";.        n
2af10 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a  ew_argv[1] = 0;.
2af20 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
2af30 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20  [0] = "sql";.   
2af40 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d       new_colv[1]
2af50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61   = 0;.        ca
2af60 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c  llback(&data, 1,
2af70 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63   new_argv, new_c
2af80 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  olv);.        rc
2af90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2afa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2afb0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73  rcmp(azArg[1],"s
2afc0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
2afd0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
2afe0 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76    char *new_argv
2aff0 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32  [2], *new_colv[2
2b000 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ];.        new_a
2b010 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45  rgv[0] = "CREATE
2b020 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69   TEMP TABLE sqli
2b030 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 28  te_temp_master (
2b040 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
2b050 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70            "  typ
2b060 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
2b090 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2b0a0 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e          "  tbl_n
2b0b0 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
2b0e0 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a   "  sql text\n".
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20        ")";.     
2b130 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
2b140 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
2b150 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
2b160 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
2b170 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
2b180 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
2b190 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
2b1a0 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
2b1b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2b1c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b1d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71         char *zSq
2b1e0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  l;.        zSql 
2b1f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b200 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
2b210 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a  LECT sql FROM ".
2b220 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53 45            "  (SE
2b230 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
2b240 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
2b250 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
2b260 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
2b270 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
2b280 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2b290 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
2b2a0 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45          "   SELE
2b2b0 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62  CT sql, type, tb
2b2c0 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f  l_name, name, ro
2b2d0 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
2b2e0 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
2b2f0 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
2b300 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29 20  lower(tbl_name) 
2b310 4c 49 4b 45 20 25 51 22 0a 20 20 20 20 20 20 20  LIKE %Q".       
2b320 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 21 3d     "  AND type!=
2b330 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
2b340 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20  OTNULL ".       
2b350 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77     "ORDER BY row
2b360 69 64 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  id", azArg[1]);.
2b370 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b380 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2b390 20 7a 53 71 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c   zSql, callback,
2b3a0 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
2b3b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b3c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2b3d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b3e0 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
2b3f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b400 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
2b410 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2b420 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20 20 20  sql FROM ".     
2b430 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 73      "  (SELECT s
2b440 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70  ql sql, type typ
2b450 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f  e, tbl_name tbl_
2b460 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c  name, name name,
2b470 20 72 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20   rowid x".      
2b480 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71     "     FROM sq
2b490 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f  lite_master UNIO
2b4a0 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20  N ALL".         
2b4b0 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
2b4c0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
2b4d0 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
2b4e0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
2b4f0 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20 20  ter) ".         
2b500 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
2b510 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
2b520 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
2b530 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
2b540 20 22 0a 20 20 20 20 20 20 20 20 20 22 4f 52 44   ".         "ORD
2b550 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20  ER BY rowid",.  
2b560 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
2b570 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
2b580 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
2b590 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2b5a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2b5b0 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d  sage: .schema ?-
2b5c0 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50  -indent? ?LIKE-P
2b5d0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
2b5e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2b5f0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2b600 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2b610 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
2b620 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2b630 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2b640 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
2b650 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2b660 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
2b670 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2b680 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
2b690 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
2b6a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2b6b0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2b6c0 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61 20  querying schema 
2b6d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
2b6e0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2b6f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b700 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
2b710 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e  }else..#if defin
2b720 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
2b730 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2b740 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
2b750 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d 3d  TRACE).  if( c==
2b760 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26 20  's' && n==11 && 
2b770 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2b780 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65 22 2c  , "selecttrace",
2b790 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   n)==0 ){.    sq
2b7a0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2b7b0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
2b7c0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2b7d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2b7e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2b7f0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
2b800 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  N).  if( c=='s' 
2b810 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2b820 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c 6e 29  [0],"session",n)
2b830 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b 0a 20  ==0 && n>=3 ){. 
2b840 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a     OpenSession *
2b850 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
2b860 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20  Session[0];.    
2b870 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 26  char **azCmd = &
2b880 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e  azArg[1];.    in
2b890 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20  t iSes = 0;.    
2b8a0 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72 67 20  int nCmd = nArg 
2b8b0 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  - 1;.    int i;.
2b8c0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20      if( nArg<=1 
2b8d0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
2b8e0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
2b8f0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b900 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20      if( nArg>=3 
2b910 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
2b920 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e 53 65  s=0; iSes<p->nSe
2b930 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a  ssion; iSes++){.
2b940 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2b950 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  mp(p->aSession[i
2b960 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72  Ses].zName, azAr
2b970 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  g[1])==0 ) break
2b980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b990 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73  if( iSes<p->nSes
2b9a0 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
2b9b0 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
2b9c0 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20  Session[iSes];. 
2b9d0 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a         azCmd++;.
2b9e0 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a          nCmd--;.
2b9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ba00 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20       pSession = 
2ba10 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b  &p->aSession[0];
2ba20 0a 20 20 20 20 20 20 20 20 69 53 65 73 20 3d 20  .        iSes = 
2ba30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2ba40 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
2ba50 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a 20  n attach TABLE. 
2ba60 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65     ** Invoke the
2ba70 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2ba80 61 74 74 61 63 68 28 29 20 69 6e 74 65 72 66 61  attach() interfa
2ba90 63 65 20 74 6f 20 61 74 74 61 63 68 20 61 20 70  ce to attach a p
2baa0 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a  articular.    **
2bab0 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69   table so that i
2bac0 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c 74 65  t is never filte
2bad0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
2bae0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
2baf0 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d 3d 30  [0],"attach")==0
2bb00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43   ){.      if( nC
2bb10 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73  md!=2 ) goto ses
2bb20 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
2bb30 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
2bb40 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20  ssion->p==0 ){. 
2bb50 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 6e         session_n
2bb60 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20 20 20  ot_open:.       
2bb70 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2bb80 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 20 73  rr, "ERROR: No s
2bb90 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e  essions are open
2bba0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  \n");.      }els
2bbb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2bbc0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61  sqlite3session_a
2bbd0 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e 2d 3e  ttach(pSession->
2bbe0 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  p, azCmd[1]);.  
2bbf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2bc00 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2bc10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
2bc20 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65 73 73  ROR: sqlite3sess
2bc30 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72 65 74  ion_attach() ret
2bc40 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
2bc50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bc60 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2bc70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
2bc80 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
2bc90 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 0a 20  changeset FILE. 
2bca0 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e 20 70     ** .session p
2bcb0 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20 20 20  atchset FILE.   
2bcc0 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61 6e   ** Write a chan
2bcd0 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65  geset or patchse
2bce0 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  t into a file.  
2bcf0 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76 65 72  The file is over
2bd00 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
2bd10 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
2bd20 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67 65 73  zCmd[0],"changes
2bd30 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  et")==0 || strcm
2bd40 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61 74 63  p(azCmd[0],"patc
2bd50 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  hset")==0 ){.   
2bd60 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 30     FILE *out = 0
2bd70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
2bd80 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=2 ) goto sessi
2bd90 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
2bda0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73  .      if( pSess
2bdb0 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f 74 6f  ion->p==0 ) goto
2bdc0 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65   session_not_ope
2bdd0 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20 66  n;.      out = f
2bde0 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20 22  open(azCmd[1], "
2bdf0 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wb");.      if( 
2be00 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
2be10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2be20 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 63 61  derr, "ERROR: ca
2be30 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
2be40 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c   for writing\n",
2be50 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20   azCmd[1]);.    
2be60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2be70 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20 20 20   int szChng;.   
2be80 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68 6e 67       void *pChng
2be90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
2bea0 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20 29  Cmd[0][0]=='c' )
2beb0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2bec0 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2bed0 63 68 61 6e 67 65 73 65 74 28 70 53 65 73 73 69  changeset(pSessi
2bee0 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20  on->p, &szChng, 
2bef0 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20  &pChng);.       
2bf00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bf10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
2bf20 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 70  ssion_patchset(p
2bf30 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43  Session->p, &szC
2bf40 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20  hng, &pChng);.  
2bf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2bf70 20 20 20 20 70 72 69 6e 74 66 28 22 45 72 72 6f      printf("Erro
2bf80 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  r: error code %d
2bf90 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
2bfa0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2bfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2bfc0 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20 20 20  ( pChng.        
2bfd0 20 20 26 26 20 66 77 72 69 74 65 28 70 43 68 6e    && fwrite(pChn
2bfe0 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f 75  g, szChng, 1, ou
2bff0 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  t)!=1 ){.       
2c000 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c010 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 46 61  derr, "ERROR: Fa
2c020 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20 65 6e  iled to write en
2c030 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f 75 74  tire %d-byte out
2c040 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  put\n",.        
2c050 20 20 20 20 20 20 20 20 20 20 73 7a 43 68 6e 67            szChng
2c060 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2c070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c080 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20  e(pChng);.      
2c090 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
2c0a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c0b0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
2c0c0 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 43  n close.    ** C
2c0d0 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74 69 66  lose the identif
2c0e0 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20 20 20  ied session.    
2c0f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2c100 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f  p(azCmd[0], "clo
2c110 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  se")==0 ){.     
2c120 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67   if( nCmd!=1 ) g
2c130 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2c140 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2c150 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
2c160 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  ){.        sessi
2c170 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73 69 6f  on_close(pSessio
2c180 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  n);.        p->a
2c190 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20 3d 20  Session[iSes] = 
2c1a0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d  p->aSession[--p-
2c1b0 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20  >nSession];.    
2c1c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
2c1d0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 65     /* .session e
2c1e0 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  nable ?BOOLEAN?.
2c1f0 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20      ** Query or 
2c200 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65 20 66  set the enable f
2c210 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  lag.    */.    i
2c220 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
2c230 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d 3d 30  0], "enable")==0
2c240 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
2c250 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
2c260 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  >2 ) goto sessio
2c270 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2c280 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d        ii = nCmd=
2c290 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61  =1 ? -1 : boolea
2c2a0 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29  nValue(azCmd[1])
2c2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
2c2c0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
2c2d0 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
2c2e0 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28 70 53  ession_enable(pS
2c2f0 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a  ession->p, ii);.
2c300 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2c310 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73  ntf(p->out, "ses
2c320 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65 20 66  sion %s enable f
2c330 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20  lag = %d\n",.   
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c350 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
2c360 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , ii);.      }. 
2c370 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
2c380 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72   .session filter
2c390 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a   GLOB .....    *
2c3a0 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f 66 20  * Set a list of 
2c3b0 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 6f 66  GLOB patterns of
2c3c0 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 6f 20   table names to 
2c3d0 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20 20 20  be excluded..   
2c3e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
2c3f0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 66 69  mp(azCmd[0], "fi
2c400 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lter")==0 ){.   
2c410 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79 74 65     int ii, nByte
2c420 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
2c430 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  <2 ) goto sessio
2c440 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2c450 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
2c460 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
2c470 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 53   for(ii=0; ii<pS
2c480 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b  ession->nFilter;
2c490 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2c4a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c4b0 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
2c4c0 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  r[ii]);.        
2c4d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2c4e0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
2c4f0 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  >azFilter);.    
2c500 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
2c510 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  of(pSession->azF
2c520 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d  ilter[0])*(nCmd-
2c530 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 73  1);.        pSes
2c540 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 20 3d  sion->azFilter =
2c550 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2c560 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20 20   nByte );.      
2c570 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
2c580 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b 0a 20  azFilter==0 ){. 
2c590 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
2c5a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2c5b0 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d 6f 72  or: out or memor
2c5c0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  y\n");.         
2c5d0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
2c5e0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2c5f0 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b 20 69  ii=1; ii<nCmd; i
2c600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2c610 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
2c620 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c 69 74  er[ii-1] = sqlit
2c630 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
2c640 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20 20 20   azCmd[ii]);.   
2c650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2c660 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
2c670 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20 20 7d   = ii-1;.      }
2c680 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
2c690 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e 64 69  /* .session indi
2c6a0 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20  rect ?BOOLEAN?. 
2c6b0 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20 73     ** Query or s
2c6c0 65 74 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  et the indirect 
2c6d0 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20  flag.    */.    
2c6e0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
2c6f0 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74 22 29  [0], "indirect")
2c700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2c710 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
2c720 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
2c730 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
2c740 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
2c750 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
2c760 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
2c770 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
2c780 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
2c790 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
2c7a0 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65  e3session_indire
2c7b0 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  ct(pSession->p, 
2c7c0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ii);.        utf
2c7d0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2c7e0 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 6e 64   "session %s ind
2c7f0 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25 64 5c  irect flag = %d\
2c800 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2c810 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
2c820 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
2c830 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
2c840 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
2c850 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20   isempty.    ** 
2c860 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  Determine if the
2c870 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74   session is empt
2c880 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  y.    */.    if(
2c890 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
2c8a0 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d 30 20  , "isempty")==0 
2c8b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
2c8c0 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
2c8d0 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
2c8e0 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2c8f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
2c900 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
2c910 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73   ii = sqlite3ses
2c920 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70 53 65  sion_isempty(pSe
2c930 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20  ssion->p);.     
2c940 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2c950 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20  ->out, "session 
2c960 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61 67 20  %s isempty flag 
2c970 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
2c990 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69  ssion->zName, ii
2c9a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c9b0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
2c9c0 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20 20 2a  ssion list.    *
2c9d0 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72 72 65  * List all curre
2c9e0 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
2c9f0 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ns.    */.    if
2ca00 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
2ca10 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ],"list")==0 ){.
2ca20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2ca30 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
2ca40 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  +){.        utf8
2ca50 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2ca60 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20 70 2d  "%d %s\n", i, p-
2ca70 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61  >aSession[i].zNa
2ca80 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
2ca90 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
2caa0 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44 42 20  session open DB 
2cab0 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70 65 6e  NAME.    ** Open
2cac0 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 63   a new session c
2cad0 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20 74 68  alled NAME on th
2cae0 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  e attached datab
2caf0 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a 20 44  ase DB..    ** D
2cb00 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d  B is normally "m
2cb10 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ain"..    */.   
2cb20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
2cb30 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30 20  d[0],"open")==0 
2cb40 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2cb50 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
2cb60 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f 20 73  nCmd!=3 ) goto s
2cb70 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
2cb80 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  ror;.      zName
2cb90 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20   = azCmd[2];.   
2cba0 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d     if( zName[0]=
2cbb0 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =0 ) goto sessio
2cbc0 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2cbd0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2cbe0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
2cbf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2cc00 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69  strcmp(p->aSessi
2cc10 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d  on[i].zName,zNam
2cc20 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
2cc30 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2cc40 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f 6e 20  tderr, "Session 
2cc50 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65  \"%s\" already e
2cc60 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  xists\n", zName)
2cc70 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2cc80 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2cc90 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2cca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ccb0 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41 72 72  p->nSession>=Arr
2ccc0 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73 69  aySize(p->aSessi
2ccd0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  on) ){.        r
2cce0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ccf0 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20 25 64  , "Maximum of %d
2cd00 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20 41 72   sessions\n", Ar
2cd10 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73  raySize(p->aSess
2cd20 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 67  ion));.        g
2cd30 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2cd40 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2cd50 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20       pSession = 
2cd60 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70 2d 3e  &p->aSession[p->
2cd70 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20  nSession];.     
2cd80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73   rc = sqlite3ses
2cd90 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d 3e 64  sion_create(p->d
2cda0 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26 70 53  b, azCmd[1], &pS
2cdb0 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20  ession->p);.    
2cdc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2cdd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cde0 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f  tderr, "Cannot o
2cdf0 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65 72 72  pen session: err
2ce00 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c 20 72  or code=%d\n", r
2ce10 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c);.        rc =
2ce20 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
2ce30 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2ce40 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2ce50 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
2ce60 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ter = 0;.      s
2ce70 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 74 61  qlite3session_ta
2ce80 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65 73 73  ble_filter(pSess
2ce90 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f 6e 5f  ion->p, session_
2cea0 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69 6f 6e  filter, pSession
2ceb0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 73  );.      p->nSes
2cec0 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 70 53  sion++;.      pS
2ced0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20  ession->zName = 
2cee0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2cef0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
2cf00 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49    }else.    /* I
2cf10 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  f no command nam
2cf20 65 20 6d 61 74 63 68 65 73 2c 20 73 68 6f 77 20  e matches, show 
2cf30 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a  a syntax error *
2cf40 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 73 79  /.    session_sy
2cf50 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 20 20  ntax_error:.    
2cf60 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 70 29 3b  session_help(p);
2cf70 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2cf80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2cf90 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75  EBUG.  /* Undocu
2cfa0 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  mented commands 
2cfb0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  for internal tes
2cfc0 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74  ting.  Subject t
2cfd0 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69  o change.  ** wi
2cfe0 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f  thout notice. */
2cff0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
2d000 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d   n>=10 && strncm
2d010 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
2d020 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29  ftest-", 9)==0 )
2d030 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
2d040 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62  p(azArg[0]+9, "b
2d050 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30  oolean", n-9)==0
2d060 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
2d070 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
2d080 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
2d090 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f  .        v = boo
2d0a0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2d0b0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  i]);.        utf
2d0c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2d0d0 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22   "%s: %d 0x%x\n"
2d0e0 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76  , azArg[i], v, v
2d0f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d100 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
2d110 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e  (azArg[0]+9, "in
2d120 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20  teger", n-9)==0 
2d130 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
2d140 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
2d150 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
2d160 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2d170 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
2d180 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20  200];.        v 
2d190 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
2d1a0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
2d1b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d1c0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
2d1d0 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30  zBuf,"%s: %lld 0
2d1e0 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b  x%llx\n", azArg[
2d1f0 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20 20  i],v,v);.       
2d200 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2d210 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  out, "%s", zBuf)
2d220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d230 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2d240 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2d250 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=4 && strncmp(
2d260 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74 65  azArg[0],"selfte
2d270 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  st",n)==0 ){.   
2d280 20 69 6e 74 20 62 49 73 49 6e 69 74 20 3d 20 30   int bIsInit = 0
2d290 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2d2a0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2d2b0 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
2d2c0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 56  le */.    int bV
2d2d0 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20  erbose = 0;     
2d2e0 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f 75     /* Verbose ou
2d2f0 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tput */.    int 
2d300 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b  bSelftestExists;
2d310 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d320 53 45 4c 46 54 45 53 54 20 61 6c 72 65 61 64 79  SELFTEST already
2d330 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
2d340 68 61 72 20 2a 2a 61 7a 54 65 73 74 20 3d 20 30  har **azTest = 0
2d350 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  ;       /* Conte
2d360 6e 74 20 6f 66 20 74 68 65 20 53 45 4c 46 54 45  nt of the SELFTE
2d370 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ST table */.    
2d380 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 20 20 20  int nRow = 0;   
2d390 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d3a0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2d3b0 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
2d3c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
2d3d0 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20   = 4;           
2d3e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2d3f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2d400 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20  FTEST table */. 
2d410 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
2d420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d430 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2d440 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
2d450 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2d460 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
2d470 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
2d480 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
2d490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d4a0 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
2d4b0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
2d4c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2d4d0 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
2d4e0 72 79 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  ry */.    static
2d4f0 20 63 68 61 72 20 2a 61 7a 44 65 66 61 75 6c 74   char *azDefault
2d500 54 65 73 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Test[] = {.     
2d510 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20    0, 0, 0, 0,.  
2d520 20 20 20 20 20 22 30 22 2c 20 22 6d 65 6d 6f 22       "0", "memo"
2d530 2c 20 22 4d 69 73 73 69 6e 67 20 53 45 4c 46 54  , "Missing SELFT
2d540 45 53 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61  EST table - defa
2d550 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 22  ult checks only"
2d560 2c 20 22 22 2c 0a 20 20 20 20 20 20 20 22 31 22  , "",.       "1"
2d570 2c 20 22 72 75 6e 22 2c 20 22 50 52 41 47 4d 41  , "run", "PRAGMA
2d580 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2d590 22 2c 20 22 6f 6b 22 0a 20 20 20 20 7d 3b 0a 20  ", "ok".    };. 
2d5a0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2d5b0 69 6e 74 20 6e 44 65 66 61 75 6c 74 52 6f 77 20  int nDefaultRow 
2d5c0 3d 20 32 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64  = 2;..    open_d
2d5d0 62 28 70 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28  b(p,0);.    for(
2d5e0 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
2d5f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2d600 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
2d610 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30  ];.      if( z[0
2d620 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
2d630 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
2d640 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
2d650 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  init")==0 ){.   
2d660 20 20 20 20 20 62 49 73 49 6e 69 74 20 3d 20 31       bIsInit = 1
2d670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
2d680 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2d690 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"-v")==0 ){.   
2d6a0 20 20 20 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b       bVerbose++;
2d6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
2d6c0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 74 66     {.        utf
2d6d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2d6e0 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
2d6f0 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c   \"%s\" on \"%s\
2d700 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
2d710 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2d720 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  i], azArg[0]);. 
2d730 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2d740 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c  f(stderr, "Shoul
2d750 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69  d be one of: --i
2d760 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20  nit -v\n");.    
2d770 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d780 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2d790 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2d7a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2d7b0 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  ( sqlite3_table_
2d7c0 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
2d7d0 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65  p->db,"main","se
2d7e0 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c  lftest",0,0,0,0,
2d7f0 30 2c 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  0,0).           
2d800 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
2d810 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45        bSelftestE
2d820 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d  xists = 0;.    }
2d830 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 53 65 6c  else{.      bSel
2d840 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b  ftestExists = 1;
2d850 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
2d860 49 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  IsInit ){.      
2d870 63 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61  createSelftestTa
2d880 62 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 62 53  ble(p);.      bS
2d890 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20  elftestExists = 
2d8a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
2d8b0 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
2d8c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2d8d0 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
2d8e0 28 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  (p->db, .       
2d8f0 20 20 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f     "SELECT tno,o
2d900 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73  p,cmd,ans FROM s
2d910 65 6c 66 74 65 73 74 20 4f 52 44 45 52 20 42 59  elftest ORDER BY
2d920 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20   tno",.         
2d930 20 26 61 7a 54 65 73 74 2c 20 26 6e 52 6f 77 2c   &azTest, &nRow,
2d940 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20   &nCol, 0);.    
2d950 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d960 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d970 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71 75  tderr, "Error qu
2d980 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66 74  erying the selft
2d990 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20  est table\n");. 
2d9a0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2d9b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d9c0 72 65 65 5f 74 61 62 6c 65 28 61 7a 54 65 73 74  ree_table(azTest
2d9d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2d9e0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2d9f0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
2da00 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  f( nRow==0 ){.  
2da10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2da20 65 65 5f 74 61 62 6c 65 28 61 7a 54 65 73 74 29  ee_table(azTest)
2da30 3b 0a 20 20 20 20 20 20 20 20 61 7a 54 65 73 74  ;.        azTest
2da40 20 3d 20 61 7a 44 65 66 61 75 6c 74 54 65 73 74   = azDefaultTest
2da50 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d  ;.        nRow =
2da60 20 6e 44 65 66 61 75 6c 74 52 6f 77 3b 0a 20 20   nDefaultRow;.  
2da70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2da80 0a 20 20 20 20 20 20 61 7a 54 65 73 74 20 3d 20  .      azTest = 
2da90 61 7a 44 65 66 61 75 6c 74 54 65 73 74 3b 0a 20  azDefaultTest;. 
2daa0 20 20 20 20 20 6e 52 6f 77 20 3d 20 6e 44 65 66       nRow = nDef
2dab0 61 75 6c 74 52 6f 77 3b 0a 20 20 20 20 7d 0a 20  aultRow;.    }. 
2dac0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72     initText(&str
2dad0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
2dae0 74 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b  t(&str, "x", 0);
2daf0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2db00 3d 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nRow; i++){.   
2db10 20 20 20 69 6e 74 20 74 6e 6f 20 3d 20 61 74 6f     int tno = ato
2db20 69 28 61 7a 54 65 73 74 5b 69 2a 6e 43 6f 6c 5d  i(azTest[i*nCol]
2db30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
2db40 68 61 72 20 2a 7a 4f 70 20 3d 20 61 7a 54 65 73  har *zOp = azTes
2db50 74 5b 69 2a 6e 43 6f 6c 2b 31 5d 3b 0a 20 20 20  t[i*nCol+1];.   
2db60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2db70 53 71 6c 20 3d 20 61 7a 54 65 73 74 5b 69 2a 6e  Sql = azTest[i*n
2db80 43 6f 6c 2b 32 5d 3b 0a 20 20 20 20 20 20 63 6f  Col+2];.      co
2db90 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d  nst char *zAns =
2dba0 20 61 7a 54 65 73 74 5b 69 2a 6e 43 6f 6c 2b 33   azTest[i*nCol+3
2dbb0 5d 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20  ];.  .      if( 
2dbc0 62 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20  bVerbose>0 ){.  
2dbd0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f        char *zQuo
2dbe0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2dbf0 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c 29  intf("%q", zSql)
2dc00 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  ;.        printf
2dc10 28 22 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c 20  ("%d: %s %s\n", 
2dc20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b  tno, zOp, zSql);
2dc30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dc40 5f 66 72 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20  _free(zQuote);. 
2dc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dc60 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d   strcmp(zOp,"mem
2dc70 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
2dc80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2dc90 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
2dca0 71 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ql);.      }else
2dcb0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2dcc0 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20  p(zOp,"run")==0 
2dcd0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2dce0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2dcf0 20 20 20 20 20 20 73 74 72 2e 6e 20 3d 20 30 3b        str.n = 0;
2dd00 0a 20 20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30  .        str.z[0
2dd10 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  ] = 0;.        r
2dd20 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2dd30 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61  (p->db, zSql, ca
2dd40 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
2dd50 61 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  ack, &str, &zErr
2dd60 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 6e 54  Msg);.        nT
2dd70 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  est++;.        i
2dd80 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
2dd90 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2dda0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65  intf(p->out, "Re
2ddb0 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72  sult: %s\n", str
2ddc0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .z);.        }. 
2ddd0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c         if( rc ||
2dde0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
2ddf0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
2de00 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2de10 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2de20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2de30 64 3a 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64  d: error-code-%d
2de40 3a 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63  : %s\n", tno, rc
2de50 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
2de60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2de70 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2de80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2de90 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a  trcmp(zAns,str.z
2dea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2deb0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
2dec0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2ded0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2dee0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 45  f(p->out, "%d: E
2def0 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 22  xpected: [%s]\n"
2df00 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20 20  , tno, zAns);.  
2df10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2df20 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a  ntf(p->out, "%d:
2df30 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c        Got: [%s]\
2df40 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e 7a 29 3b  n", tno, str.z);
2df50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2df60 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
2df70 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2df80 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
2df90 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70       "Unknown op
2dfa0 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f  eration \"%s\" o
2dfb0 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e 65 20  n selftest line 
2dfc0 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29  %d\n", zOp, tno)
2dfd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2dfe0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2dff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e000 20 20 20 66 72 65 65 54 65 78 74 28 26 73 74 72     freeText(&str
2e010 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 54 65 73  );.    if( azTes
2e020 74 21 3d 61 7a 44 65 66 61 75 6c 74 54 65 73 74  t!=azDefaultTest
2e030 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f   ) sqlite3_free_
2e040 74 61 62 6c 65 28 61 7a 54 65 73 74 29 3b 0a 20  table(azTest);. 
2e050 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e060 2d 3e 6f 75 74 2c 20 22 25 64 20 65 72 72 6f 72  ->out, "%d error
2e070 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74  s out of %d test
2e080 73 5c 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73  s\n", nErr, nTes
2e090 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
2e0a0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
2e0b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e0c0 73 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d  separator", n)==
2e0d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2e0e0 67 3c 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b  g<2 || nArg>3 ){
2e0f0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2e100 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2e110 3a 20 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c  : .separator COL
2e120 20 3f 52 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20   ?ROW?\n");.    
2e130 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2e140 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
2e150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e160 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2e170 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2e180 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2e190 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
2e1a0 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73             "%.*s
2e1b0 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a  ", (int)ArraySiz
2e1c0 65 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  e(p->colSeparato
2e1d0 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  r)-1, azArg[1]);
2e1e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2e1f0 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
2e200 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2e210 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2e220 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2e230 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20  Separator,.     
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41    "%.*s", (int)A
2e260 72 72 61 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53  rraySize(p->rowS
2e270 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41  eparator)-1, azA
2e280 72 67 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[2]);.    }.  
2e290 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2e2a0 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73  's' && n>=4 && s
2e2b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2e2c0 22 73 68 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20  "sha3sum",n)==0 
2e2d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2e2e0 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20  r *zLike = 0;   
2e2f0 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 20 74  /* Which table t
2e300 6f 20 63 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65  o checksum. 0 me
2e310 61 6e 73 20 65 76 65 72 79 74 68 69 6e 67 20 2a  ans everything *
2e320 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e340 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2e350 2f 0a 20 20 20 20 69 6e 74 20 62 53 63 68 65 6d  /.    int bSchem
2e360 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
2e370 2a 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20  * Also hash the 
2e380 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e  schema */.    in
2e390 74 20 62 53 65 70 61 72 61 74 65 20 3d 20 30 3b  t bSeparate = 0;
2e3a0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65         /* Hash e
2e3b0 61 63 68 20 74 61 62 6c 65 20 73 65 70 61 72 61  ach table separa
2e3c0 74 65 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tely */.    int 
2e3d0 69 53 69 7a 65 20 3d 20 32 32 34 3b 20 20 20 20  iSize = 224;    
2e3e0 20 20 20 20 20 2f 2a 20 48 61 73 68 20 61 6c 67       /* Hash alg
2e3f0 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
2e400 0a 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20  .    int bDebug 
2e410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2e420 20 4f 6e 6c 79 20 73 68 6f 77 20 74 68 65 20 71   Only show the q
2e430 75 65 72 79 20 74 68 61 74 20 77 6f 75 6c 64 20  uery that would 
2e440 68 61 76 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20  have run */.    
2e450 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2e460 74 6d 74 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20  tmt;     /* For 
2e470 71 75 65 72 79 69 6e 67 20 74 61 62 6c 65 73 20  querying tables 
2e480 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61  names */.    cha
2e490 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
2e4a0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
2e4b0 62 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68  be run */.    ch
2e4c0 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20  ar *zSep;       
2e4d0 20 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61         /* Separa
2e4e0 74 6f 72 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c  tor */.    Shell
2e4f0 54 65 78 74 20 73 53 71 6c 3b 20 20 20 20 20 20  Text sSql;      
2e500 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2e510 53 51 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72  SQL for the quer
2e520 79 20 74 6f 20 72 75 6e 20 74 68 65 20 68 61 73  y to run the has
2e530 68 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  h */.    ShellTe
2e540 78 74 20 73 51 75 65 72 79 3b 20 20 20 20 20 20  xt sQuery;      
2e550 20 20 2f 2a 20 53 65 74 20 6f 66 20 71 75 65 72    /* Set of quer
2e560 69 65 73 20 75 73 65 64 20 74 6f 20 72 65 61 64  ies used to read
2e570 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   all content */.
2e580 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2e590 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
2e5a0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2e5b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e5c0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
2e5d0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2e5e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b  ' ){.        z++
2e5f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
2e600 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  0]=='-' ) z++;. 
2e610 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
2e620 70 28 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30  p(z,"schema")==0
2e630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53   ){.          bS
2e640 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
2e650 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2e660 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73   if( strcmp(z,"s
2e670 68 61 33 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20  ha3-224")==0 || 
2e680 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32  strcmp(z,"sha3-2
2e690 35 36 22 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  56")==0 .       
2e6a0 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73    || strcmp(z,"s
2e6b0 68 61 33 2d 33 38 34 22 29 3d 3d 30 20 7c 7c 20  ha3-384")==0 || 
2e6c0 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 35  strcmp(z,"sha3-5
2e6d0 31 32 22 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  12")==0 .       
2e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 53   ){.          iS
2e6f0 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 5b 35 5d  ize = atoi(&z[5]
2e700 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e710 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2e720 63 6d 70 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d  cmp(z,"debug")==
2e730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
2e740 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20  Debug = 1;.     
2e750 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2e760 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
2e770 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e780 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
2e790 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c   \"%s\" on \"%s\
2e7a0 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
2e7c0 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  g[i], azArg[0]);
2e7d0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
2e7e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
2e7f0 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
2e800 20 2d 2d 73 63 68 65 6d 61 22 0a 20 20 20 20 20   --schema".     
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 20 20 20 20 20 20 20 20 22 20 2d 2d 73 68 61 33          " --sha3
2e830 2d 32 32 34 20 2d 2d 73 68 61 33 2d 32 35 35 20  -224 --sha3-255 
2e840 2d 2d 73 68 61 33 2d 33 38 34 20 2d 2d 73 68 61  --sha3-384 --sha
2e850 33 2d 35 31 32 5c 6e 22 29 3b 0a 20 20 20 20 20  3-512\n");.     
2e860 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e870 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2e880 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2e890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e8a0 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29  else if( zLike )
2e8b0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2e8c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e8d0 61 67 65 3a 20 2e 73 68 61 33 73 75 6d 20 3f 4f  age: .sha3sum ?O
2e8e0 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b 45 2d 50 41  PTIONS? ?LIKE-PA
2e8f0 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20  TTERN?\n");.    
2e900 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2e910 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2e920 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2e930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e940 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a 20 20 20 20   zLike = z;.    
2e950 20 20 20 20 62 53 65 70 61 72 61 74 65 20 3d 20      bSeparate = 
2e960 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  1;.        if( s
2e970 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
2e980 73 71 6c 69 74 65 5f 25 22 2c 20 7a 4c 69 6b 65  sqlite_%", zLike
2e990 2c 20 30 29 3d 3d 30 20 29 20 62 53 63 68 65 6d  , 0)==0 ) bSchem
2e9a0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 1;.      }. 
2e9b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 53 63     }.    if( bSc
2e9c0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 7a 53  hema ){.      zS
2e9d0 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77  ql = "SELECT low
2e9e0 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71  er(name) FROM sq
2e9f0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
2ea00 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2ea10 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41  E type='table' A
2ea20 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74  ND coalesce(root
2ea30 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20  page,0)>1".     
2ea40 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20          " UNION 
2ea50 41 4c 4c 20 53 45 4c 45 43 54 20 27 73 71 6c 69  ALL SELECT 'sqli
2ea60 74 65 5f 6d 61 73 74 65 72 27 22 0a 20 20 20 20  te_master'".    
2ea70 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
2ea80 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f   BY 1 collate no
2ea90 63 61 73 65 22 3b 0a 20 20 20 20 7d 65 6c 73 65  case";.    }else
2eaa0 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22  {.      zSql = "
2eab0 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d  SELECT lower(nam
2eac0 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  e) FROM sqlite_m
2ead0 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
2eae0 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65      " WHERE type
2eaf0 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61  ='table' AND coa
2eb00 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
2eb10 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  )>1".           
2eb20 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54    " AND name NOT
2eb30 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
2eb40 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
2eb50 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c   ORDER BY 1 coll
2eb60 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20  ate nocase";.   
2eb70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70   }.    sqlite3_p
2eb80 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2eb90 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2eba0 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 69 74 54  t, 0);.    initT
2ebb0 65 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20  ext(&sQuery);.  
2ebc0 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 71 6c    initText(&sSql
2ebd0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
2ebe0 74 28 26 73 53 71 6c 2c 20 22 57 49 54 48 20 5b  t(&sSql, "WITH [
2ebf0 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d 28 61  sha3sum$query](a
2ec00 2c 62 29 20 41 53 28 22 2c 30 29 3b 0a 20 20 20  ,b) AS(",0);.   
2ec10 20 7a 53 65 70 20 3d 20 22 56 41 4c 55 45 53 28   zSep = "VALUES(
2ec20 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  ";.    while( SQ
2ec30 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2ec40 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
2ec50 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2ec60 72 20 2a 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74  r *zTab = (const
2ec70 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2ec80 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2ec90 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ,0);.      if( z
2eca0 4c 69 6b 65 20 26 26 20 73 71 6c 69 74 65 33 5f  Like && sqlite3_
2ecb0 73 74 72 6c 69 6b 65 28 7a 4c 69 6b 65 2c 20 7a  strlike(zLike, z
2ecc0 54 61 62 2c 20 30 29 21 3d 30 20 29 20 63 6f 6e  Tab, 0)!=0 ) con
2ecd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2ece0 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 2c 20 22   strncmp(zTab, "
2ecf0 73 71 6c 69 74 65 5f 22 2c 37 29 21 3d 30 20 29  sqlite_",7)!=0 )
2ed00 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
2ed10 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45  Text(&sQuery,"SE
2ed20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30  LECT * FROM ", 0
2ed30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2ed40 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 7a 54  dText(&sQuery,zT
2ed50 61 62 2c 27 22 27 29 3b 0a 20 20 20 20 20 20 20  ab,'"');.       
2ed60 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
2ed70 65 72 79 2c 22 20 4e 4f 54 20 49 4e 44 45 58 45  ery," NOT INDEXE
2ed80 44 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  D;", 0);.      }
2ed90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2eda0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 6d 61  zTab, "sqlite_ma
2edb0 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ster")==0 ){.   
2edc0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2edd0 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20  &sQuery,"SELECT 
2ede0 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
2edf0 6d 65 2c 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  me,sql FROM sqli
2ee00 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
2ee30 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20   name;", 0);.   
2ee40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
2ee50 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
2ee60 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
2ee70 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
2ee80 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53  dText(&sQuery,"S
2ee90 45 4c 45 43 54 20 6e 61 6d 65 2c 73 65 71 20 46  ELECT name,seq F
2eea0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65  ROM sqlite_seque
2eeb0 6e 63 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  nce".           
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eed0 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
2eee0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
2eef0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
2ef00 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  ab, "sqlite_stat
2ef10 31 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  1")==0 ){.      
2ef20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
2ef30 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74 62 6c  uery,"SELECT tbl
2ef40 2c 69 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 73  ,idx,stat FROM s
2ef50 71 6c 69 74 65 5f 73 74 61 74 31 22 0a 20 20 20  qlite_stat1".   
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
2ef80 42 59 20 74 62 6c 2c 69 64 78 3b 22 2c 20 30 29  BY tbl,idx;", 0)
2ef90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2efa0 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22  ( strcmp(zTab, "
2efb0 73 71 6c 69 74 65 5f 73 74 61 74 33 22 29 3d 3d  sqlite_stat3")==
2efc0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
2efd0 7c 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22  | strcmp(zTab, "
2efe0 73 71 6c 69 74 65 5f 73 74 61 74 34 22 29 3d 3d  sqlite_stat4")==
2eff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
2f000 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
2f010 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2f020 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
2f030 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
2f040 79 2c 20 7a 54 61 62 2c 20 30 29 3b 0a 20 20 20  y, zTab, 0);.   
2f050 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f060 26 73 51 75 65 72 79 2c 20 22 20 4f 52 44 45 52  &sQuery, " ORDER
2f070 20 42 59 20 74 62 6c 2c 20 69 64 78 2c 20 72 6f   BY tbl, idx, ro
2f080 77 69 64 3b 5c 6e 22 2c 20 30 29 3b 0a 20 20 20  wid;\n", 0);.   
2f090 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
2f0a0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 7a 53 65  dText(&sSql, zSe
2f0b0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  p, 0);.      app
2f0c0 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20 73  endText(&sSql, s
2f0d0 51 75 65 72 79 2e 7a 2c 20 27 5c 27 27 29 3b 0a  Query.z, '\'');.
2f0e0 20 20 20 20 20 20 73 51 75 65 72 79 2e 6e 20 3d        sQuery.n =
2f0f0 20 30 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   0;.      append
2f100 54 65 78 74 28 26 73 53 71 6c 2c 20 22 2c 22 2c  Text(&sSql, ",",
2f110 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e   0);.      appen
2f120 64 54 65 78 74 28 26 73 53 71 6c 2c 20 7a 54 61  dText(&sSql, zTa
2f130 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20  b, '\'');.      
2f140 7a 53 65 70 20 3d 20 22 29 2c 28 22 3b 0a 20 20  zSep = "),(";.  
2f150 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2f160 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2f170 0a 20 20 20 20 69 66 28 20 62 53 65 70 61 72 61  .    if( bSepara
2f180 74 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  te ){.      zSql
2f190 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2f1a0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 25  tf(.          "%
2f1b0 73 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 22  s))".          "
2f1c0 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65   SELECT lower(he
2f1d0 78 28 73 68 61 33 5f 71 75 65 72 79 28 61 2c 25  x(sha3_query(a,%
2f1e0 64 29 29 29 20 41 53 20 68 61 73 68 2c 20 62 20  d))) AS hash, b 
2f1f0 41 53 20 6c 61 62 65 6c 22 0a 20 20 20 20 20 20  AS label".      
2f200 20 20 20 20 22 20 20 20 46 52 4f 4d 20 5b 73 68      "   FROM [sh
2f210 61 33 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20  a3sum$query]",. 
2f220 20 20 20 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c           sSql.z,
2f230 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c   iSize);.    }el
2f240 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  se{.      zSql =
2f250 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2f260 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 29  (.          "%s)
2f270 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 53  )".          " S
2f280 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28  ELECT lower(hex(
2f290 73 68 61 33 5f 71 75 65 72 79 28 67 72 6f 75 70  sha3_query(group
2f2a0 5f 63 6f 6e 63 61 74 28 61 2c 27 27 29 2c 25 64  _concat(a,''),%d
2f2b0 29 29 29 20 41 53 20 68 61 73 68 22 0a 20 20 20  ))) AS hash".   
2f2c0 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d 20         "   FROM 
2f2d0 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d 22  [sha3sum$query]"
2f2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71 6c  ,.          sSql
2f2f0 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20  .z, iSize);.    
2f300 7d 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  }.    freeText(&
2f310 73 51 75 65 72 79 29 3b 0a 20 20 20 20 66 72 65  sQuery);.    fre
2f320 65 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20  eText(&sSql);.  
2f330 20 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a    if( bDebug ){.
2f340 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f350 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
2f360 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zSql);.    }el
2f370 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  se{.      shell_
2f380 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  exec(p->db, zSql
2f390 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  , shell_callback
2f3a0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , p, 0);.    }. 
2f3b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f3c0 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zSql);.  }else..
2f3d0 20 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20 20    if( c=='s'.   
2f3e0 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72  && (strncmp(azAr
2f3f0 67 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e  g[0], "shell", n
2f400 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28  )==0 || strncmp(
2f410 61 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d  azArg[0],"system
2f420 22 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  ",n)==0).  ){.  
2f430 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
2f440 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20    int i, x;.    
2f450 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
2f460 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f470 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2f480 73 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e  system COMMAND\n
2f490 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2f4a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2f4b0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2f4c0 20 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20 3d      }.    zCmd =
2f4d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2f4e0 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31 5d  (strchr(azArg[1]
2f4f0 2c 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22 5c  ,' ')==0?"%s":"\
2f500 22 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31 5d  "%s\"", azArg[1]
2f510 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  );.    for(i=2; 
2f520 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2f530 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
2f540 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68  e3_mprintf(strch
2f550 72 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29 3d  r(azArg[i],' ')=
2f560 3d 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20 5c  =0?"%z %s":"%z \
2f570 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%s\"",.        
2f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f590 20 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72 67       zCmd, azArg
2f5a0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
2f5b0 78 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29  x = system(zCmd)
2f5c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2f5d0 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66  ee(zCmd);.    if
2f5e0 28 20 78 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ( x ) raw_printf
2f5f0 28 73 74 64 65 72 72 2c 20 22 53 79 73 74 65 6d  (stderr, "System
2f600 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
2f610 20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65   %d\n", x);.  }e
2f620 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
2f630 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2f640 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e  rg[0], "show", n
2f650 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
2f660 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2f670 7a 42 6f 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66  zBool[] = { "off
2f680 22 2c 20 22 6f 6e 22 2c 20 22 66 75 6c 6c 22 2c  ", "on", "full",
2f690 20 22 75 6e 6b 22 20 7d 3b 0a 20 20 20 20 69 6e   "unk" };.    in
2f6a0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
2f6b0 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
2f6c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2f6d0 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e   "Usage: .show\n
2f6e0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2f6f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2f700 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2f710 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70      }.    utf8_p
2f720 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2f730 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65  12.12s: %s\n","e
2f740 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  cho",.          
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53          azBool[S
2f770 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
2f780 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20  HFLG_Echo)]);.  
2f790 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2f7a0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
2f7b0 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42  %s\n","eqp", azB
2f7c0 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33  ool[p->autoEQP&3
2f7d0 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
2f7e0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
2f7f0 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70  .12s: %s\n","exp
2f800 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lain",.         
2f810 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
2f820 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70  plain ? "on" : p
2f830 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20  ->autoExplain ? 
2f840 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b  "auto" : "off");
2f850 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2f860 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
2f870 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73  : %s\n","headers
2f880 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f  ", azBool[p->sho
2f890 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20  wHeader!=0]);.  
2f8a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2f8b0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
2f8c0 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
2f8d0 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
2f8e0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
2f8f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
2f900 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c  12s: ", "nullval
2f910 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  ue");.      outp
2f920 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
2f930 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ut, p->nullValue
2f940 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2f950 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
2f960 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
2f970 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
2f980 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75  2s: %s\n","outpu
2f990 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
2f9a0 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66  strlen30(p->outf
2f9b0 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
2f9c0 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
2f9d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2f9e0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
2f9f0 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72  ", "colseparator
2fa00 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
2fa10 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
2fa20 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
2fa30 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
2fa40 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
2fa50 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
2fa60 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
2fa70 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61  12s: ", "rowsepa
2fa80 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f  rator");.      o
2fa90 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
2faa0 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70  ->out, p->rowSep
2fab0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  arator);.      r
2fac0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2fad0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66  , "\n");.    utf
2fae0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2faf0 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
2fb00 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c  ,"stats", azBool
2fb10 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29  [p->statsOn!=0])
2fb20 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
2fb30 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
2fb40 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b  2s: ", "width");
2fb50 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c  .    for (i=0;i<
2fb60 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
2fb70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70  ->colWidth) && p
2fb80 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d  ->colWidth[i] !=
2fb90 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20   0;i++) {.      
2fba0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2fbb0 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c  t, "%d ", p->col
2fbc0 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
2fbd0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2fbe0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
2fbf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2fc00 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
2fc10 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d   %s\n", "filenam
2fc20 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
2fc30 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
2fc40 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  me ? p->zDbFilen
2fc50 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c  ame : "");.  }el
2fc60 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
2fc70 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2fc80 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
2fc90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2fca0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2fcb0 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f   p->statsOn = bo
2fcc0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2fcd0 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [1]);.    }else 
2fce0 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
2fcf0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
2fd00 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29 3b  ts(p->db, p, 0);
2fd10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fd20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2fd30 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 74  err, "Usage: .st
2fd40 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29  ats ?on|off?\n")
2fd50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2fd60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2fd70 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26 20   if( (c=='t' && 
2fd80 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
2fd90 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73  zArg[0], "tables
2fda0 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
2fdb0 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e  (c=='i' && (strn
2fdc0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
2fdd0 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20  ndices", n)==0. 
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdf0 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
2fe00 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20  [0], "indexes", 
2fe10 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20 20  n)==0) ).  ){.  
2fe20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2fe30 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
2fe40 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20  **azResult;.    
2fe50 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63  int nRow, nAlloc
2fe60 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
2fe70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
2fe80 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2fe90 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2fea0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2feb0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
2fec0 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20  database_list", 
2fed0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2fee0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2fef0 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73  urn shellDatabas
2ff00 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a  eError(p->db);..
2ff10 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 6e      /* Create an
2ff20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
2ff30 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
2ff40 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
2ff50 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 69  n the.    ** mai
2ff60 6e 20 61 6e 64 20 61 6c 6c 20 61 74 74 61 63 68  n and all attach
2ff70 65 64 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ed databases whe
2ff80 72 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  re the table nam
2ff90 65 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20 20  e matches the.  
2ffa0 20 20 2a 2a 20 4c 49 4b 45 20 70 61 74 74 65 72    ** LIKE patter
2ffb0 6e 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  n bound to varia
2ffc0 62 6c 65 20 22 3f 31 22 2e 20 2a 2f 0a 20 20 20  ble "?1". */.   
2ffd0 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
2ffe0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2fff0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
30000 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
30010 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
30020 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
30030 20 20 22 20 57 48 45 52 45 20 74 79 70 65 20 49    " WHERE type I
30040 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
30050 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ')".          " 
30060 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c    AND name NOT L
30070 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 25 27 22  IKE 'sqlite_%%'"
30080 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41  .          "   A
30090 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  ND name LIKE ?1"
300a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
300b0 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20   nArg>2 ){.     
300c0 20 2f 2a 20 49 74 20 69 73 20 61 6e 20 68 69 73   /* It is an his
300d0 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74  torical accident
300e0 20 74 68 61 74 20 74 68 65 20 2e 69 6e 64 65 78   that the .index
300f0 65 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77 73  es command shows
30100 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20   an error.      
30110 2a 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64 20 77  ** when called w
30120 69 74 68 20 74 68 65 20 77 72 6f 6e 67 20 6e 75  ith the wrong nu
30130 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
30140 73 20 77 68 65 72 65 61 73 20 74 68 65 20 2e 74  s whereas the .t
30150 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 63  ables.      ** c
30160 6f 6d 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74 2e  ommand does not.
30170 20 2a 2f 0a 20 20 20 20 20 20 72 61 77 5f 70 72   */.      raw_pr
30180 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
30190 61 67 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f 4c  age: .indexes ?L
301a0 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
301b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
301c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
301d0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
301e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
301f0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
30200 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
30210 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
30220 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
30230 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48  ".          " WH
30240 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
30250 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
30260 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
30270 45 20 3f 31 22 29 3b 0a 20 20 20 20 7d 0a 20 20  E ?1");.    }.  
30280 20 20 66 6f 72 28 69 69 3d 30 3b 20 7a 53 71 6c    for(ii=0; zSql
30290 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
302a0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
302b0 52 4f 57 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ROW; ii++){.    
302c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
302d0 62 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  bName = (const c
302e0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
302f0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
30300 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  1);.      if( zD
30310 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 69 69 3d 3d  bName==0 || ii==
30320 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30330 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 29      if( c=='t' )
30340 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
30350 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
30360 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
30370 20 20 20 22 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c     "%z UNION ALL
30380 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
30390 20 20 20 20 22 53 45 4c 45 43 54 20 27 25 71 2e      "SELECT '%q.
303a0 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 5c  ' || name FROM \
303b0 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73  "%w\".sqlite_mas
303c0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
303d0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
303e0 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
303f0 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20  view')".        
30400 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
30410 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
30420 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20 20 20  sqlite_%%'".    
30430 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
30440 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f   AND name LIKE ?
30450 31 22 2c 20 7a 53 71 6c 2c 20 7a 44 62 4e 61 6d  1", zSql, zDbNam
30460 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20  e, zDbName);.   
30470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30480 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
30490 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
304a0 20 20 20 20 20 20 20 20 20 20 20 22 25 7a 20 55             "%z U
304b0 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
304c0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
304d0 45 43 54 20 27 25 71 2e 27 20 7c 7c 20 6e 61 6d  ECT '%q.' || nam
304e0 65 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 73 71  e FROM \"%w\".sq
304f0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
30500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
30510 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
30520 78 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  x'".            
30530 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 62 6c       "   AND tbl
30540 5f 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20  _name LIKE ?1", 
30550 7a 53 71 6c 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a  zSql, zDbName, z
30560 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  DbName);.      }
30570 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
30580 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
30590 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
305a0 20 7a 53 71 6c 20 26 26 20 72 63 3d 3d 53 51 4c   zSql && rc==SQL
305b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
305c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
305d0 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52  printf("%z ORDER
305e0 20 42 59 20 31 22 2c 20 7a 53 71 6c 29 3b 0a 20   BY 1", zSql);. 
305f0 20 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 20       if( zSql ) 
30600 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
30610 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
30620 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
30630 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
30640 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
30650 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c  );.    if( !zSql
30660 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 4e   ) return shellN
30670 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20  omemError();.   
30680 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30690 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
306a0 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20  ror(p->db);..   
306b0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20   /* Run the SQL 
306c0 73 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72  statement prepar
306d0 65 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 20  ed by the above 
306e0 62 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74 68 65  block. Store the
306f0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20   results.    ** 
30700 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  as an array of n
30710 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
30720 72 69 6e 67 73 20 69 6e 20 61 7a 52 65 73 75 6c  rings in azResul
30730 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e 52 6f  t[].  */.    nRo
30740 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a  w = nAlloc = 0;.
30750 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30      azResult = 0
30760 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  ;.    if( nArg>1
30770 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30780 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
30790 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  t, 1, azArg[1], 
307a0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
307b0 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
307c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
307d0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
307e0 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c   1, "%", -1, SQL
307f0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
30800 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71   }.    while( sq
30810 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
30820 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
30830 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e  .      if( nRow>
30840 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
30850 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b     char **azNew;
30860 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20  .        int n2 
30870 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b  = nAlloc*2 + 10;
30880 0a 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d  .        azNew =
30890 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
308a0 36 34 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a  64(azResult, siz
308b0 65 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29  eof(azResult[0])
308c0 2a 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  *n2);.        if
308d0 28 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  ( azNew==0 ){.  
308e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
308f0 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a  llNomemError();.
30900 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30920 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a     nAlloc = n2;.
30930 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74          azResult
30940 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   = azNew;.      
30950 7d 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74  }.      azResult
30960 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33  [nRow] = sqlite3
30970 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
30980 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
30990 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
309a0 20 20 20 20 20 69 66 28 20 30 3d 3d 61 7a 52 65       if( 0==azRe
309b0 73 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20  sult[nRow] ){.  
309c0 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
309d0 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20  NomemError();.  
309e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
309f0 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b     }.      nRow+
30a00 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
30a10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
30a20 65 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  e(pStmt)!=SQLITE
30a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
30a40 3d 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  = shellDatabaseE
30a50 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rror(p->db);.   
30a60 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 74   }..    /* Prett
30a70 79 2d 70 72 69 6e 74 20 74 68 65 20 63 6f 6e 74  y-print the cont
30a80 65 6e 74 73 20 6f 66 20 61 72 72 61 79 20 61 7a  ents of array az
30a90 52 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68 65 20  Result[] to the 
30aa0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 66  output */.    if
30ab0 28 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f 77 3e  ( rc==0 && nRow>
30ac0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  0 ){.      int l
30ad0 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a  en, maxlen = 0;.
30ae0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
30af0 20 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74        int nPrint
30b00 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a  Col, nPrintRow;.
30b10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30b20 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRow; i++){.   
30b30 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
30b40 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29  n30(azResult[i])
30b50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
30b60 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65  n>maxlen ) maxle
30b70 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  n = len;.      }
30b80 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c  .      nPrintCol
30b90 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29   = 80/(maxlen+2)
30ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69  ;.      if( nPri
30bb0 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74  ntCol<1 ) nPrint
30bc0 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  Col = 1;.      n
30bd0 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77  PrintRow = (nRow
30be0 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31   + nPrintCol - 1
30bf0 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20  )/nPrintCol;.   
30c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
30c10 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20  rintRow; i++){. 
30c20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20         for(j=i; 
30c30 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e  j<nRow; j+=nPrin
30c40 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20  tRow){.         
30c50 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e   char *zSp = j<n
30c60 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20  PrintRow ? "" : 
30c70 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20  "  ";.          
30c80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30c90 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53  ut, "%s%-*s", zS
30ca0 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20 20 20  p, maxlen,.     
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cc0 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61   azResult[j] ? a
30cd0 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a  zResult[j]:"");.
30ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30cf0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
30d00 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
30d10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
30d20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77  or(ii=0; ii<nRow
30d30 3b 20 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f  ; ii++) sqlite3_
30d40 66 72 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69  free(azResult[ii
30d50 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
30d60 66 72 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a  free(azResult);.
30d70 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 42 65    }else..  /* Be
30d80 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
30d90 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 66 69  output to the fi
30da0 6c 65 20 22 74 65 73 74 63 61 73 65 2d 6f 75 74  le "testcase-out
30db0 2e 74 78 74 22 20 2a 2f 0a 20 20 69 66 28 20 63  .txt" */.  if( c
30dc0 3d 3d 27 74 27 20 26 26 20 73 74 72 63 6d 70 28  =='t' && strcmp(
30dd0 61 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74 63 61  azArg[0],"testca
30de0 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  se")==0 ){.    o
30df0 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
30e00 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74      p->out = out
30e10 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 22 74  put_file_open("t
30e20 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
30e30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  );.    if( p->ou
30e40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  t==0 ){.      ra
30e50 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30e60 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
30e70 6f 70 65 6e 20 27 74 65 73 74 63 61 73 65 2d 6f  open 'testcase-o
30e80 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20  ut.txt'\n");.   
30e90 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
30ea0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
30eb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30ec0 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65  eof(p->zTestcase
30ed0 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c  ), p->zTestcase,
30ee0 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29   "%s", azArg[1])
30ef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30f00 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30f10 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54  ntf(sizeof(p->zT
30f20 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65  estcase), p->zTe
30f30 73 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a 20 20  stcase, "?");.  
30f40 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
30f50 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
30f60 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
30f70 27 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73  't' && n>=8 && s
30f80 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
30f90 20 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d   "testctrl", n)=
30fa0 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b  =0 && nArg>=2 ){
30fb0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
30fc0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
30fd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
30fe0 74 72 6c 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  trlName;   /* Na
30ff0 6d 65 20 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e  me of a test-con
31000 74 72 6f 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  trol option */. 
31010 20 20 20 20 20 20 69 6e 74 20 63 74 72 6c 43 6f        int ctrlCo
31020 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  de;            /
31030 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66  * Integer code f
31040 6f 72 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a  or that option *
31050 2f 0a 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20  /.    } aCtrl[] 
31060 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 70 72 6e  = {.      { "prn
31070 67 5f 73 61 76 65 22 2c 20 20 20 20 20 20 20 20  g_save",        
31080 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
31090 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 20 20  CTRL_PRNG_SAVE  
310a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
310b0 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73       { "prng_res
310c0 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  tore",          
310d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
310e0 50 52 4e 47 5f 52 45 53 54 4f 52 45 20 20 20 20  PRNG_RESTORE    
310f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
31100 7b 20 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20  { "prng_reset", 
31110 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31120 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
31130 52 45 53 45 54 20 20 20 20 20 20 20 20 20 20 20  RESET           
31140 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 69    },.      { "bi
31150 74 76 65 63 5f 74 65 73 74 22 2c 20 20 20 20 20  tvec_test",     
31160 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
31170 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
31180 54 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  T            },.
31190 20 20 20 20 20 20 7b 20 22 66 61 75 6c 74 5f 69        { "fault_i
311a0 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  nstall",        
311b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
311c0 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 20 20  _FAULT_INSTALL  
311d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
311e0 20 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f   { "benign_mallo
311f0 63 5f 68 6f 6f 6b 73 22 2c 20 20 20 53 51 4c 49  c_hooks",   SQLI
31200 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
31210 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 20  GN_MALLOC_HOOKS 
31220 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
31230 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20  ending_byte",   
31240 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
31250 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
31260 59 54 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c  YTE           },
31270 0a 20 20 20 20 20 20 7b 20 22 61 73 73 65 72 74  .      { "assert
31280 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31290 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
312a0 4c 5f 41 53 53 45 52 54 20 20 20 20 20 20 20 20  L_ASSERT        
312b0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
312c0 20 20 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20    { "always",   
312d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
312e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
312f0 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
31300 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
31310 72 65 73 65 72 76 65 22 2c 20 20 20 20 20 20 20  reserve",       
31320 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
31330 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 20  ESTCTRL_RESERVE 
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
31350 2c 0a 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d  ,.      { "optim
31360 69 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20  izations",      
31370 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
31380 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
31390 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
313a0 20 20 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22     { "iskeyword"
313b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
313c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
313d0 4b 45 59 57 4f 52 44 20 20 20 20 20 20 20 20 20  KEYWORD         
313e0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
313f0 22 73 63 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c  "scratchmalloc",
31400 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31410 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
31420 4d 41 4c 4c 4f 43 20 20 20 20 20 20 20 20 20 20  MALLOC          
31430 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 79 74 65  },.      { "byte
31440 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20 20 20  order",         
31450 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
31460 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 20 20 20  TRL_BYTEORDER   
31470 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31480 20 20 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72      { "never_cor
31490 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 53  rupt",         S
314a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
314b0 45 56 45 52 5f 43 4f 52 52 55 50 54 20 20 20 20  EVER_CORRUPT    
314c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
314d0 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 20 20 20   "imposter",    
314e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
314f0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
31500 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
31510 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
31520 6e 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31  nt testctrl = -1
31530 3b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  ;.    int rc2 = 
31540 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32  0;.    int i, n2
31550 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
31560 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e   0);..    /* con
31570 76 65 72 74 20 74 65 73 74 63 74 72 6c 20 74 65  vert testctrl te
31580 78 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c  xt option to val
31590 75 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e  ue. allow any un
315a0 69 71 75 65 20 70 72 65 66 69 78 0a 20 20 20 20  ique prefix.    
315b0 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** of the option
315c0 20 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65   name, or a nume
315d0 72 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a  rical value. */.
315e0 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
315f0 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
31600 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
31610 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b  ySize(aCtrl); i+
31620 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
31630 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  rncmp(azArg[1], 
31640 61 43 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61  aCtrl[i].zCtrlNa
31650 6d 65 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  me, n2)==0 ){.  
31660 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 74        if( testct
31670 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rl<0 ){.        
31680 20 20 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74    testctrl = aCt
31690 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a  rl[i].ctrlCode;.
316a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
316b0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
316c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d  intf(stderr, "am
316d0 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 20 6e  biguous option n
316e0 61 6d 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  ame: \"%s\"\n", 
316f0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
31700 20 20 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20       testctrl = 
31710 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
31720 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
31730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31740 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20   if( testctrl<0 
31750 29 20 74 65 73 74 63 74 72 6c 20 3d 20 28 69 6e  ) testctrl = (in
31760 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
31770 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66  zArg[1]);.    if
31780 28 20 28 74 65 73 74 63 74 72 6c 3c 53 51 4c 49  ( (testctrl<SQLI
31790 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 49 52 53  TE_TESTCTRL_FIRS
317a0 54 29 20 7c 7c 20 28 74 65 73 74 63 74 72 6c 3e  T) || (testctrl>
317b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
317c0 4c 41 53 54 29 20 29 7b 0a 20 20 20 20 20 20 75  LAST) ){.      u
317d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
317e0 72 2c 22 45 72 72 6f 72 3a 20 69 6e 76 61 6c 69  r,"Error: invali
317f0 64 20 74 65 73 74 63 74 72 6c 20 6f 70 74 69 6f  d testctrl optio
31800 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  n: %s\n", azArg[
31810 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
31820 20 20 20 20 20 20 73 77 69 74 63 68 28 74 65 73        switch(tes
31830 74 63 74 72 6c 29 7b 0a 0a 20 20 20 20 20 20 20  tctrl){..       
31840 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
31850 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 64 62  _control(int, db
31860 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
31870 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
31880 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
31890 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20 63 61  IONS:.        ca
318a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
318b0 52 4c 5f 52 45 53 45 52 56 45 3a 0a 20 20 20 20  RL_RESERVE:.    
318c0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
318d0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
318e0 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74 29   int opt = (int)
318f0 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d 2c  strtol(azArg[2],
31900 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
31910 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
31920 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
31930 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20  estctrl, p->db, 
31940 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
31950 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
31960 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78  out, "%d (0x%08x
31970 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63 32 29 3b  )\n", rc2, rc2);
31980 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
31990 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
319a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
319b0 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63  rr,"Error: testc
319c0 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73  trl %s takes a s
319d0 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f 6e  ingle int option
319e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
319f0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
31a00 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
31a10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
31a20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
31a30 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
31a40 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  l(int) */.      
31a50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
31a60 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
31a70 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
31a80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
31a90 52 4e 47 5f 52 45 53 54 4f 52 45 3a 0a 20 20 20  RNG_RESTORE:.   
31aa0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
31ab0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
31ac0 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20 63 61  ESET:.        ca
31ad0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
31ae0 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 0a 20 20  RL_BYTEORDER:.  
31af0 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
31b00 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
31b10 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
31b20 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
31b30 73 74 63 74 72 6c 29 3b 0a 20 20 20 20 20 20 20  stctrl);.       
31b40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31b50 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25  p->out, "%d (0x%
31b60 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72 63  08x)\n", rc2, rc
31b70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  2);.          } 
31b80 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
31b90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
31ba0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65  tderr,"Error: te
31bb0 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20  stctrl %s takes 
31bc0 6e 6f 20 6f 70 74 69 6f 6e 73 5c 6e 22 2c 0a 20  no options\n",. 
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
31bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31c00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
31c10 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
31c20 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
31c30 69 6e 74 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20  int, uint) */.  
31c40 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
31c50 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
31c60 4e 47 5f 42 59 54 45 3a 0a 20 20 20 20 20 20 20  NG_BYTE:.       
31c70 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29     if( nArg==3 )
31c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e  {.            un
31c90 73 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d  signed int opt =
31ca0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69   (unsigned int)i
31cb0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
31cc0 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[2]);.         
31cd0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
31ce0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
31cf0 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
31d00 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
31d10 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
31d20 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63   (0x%08x)\n", rc
31d30 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20  2, rc2);.       
31d40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
31d50 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31d60 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
31d70 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74  r: testctrl %s t
31d80 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  akes a single un
31d90 73 69 67 6e 65 64 22 0a 20 20 20 20 20 20 20 20  signed".        
31da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31db0 20 20 20 22 20 69 6e 74 20 6f 70 74 69 6f 6e 5c     " int option\
31dc0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
31dd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31de0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
31df0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
31e00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
31e10 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
31e20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
31e30 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 0a 20  STCTRL_ASSERT:. 
31e40 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
31e50 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
31e60 59 53 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  YS:.        case
31e70 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
31e80 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 0a  _NEVER_CORRUPT:.
31e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
31ea0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
31eb0 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 62       int opt = b
31ec0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
31ed0 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[2]);.         
31ee0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
31ef0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
31f00 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
31f10 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
31f20 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
31f30 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63   (0x%08x)\n", rc
31f40 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20  2, rc2);.       
31f50 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
31f60 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31f70 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
31f80 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74  r: testctrl %s t
31f90 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  akes a single in
31fa0 74 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20  t option\n",.   
31fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fc0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
31fd0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
31fe0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
31ff0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
32000 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
32010 6c 28 69 6e 74 2c 20 63 68 61 72 20 2a 29 20 2a  l(int, char *) *
32020 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
32030 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20  N_KEYWORD.      
32040 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
32050 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
32060 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
32070 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20  nArg==3 ){.     
32080 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
32090 72 20 2a 6f 70 74 20 3d 20 61 7a 41 72 67 5b 32  r *opt = azArg[2
320a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
320b0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
320c0 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
320d0 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
320e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
320f0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78  (p->out, "%d (0x
32100 25 30 38 78 29 5c 6e 22 2c 20 72 63 32 2c 20 72  %08x)\n", rc2, r
32110 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  c2);.          }
32120 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
32130 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32140 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32160 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c  "Error: testctrl
32170 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67   %s takes a sing
32180 6c 65 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e  le char * option
32190 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
321b0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
321c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
321d0 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  eak;.#endif..   
321e0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
321f0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
32200 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ER:.          if
32210 28 20 6e 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20  ( nArg==5 ){.   
32220 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
32230 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
32240 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d  rol(testctrl, p-
32250 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32270 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20  zArg[2],.       
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32290 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28     integerValue(
322a0 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322c0 20 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75       integerValu
322d0 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20  e(azArg[4]));.  
322e0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
322f0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
32300 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63   (0x%08x)\n", rc
32310 32 2c 20 72 63 32 29 3b 0a 20 20 20 20 20 20 20  2, rc2);.       
32320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32330 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32340 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20  (stderr,"Usage: 
32350 2e 74 65 73 74 63 74 72 6c 20 69 6d 70 6f 73 74  .testctrl impost
32360 65 72 20 64 62 4e 61 6d 65 20 6f 6e 6f 66 66 20  er dbName onoff 
32370 74 6e 75 6d 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tnum\n");.      
32380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32390 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
323a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
323b0 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
323c0 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
323d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
323e0 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 0a 20 20  AULT_INSTALL:.  
323f0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
32400 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
32410 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 0a  N_MALLOC_HOOKS:.
32420 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
32430 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
32440 41 54 43 48 4d 41 4c 4c 4f 43 3a 0a 20 20 20 20  ATCHMALLOC:.    
32450 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
32460 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32470 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
32480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32490 20 22 45 72 72 6f 72 3a 20 43 4c 49 20 73 75 70   "Error: CLI sup
324a0 70 6f 72 74 20 66 6f 72 20 74 65 73 74 63 74 72  port for testctr
324b0 6c 20 25 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65  l %s not impleme
324c0 6e 74 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  nted\n",.       
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
324e0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
324f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
32510 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
32520 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53  ned(SQLITE_UNTES
32530 54 41 42 4c 45 29 20 2a 2f 0a 0a 20 20 69 66 28  TABLE) */..  if(
32540 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26   c=='t' && n>4 &
32550 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
32560 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e  0], "timeout", n
32570 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
32580 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 73  _db(p, 0);.    s
32590 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
325a0 6f 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72 67 3e  out(p->db, nArg>
325b0 3d 32 20 3f 20 28 69 6e 74 29 69 6e 74 65 67 65  =2 ? (int)intege
325c0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
325d0 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a   : 0);.  }else..
325e0 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
325f0 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=5 && strncmp(
32600 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 72  azArg[0], "timer
32610 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32620 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
32630 20 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65 72       enableTimer
32640 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
32650 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
32660 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
32670 20 26 26 20 21 48 41 53 5f 54 49 4d 45 52 20 29   && !HAS_TIMER )
32680 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
32690 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
326a0 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f 74 20 61  ror: timer not a
326b0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73  vailable on this
326c0 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b 0a 20 20   system.\n");.  
326d0 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65        enableTime
326e0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
326f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32700 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
32710 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 69 6d 65  r, "Usage: .time
32720 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  r on|off\n");.  
32730 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32740 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32750 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63   c=='t' && strnc
32760 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 72  mp(azArg[0], "tr
32770 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
32780 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
32790 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
327a0 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
327b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
327c0 73 61 67 65 3a 20 2e 74 72 61 63 65 20 46 49 4c  sage: .trace FIL
327d0 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  E|off\n");.     
327e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
327f0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32800 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
32810 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
32820 73 65 28 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b  se(p->traceOut);
32830 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 4f 75 74  .    p->traceOut
32840 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
32850 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  pen(azArg[1]);.#
32860 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
32870 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
32880 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
32890 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
328a0 50 4f 49 4e 54 29 0a 20 20 20 20 69 66 28 20 70  POINT).    if( p
328b0 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29 7b  ->traceOut==0 ){
328c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
328d0 72 61 63 65 5f 76 32 28 70 2d 3e 64 62 2c 20 30  race_v2(p->db, 0
328e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
328f0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
32900 33 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64 62  3_trace_v2(p->db
32910 2c 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53  , SQLITE_TRACE_S
32920 54 4d 54 2c 20 73 71 6c 5f 74 72 61 63 65 5f 63  TMT, sql_trace_c
32930 61 6c 6c 62 61 63 6b 2c 70 2d 3e 74 72 61 63 65  allback,p->trace
32940 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Out);.    }.#end
32950 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20  if.  }else..#if 
32960 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
32970 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 69 66 28  ENTICATION.  if(
32980 20 63 3d 3d 27 75 27 20 26 26 20 73 74 72 6e 63   c=='u' && strnc
32990 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 75 73  mp(azArg[0], "us
329a0 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
329b0 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
329c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
329d0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
329e0 20 2e 75 73 65 72 20 53 55 42 43 4f 4d 4d 41 4e   .user SUBCOMMAN
329f0 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  D ...\n");.     
32a00 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
32a10 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32a20 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
32a30 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
32a40 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
32a50 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67 69 6e 22 29  zArg[1],"login")
32a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
32a70 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20   nArg!=4 ){.    
32a80 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32a90 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32aa0 75 73 65 72 20 6c 6f 67 69 6e 20 55 53 45 52 20  user login USER 
32ab0 50 41 53 53 57 4f 52 44 5c 6e 22 29 3b 0a 20 20  PASSWORD\n");.  
32ac0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
32ad0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
32ae0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
32af0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
32b00 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75   sqlite3_user_au
32b10 74 68 65 6e 74 69 63 61 74 65 28 70 2d 3e 64 62  thenticate(p->db
32b20 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 61 7a 41 72  , azArg[2], azAr
32b30 67 5b 33 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  g[3],.          
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 73            (int)s
32b60 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29 29  trlen(azArg[3]))
32b70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32b80 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
32b90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 41  rintf(stderr, "A
32ba0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
32bb0 69 6c 65 64 20 66 6f 72 20 75 73 65 72 20 25 73  iled for user %s
32bc0 5c 6e 22 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  \n", azArg[2]);.
32bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32be0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
32bf0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
32c00 72 67 5b 31 5d 2c 22 61 64 64 22 29 3d 3d 30 20  rg[1],"add")==0 
32c10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
32c20 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=5 ){.        
32c30 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
32c40 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72  r, "Usage: .user
32c50 20 61 64 64 20 55 53 45 52 20 50 41 53 53 57 4f   add USER PASSWO
32c60 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22 29 3b 0a  RD ISADMIN\n");.
32c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32c80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
32c90 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
32ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
32cb0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
32cc0 61 64 64 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67  add(p->db, azArg
32cd0 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [2],.           
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cf0 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e 74 29   azArg[3], (int)
32d00 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29  strlen(azArg[3])
32d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
32d30 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
32d40 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [4]));.      if(
32d50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
32d60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32d70 2c 20 22 55 73 65 72 2d 41 64 64 20 66 61 69 6c  , "User-Add fail
32d80 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  ed: %d\n", rc);.
32d90 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32da0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
32db0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
32dc0 72 67 5b 31 5d 2c 22 65 64 69 74 22 29 3d 3d 30  rg[1],"edit")==0
32dd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41   ){.      if( nA
32de0 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  rg!=5 ){.       
32df0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32e00 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65  rr, "Usage: .use
32e10 72 20 65 64 69 74 20 55 53 45 52 20 50 41 53 53  r edit USER PASS
32e20 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22 29  WORD ISADMIN\n")
32e30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
32e40 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
32e50 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
32e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32e70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
32e80 72 5f 63 68 61 6e 67 65 28 70 2d 3e 64 62 2c 20  r_change(p->db, 
32e90 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20  azArg[2],.      
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32eb0 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 33 5d          azArg[3]
32ec0 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a  , (int)strlen(az
32ed0 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20  Arg[3]),.       
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ef0 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61         booleanVa
32f00 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a  lue(azArg[4]));.
32f10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32f20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
32f30 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
32f40 2d 45 64 69 74 20 66 61 69 6c 65 64 3a 20 25 64  -Edit failed: %d
32f50 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
32f60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32f70 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
32f80 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
32f90 22 64 65 6c 65 74 65 22 29 3d 3d 30 20 29 7b 0a  "delete")==0 ){.
32fa0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
32fb0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  3 ){.        raw
32fc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32fd0 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20 64 65  "Usage: .user de
32fe0 6c 65 74 65 20 55 53 45 52 5c 6e 22 29 3b 0a 20  lete USER\n");. 
32ff0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
33000 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
33010 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
33020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
33030 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
33040 65 6c 65 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41  elete(p->db, azA
33050 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  rg[2]);.      if
33060 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
33070 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33080 72 2c 20 22 55 73 65 72 2d 44 65 6c 65 74 65 20  r, "User-Delete 
33090 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72  failed: %d\n", r
330a0 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c);.        rc =
330b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
330c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
330d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
330e0 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20 6c 6f  "Usage: .user lo
330f0 67 69 6e 7c 61 64 64 7c 65 64 69 74 7c 64 65 6c  gin|add|edit|del
33100 65 74 65 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20  ete ...\n");.   
33110 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
33120 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
33130 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
33140 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
33150 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
33160 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a  HENTICATION */..
33170 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20    if( c=='v' && 
33180 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33190 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 6e 29 3d  , "version", n)=
331a0 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
331b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53  rintf(p->out, "S
331c0 51 4c 69 74 65 20 25 73 20 25 73 5c 6e 22 20 2f  QLite %s %s\n" /
331d0 2a 65 78 74 72 61 2d 76 65 72 73 69 6f 6e 2d 69  *extra-version-i
331e0 6e 66 6f 2a 2f 2c 0a 20 20 20 20 20 20 20 20 73  nfo*/,.        s
331f0 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
33200 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75  n(), sqlite3_sou
33210 72 63 65 69 64 28 29 29 3b 0a 20 20 7d 65 6c 73  rceid());.  }els
33220 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20  e..  if( c=='v' 
33230 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33240 5b 30 5d 2c 20 22 76 66 73 69 6e 66 6f 22 2c 20  [0], "vfsinfo", 
33250 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
33260 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
33270 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61 7a 41   = nArg==2 ? azA
33280 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a  rg[1] : "main";.
33290 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
332a0 2a 70 56 66 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pVfs = 0;.    i
332b0 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
332c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
332d0 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44  ontrol(p->db, zD
332e0 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
332f0 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 2c  NTL_VFS_POINTER,
33300 20 26 70 56 66 73 29 3b 0a 20 20 20 20 20 20 69   &pVfs);.      i
33310 66 28 20 70 56 66 73 20 29 7b 0a 20 20 20 20 20  f( pVfs ){.     
33320 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33330 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a 4e 61 6d  ->out, "vfs.zNam
33340 65 20 20 20 20 20 20 3d 20 5c 22 25 73 5c 22 5c  e      = \"%s\"\
33350 6e 22 2c 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  n", pVfs->zName)
33360 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
33370 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66  intf(p->out, "vf
33380 73 2e 69 56 65 72 73 69 6f 6e 20 20 20 3d 20 25  s.iVersion   = %
33390 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 69 56 65 72  d\n", pVfs->iVer
333a0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  sion);.        r
333b0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
333c0 2c 20 22 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20  , "vfs.szOsFile 
333d0 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d    = %d\n", pVfs-
333e0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 20 20  >szOsFile);.    
333f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
33400 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d 78 50 61  ->out, "vfs.mxPa
33410 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e 22 2c 20  thname = %d\n", 
33420 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
33430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33440 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
33450 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d  c=='v' && strncm
33460 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73  p(azArg[0], "vfs
33470 6c 69 73 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  list", n)==0 ){.
33480 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
33490 2a 70 56 66 73 3b 0a 20 20 20 20 73 71 6c 69 74  *pVfs;.    sqlit
334a0 65 33 5f 76 66 73 20 2a 70 43 75 72 72 65 6e 74  e3_vfs *pCurrent
334b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
334c0 3e 64 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >db ){.      sql
334d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
334e0 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  l(p->db, "main",
334f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
33500 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70 43 75 72  S_POINTER, &pCur
33510 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
33520 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65   for(pVfs=sqlite
33530 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70  3_vfs_find(0); p
33540 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e  Vfs; pVfs=pVfs->
33550 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 75 74  pNext){.      ut
33560 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
33570 2c 20 22 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20  , "vfs.zName    
33580 20 20 3d 20 5c 22 25 73 5c 22 25 73 5c 6e 22 2c    = \"%s\"%s\n",
33590 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pVfs->zName,.  
335a0 20 20 20 20 20 20 20 20 20 70 56 66 73 3d 3d 70           pVfs==p
335b0 43 75 72 72 65 6e 74 20 3f 20 22 20 20 3c 2d 2d  Current ? "  <--
335c0 2d 20 43 55 52 52 45 4e 54 22 20 3a 20 22 22 29  - CURRENT" : "")
335d0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
335e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e  tf(p->out, "vfs.
335f0 69 56 65 72 73 69 6f 6e 20 20 20 3d 20 25 64 5c  iVersion   = %d\
33600 6e 22 2c 20 70 56 66 73 2d 3e 69 56 65 72 73 69  n", pVfs->iVersi
33610 6f 6e 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  on);.      raw_p
33620 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76  rintf(p->out, "v
33630 66 73 2e 73 7a 4f 73 46 69 6c 65 20 20 20 3d 20  fs.szOsFile   = 
33640 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 73 7a 4f  %d\n", pVfs->szO
33650 73 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 61  sFile);.      ra
33660 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
33670 20 22 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65   "vfs.mxPathname
33680 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e   = %d\n", pVfs->
33690 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  mxPathname);.   
336a0 20 20 20 69 66 28 20 70 56 66 73 2d 3e 70 4e 65     if( pVfs->pNe
336b0 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  xt ){.        ra
336c0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
336d0 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
336e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
336f0 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
33700 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
33710 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26  ..  if( c=='v' &
33720 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33730 30 5d 2c 20 22 76 66 73 6e 61 6d 65 22 2c 20 6e  0], "vfsname", n
33740 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
33750 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
33760 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61 7a 41 72  = nArg==2 ? azAr
33770 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
33780 20 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d     char *zVfsNam
33790 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
337a0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20 20 73 71  ->db ){.      sq
337b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
337c0 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d  ol(p->db, zDbNam
337d0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
337e0 56 46 53 4e 41 4d 45 2c 20 26 7a 56 66 73 4e 61  VFSNAME, &zVfsNa
337f0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
33800 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  VfsName ){.     
33810 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33820 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
33830 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  VfsName);.      
33840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
33850 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  VfsName);.      
33860 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
33870 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
33880 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
33890 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
338a0 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
338b0 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20    if( c=='w' && 
338c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
338d0 2c 20 22 77 68 65 72 65 74 72 61 63 65 22 2c 20  , "wheretrace", 
338e0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  n)==0 ){.    sql
338f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
33900 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65   nArg>=2 ? boole
33910 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
33920 29 20 3a 20 30 78 66 66 3b 0a 20 20 7d 65 6c 73  ) : 0xff;.  }els
33930 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
33940 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d  c=='w' && strncm
33950 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64  p(azArg[0], "wid
33960 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  th", n)==0 ){.  
33970 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73 73    int j;.    ass
33980 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61 79  ert( nArg<=Array
33990 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a 20  Size(azArg) );. 
339a0 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
339b0 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69 7a  rg && j<ArraySiz
339c0 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b 20  e(p->colWidth); 
339d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  j++){.      p->c
339e0 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20 28  olWidth[j-1] = (
339f0 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
33a00 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20  (azArg[j]);.    
33a10 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 0a 20  }.  }else..  {. 
33a20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
33a30 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75  tderr, "Error: u
33a40 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
33a50 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
33a60 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
33a70 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
33a80 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
33a90 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
33aa0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a     rc = 1;.  }..
33ab0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
33ac0 74 3a 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 43  t:.  if( p->outC
33ad0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  ount ){.    p->o
33ae0 75 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 69  utCount--;.    i
33af0 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 3d 3d  f( p->outCount==
33b00 30 20 29 20 6f 75 74 70 75 74 5f 72 65 73 65 74  0 ) output_reset
33b10 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
33b20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
33b30 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
33b40 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73  semicolon occurs
33b50 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65   anywhere in the
33b60 20 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74   first N charact
33b70 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  ers.** of string
33b80 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   z[]..*/.static 
33b90 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74 61 69 6e  int line_contain
33ba0 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f 6e 73  s_semicolon(cons
33bb0 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e  t char *z, int N
33bc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
33bd0 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
33be0 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3b 27  {  if( z[i]==';'
33bf0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 7d 0a 20   ) return 1; }. 
33c00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
33c10 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
33c20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73 69 73  if a line consis
33c30 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77  ts entirely of w
33c40 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  hitespace..*/.st
33c50 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f 77 68  atic int _all_wh
33c60 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63  itespace(const c
33c70 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72 28 3b  har *z){.  for(;
33c80 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69   *z; z++){.    i
33c90 66 28 20 49 73 53 70 61 63 65 28 7a 5b 30 5d 29  f( IsSpace(z[0])
33ca0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
33cb0 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26 20   if( *z=='/' && 
33cc0 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  z[1]=='*' ){.   
33cd0 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
33ce0 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 28 2a   while( *z && (*
33cf0 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21 3d  z!='*' || z[1]!=
33d00 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  '/') ){ z++; }. 
33d10 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29       if( *z==0 )
33d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
33d30 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74   z++;.      cont
33d40 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
33d50 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26 20 7a  if( *z=='-' && z
33d60 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]=='-' ){.    
33d70 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    z += 2;.      
33d80 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21  while( *z && *z!
33d90 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  ='\n' ){ z++; }.
33da0 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20        if( *z==0 
33db0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
33dc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
33dd0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
33de0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
33df0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33e00 54 52 55 45 20 69 66 20 74 68 65 20 6c 69 6e 65  TRUE if the line
33e10 20 74 79 70 65 64 20 69 6e 20 69 73 20 61 6e 20   typed in is an 
33e20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65 72 6d  SQL command term
33e30 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a 2a 20  inator other.** 
33e40 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f 6c 6f  than a semi-colo
33e50 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65 72 76  n.  The SQL Serv
33e60 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20 63 6f  er style "go" co
33e70 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72 73 74  mmand is underst
33e80 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74 68 65  ood.** as is the
33e90 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f 0a   Oracle "/"..*/.
33ea0 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65 5f  static int line_
33eb0 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69  is_command_termi
33ec0 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  nator(const char
33ed0 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c   *zLine){.  whil
33ee0 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  e( IsSpace(zLine
33ef0 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b  [0]) ){ zLine++;
33f00 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b   };.  if( zLine[
33f10 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c 6c 5f  0]=='/' && _all_
33f20 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69 6e  whitespace(&zLin
33f30 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[1]) ){.    ret
33f40 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61 63 6c  urn 1;  /* Oracl
33f50 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 54  e */.  }.  if( T
33f60 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30 5d 29  oLower(zLine[0])
33f70 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f 77 65 72  =='g' && ToLower
33f80 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f 27 0a  (zLine[1])=='o'.
33f90 20 20 20 20 20 20 20 20 20 26 26 20 5f 61 6c 6c           && _all
33fa0 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69  _whitespace(&zLi
33fb0 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20 72 65  ne[2]) ){.    re
33fc0 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51 4c 20  turn 1;  /* SQL 
33fd0 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a 20 20  Server */.  }.  
33fe0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
33ff0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
34000 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f 6d 70  f zSql is a comp
34010 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
34020 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  nt.  Return fals
34030 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64 73 20  e if it.** ends 
34040 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
34050 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
34060 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63 6f 6d  l or C-style com
34070 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
34080 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70  int line_is_comp
34090 6c 65 74 65 28 63 68 61 72 20 2a 7a 53 71 6c 2c  lete(char *zSql,
340a0 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20 20 69 6e   int nSql){.  in
340b0 74 20 72 63 3b 0a 20 20 69 66 28 20 7a 53 71 6c  t rc;.  if( zSql
340c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
340d0 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 27    zSql[nSql] = '
340e0 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b  ;';.  zSql[nSql+
340f0 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  1] = 0;.  rc = s
34100 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
34110 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b 6e 53  zSql);.  zSql[nS
34120 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ql] = 0;.  retur
34130 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
34140 75 6e 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65  un a single line
34150 20 6f 66 20 53 51 4c 0a 2a 2f 0a 73 74 61 74 69   of SQL.*/.stati
34160 63 20 69 6e 74 20 72 75 6e 4f 6e 65 53 71 6c 4c  c int runOneSqlL
34170 69 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ine(ShellState *
34180 70 2c 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 46  p, char *zSql, F
34190 49 4c 45 20 2a 69 6e 2c 20 69 6e 74 20 73 74 61  ILE *in, int sta
341a0 72 74 6c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 72  rtline){.  int r
341b0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
341c0 73 67 20 3d 20 30 3b 0a 0a 20 20 6f 70 65 6e 5f  sg = 0;..  open_
341d0 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  db(p, 0);.  if( 
341e0 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 53  ShellHasFlag(p,S
341f0 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 29 20  HFLG_Backslash) 
34200 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
34210 61 73 68 65 73 28 7a 53 71 6c 29 3b 0a 20 20 42  ashes(zSql);.  B
34220 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 72 63  EGIN_TIMER;.  rc
34230 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d   = shell_exec(p-
34240 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c  >db, zSql, shell
34250 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a  _callback, p, &z
34260 45 72 72 4d 73 67 29 3b 0a 20 20 45 4e 44 5f 54  ErrMsg);.  END_T
34270 49 4d 45 52 3b 0a 20 20 69 66 28 20 72 63 20 7c  IMER;.  if( rc |
34280 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
34290 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 31 30   char zPrefix[10
342a0 30 5d 3b 0a 20 20 20 20 69 66 28 20 69 6e 21 3d  0];.    if( in!=
342b0 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73 5f 69  0 || !stdin_is_i
342c0 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20  nteractive ){.  
342d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
342e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65  intf(sizeof(zPre
342f0 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 0a 20  fix), zPrefix,. 
34300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34310 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 65        "Error: ne
34320 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74  ar line %d:", st
34330 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 7d 65  artline);.    }e
34340 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
34350 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
34360 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72  of(zPrefix), zPr
34370 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22 29 3b  efix, "Error:");
34380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
34390 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20  ErrMsg!=0 ){.   
343a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
343b0 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22  tderr, "%s %s\n"
343c0 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72 72 4d  , zPrefix, zErrM
343d0 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
343e0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
343f0 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20  ;.      zErrMsg 
34400 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
34410 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34420 66 28 73 74 64 65 72 72 2c 20 22 25 73 20 25 73  f(stderr, "%s %s
34430 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 73 71  \n", zPrefix, sq
34440 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
34450 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  db));.    }.    
34460 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
34470 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
34480 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e  ag(p, SHFLG_Coun
34490 74 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  tChanges) ){.   
344a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
344b0 75 74 2c 20 22 63 68 61 6e 67 65 73 3a 20 25 33  ut, "changes: %3
344c0 64 20 20 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  d   total_change
344d0 73 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  s: %d\n",.      
344e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68        sqlite3_ch
344f0 61 6e 67 65 73 28 70 2d 3e 64 62 29 2c 20 73 71  anges(p->db), sq
34500 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
34510 67 65 73 28 70 2d 3e 64 62 29 29 3b 0a 20 20 7d  ges(p->db));.  }
34520 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
34530 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
34540 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70  t from *in and p
34550 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a  rocess it.  If *
34560 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74  in==0 then input
34570 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69  .** is interacti
34580 76 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73  ve - the user is
34590 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20   typing it it.  
345a0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74  Otherwise, input
345b0 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  .** is coming fr
345c0 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76  om a file or dev
345d0 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69  ice.  A prompt i
345e0 73 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73  s issued and his
345f0 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64  tory.** is saved
34600 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69   only if input i
34610 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20  s interactive.  
34620 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67  An interrupt sig
34630 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  nal will.** caus
34640 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
34650 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  o exit immediate
34660 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74  ly, unless input
34670 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
34680 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
34690 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
346a0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
346b0 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  t process_input(
346c0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46  ShellState *p, F
346d0 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
346e0 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b 20 20 20 20   *zLine = 0;    
346f0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
34700 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 2a 2f 0a  e input line */.
34710 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30    char *zSql = 0
34720 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
34730 63 63 75 6d 75 6c 61 74 65 64 20 53 51 4c 20 74  ccumulated SQL t
34740 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ext */.  int nLi
34750 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
34760 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
34770 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 2a 2f 0a  current line */.
34780 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20 30 3b 20    int nSql = 0; 
34790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
347a0 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b 5d 20 75  ytes of zSql[] u
347b0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  sed */.  int nAl
347c0 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
347d0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
347e0 7a 53 71 6c 5b 5d 20 73 70 61 63 65 20 2a 2f 0a  zSql[] space */.
347f0 20 20 69 6e 74 20 6e 53 71 6c 50 72 69 6f 72 20    int nSqlPrior 
34800 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  = 0;        /* B
34810 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b 5d 20 75  ytes of zSql[] u
34820 73 65 64 20 62 79 20 70 72 69 6f 72 20 6c 69 6e  sed by prior lin
34830 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34850 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
34860 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e 74 20 3d  /.  int errCnt =
34870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
34880 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
34890 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
348a0 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
348b0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
348c0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
348d0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
348e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  = 0;        /* L
348f0 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
34900 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20  tart of current 
34910 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77 68 69 6c  input */..  whil
34920 65 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20  e( errCnt==0 || 
34930 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c  !bail_on_error |
34940 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69  | (in==0 && stdi
34950 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
34960 29 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28  ) ){.    fflush(
34970 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c 69  p->out);.    zLi
34980 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c  ne = one_input_l
34990 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20 6e  ine(in, zLine, n
349a0 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69 66 28 20  Sql>0);.    if( 
349b0 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLine==0 ){.    
349c0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75    /* End of inpu
349d0 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  t */.      if( i
349e0 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f 69 73  n==0 && stdin_is
349f0 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 20 70  _interactive ) p
34a00 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
34a10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
34a20 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
34a30 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
34a40 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
34a50 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
34a60 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
34a70 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  .    lineno++;. 
34a80 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30 20 26     if( nSql==0 &
34a90 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  & _all_whitespac
34aa0 65 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  e(zLine) ){.    
34ab0 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c    if( ShellHasFl
34ac0 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
34ad0 29 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e  ) ) printf("%s\n
34ae0 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ", zLine);.     
34af0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
34b00 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26  .    if( zLine &
34b10 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20  & zLine[0]=='.' 
34b20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  && nSql==0 ){.  
34b30 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73      if( ShellHas
34b40 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63  Flag(p, SHFLG_Ec
34b50 68 6f 29 20 29 20 70 72 69 6e 74 66 28 22 25 73  ho) ) printf("%s
34b60 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20  \n", zLine);.   
34b70 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f     rc = do_meta_
34b80 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20 70  command(zLine, p
34b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
34ba0 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20 72 65  =2 ){ /* exit re
34bb0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 20  quested */.     
34bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
34bd0 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
34be0 20 20 20 20 20 20 20 20 65 72 72 43 6e 74 2b 2b          errCnt++
34bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34c00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
34c10 20 20 20 20 69 66 28 20 6c 69 6e 65 5f 69 73 5f      if( line_is_
34c20 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
34c30 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 6c 69 6e  or(zLine) && lin
34c40 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28 7a 53  e_is_complete(zS
34c50 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a 20 20 20  ql, nSql) ){.   
34c60 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c     memcpy(zLine,
34c70 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ";",2);.    }.  
34c80 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e    nLine = strlen
34c90 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 69  30(zLine);.    i
34ca0 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b 32 3e  f( nSql+nLine+2>
34cb0 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
34cc0 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71 6c 2b 6e   nAlloc = nSql+n
34cd0 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20 20 20 20  Line+100;.      
34ce0 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  zSql = realloc(z
34cf0 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20  Sql, nAlloc);.  
34d00 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
34d10 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
34d20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34d30 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
34d40 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
34d50 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
34d60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c  }.    }.    nSql
34d70 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20  Prior = nSql;.  
34d80 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30 20 29 7b    if( nSql==0 ){
34d90 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
34da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69      for(i=0; zLi
34db0 6e 65 5b 69 5d 20 26 26 20 49 73 53 70 61 63 65  ne[i] && IsSpace
34dc0 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29  (zLine[i]); i++)
34dd0 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
34de0 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20 7a 53 71   nAlloc>0 && zSq
34df0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  l!=0 );.      me
34e00 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65  mcpy(zSql, zLine
34e10 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b 0a  +i, nLine+1-i);.
34e20 20 20 20 20 20 20 73 74 61 72 74 6c 69 6e 65 20        startline 
34e30 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
34e40 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b 0a  nSql = nLine-i;.
34e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34e60 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20   zSql[nSql++] = 
34e70 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63  '\n';.      memc
34e80 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a 4c  py(zSql+nSql, zL
34e90 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a 20  ine, nLine+1);. 
34ea0 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c 69       nSql += nLi
34eb0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
34ec0 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e 65 5f 63  ( nSql && line_c
34ed0 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f  ontains_semicolo
34ee0 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69 6f  n(&zSql[nSqlPrio
34ef0 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72 69  r], nSql-nSqlPri
34f00 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  or).            
34f10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
34f20 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b  omplete(zSql) ){
34f30 0a 20 20 20 20 20 20 65 72 72 43 6e 74 20 2b 3d  .      errCnt +=
34f40 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 70   runOneSqlLine(p
34f50 2c 20 7a 53 71 6c 2c 20 69 6e 2c 20 73 74 61 72  , zSql, in, star
34f60 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 6e 53  tline);.      nS
34f70 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ql = 0;.      if
34f80 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 29 7b  ( p->outCount ){
34f90 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
34fa0 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20  reset(p);.      
34fb0 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
34fc0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
34fd0 65 6c 73 65 20 69 66 28 20 6e 53 71 6c 20 26 26  else if( nSql &&
34fe0 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65   _all_whitespace
34ff0 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zSql) ){.      
35000 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67  if( ShellHasFlag
35010 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20  (p, SHFLG_Echo) 
35020 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c  ) printf("%s\n",
35030 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 6e 53   zSql);.      nS
35040 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ql = 0;.    }.  
35050 7d 0a 20 20 69 66 28 20 6e 53 71 6c 20 26 26 20  }.  if( nSql && 
35060 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65  !_all_whitespace
35070 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 72 75  (zSql) ){.    ru
35080 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 70 2c 20 7a  nOneSqlLine(p, z
35090 53 71 6c 2c 20 69 6e 2c 20 73 74 61 72 74 6c 69  Sql, in, startli
350a0 6e 65 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  ne);.  }.  free(
350b0 7a 53 71 6c 29 3b 0a 20 20 66 72 65 65 28 7a 4c  zSql);.  free(zL
350c0 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  ine);.  return e
350d0 72 72 43 6e 74 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rrCnt>0;.}../*.*
350e0 2a 20 52 65 74 75 72 6e 20 61 20 70 61 74 68 6e  * Return a pathn
350f0 61 6d 65 20 77 68 69 63 68 20 69 73 20 74 68 65  ame which is the
35100 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72   user's home dir
35110 65 63 74 6f 72 79 2e 20 20 41 0a 2a 2a 20 30 20  ectory.  A.** 0 
35120 72 65 74 75 72 6e 20 69 6e 64 69 63 61 74 65 73  return indicates
35130 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d   an error of som
35140 65 20 6b 69 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  e kind..*/.stati
35150 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d  c char *find_hom
35160 65 5f 64 69 72 28 69 6e 74 20 63 6c 65 61 72 46  e_dir(int clearF
35170 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  lag){.  static c
35180 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20  har *home_dir = 
35190 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 63 6c 65 61  NULL;.  if( clea
351a0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 72 65  rFlag ){.    fre
351b0 65 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20  e(home_dir);.   
351c0 20 68 6f 6d 65 5f 64 69 72 20 3d 20 30 3b 0a 20   home_dir = 0;. 
351d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
351e0 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 20  .  if( home_dir 
351f0 29 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69  ) return home_di
35200 72 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  r;..#if !defined
35210 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
35220 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21  ined(WIN32) && !
35230 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
35240 43 45 29 20 5c 0a 20 20 20 20 20 26 26 20 21 64  CE) \.     && !d
35250 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
35260 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
35270 5f 4b 45 52 4e 45 4c 29 0a 20 20 7b 0a 20 20 20  _KERNEL).  {.   
35280 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a   struct passwd *
35290 70 77 65 6e 74 3b 0a 20 20 20 20 75 69 64 5f 74  pwent;.    uid_t
352a0 20 75 69 64 20 3d 20 67 65 74 75 69 64 28 29 3b   uid = getuid();
352b0 0a 20 20 20 20 69 66 28 20 28 70 77 65 6e 74 3d  .    if( (pwent=
352c0 67 65 74 70 77 75 69 64 28 75 69 64 29 29 20 21  getpwuid(uid)) !
352d0 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20  = NULL) {.      
352e0 68 6f 6d 65 5f 64 69 72 20 3d 20 70 77 65 6e 74  home_dir = pwent
352f0 2d 3e 70 77 5f 64 69 72 3b 0a 20 20 20 20 7d 0a  ->pw_dir;.    }.
35300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
35310 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
35320 43 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73  CE).  /* Windows
35330 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d   CE (arm-wince-m
35340 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f  ingw32ce-gcc) do
35350 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67  es not provide g
35360 65 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20  etenv().   */.  
35370 68 6f 6d 65 5f 64 69 72 20 3d 20 22 2f 22 3b 0a  home_dir = "/";.
35380 23 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e  #else..#if defin
35390 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
353a0 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 69  fined(WIN32).  i
353b0 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
353c0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
353d0 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
353e0 4c 45 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LE");.  }.#endif
353f0 0a 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69  ..  if (!home_di
35400 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69  r) {.    home_di
35410 72 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  r = getenv("HOME
35420 22 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66  ");.  }..#if def
35430 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
35440 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
35450 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20   if (!home_dir) 
35460 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69  {.    char *zDri
35470 76 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20  ve, *zPath;.    
35480 69 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76  int n;.    zDriv
35490 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  e = getenv("HOME
354a0 44 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61  DRIVE");.    zPa
354b0 74 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d  th = getenv("HOM
354c0 45 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28  EPATH");.    if(
354d0 20 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74 68   zDrive && zPath
354e0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74   ){.      n = st
354f0 72 6c 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b  rlen30(zDrive) +
35500 20 73 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29   strlen30(zPath)
35510 20 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65   + 1;.      home
35520 5f 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  _dir = malloc( n
35530 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f   );.      if( ho
35540 6d 65 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75  me_dir==0 ) retu
35550 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69  rn 0;.      sqli
35560 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
35570 68 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22  home_dir, "%s%s"
35580 2c 20 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29  , zDrive, zPath)
35590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  ;.      return h
355a0 6f 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20  ome_dir;.    }. 
355b0 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63     home_dir = "c
355c0 3a 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  :\\";.  }.#endif
355d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49  ..#endif /* !_WI
355e0 4e 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66  N32_WCE */..  if
355f0 28 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20  ( home_dir ){.  
35600 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
35610 33 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31  30(home_dir) + 1
35620 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
35630 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20  malloc( n );.   
35640 20 69 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28   if( z ) memcpy(
35650 7a 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b  z, home_dir, n);
35660 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
35670 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  z;.  }..  return
35680 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a   home_dir;.}../*
35690 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66  .** Read input f
356a0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76  rom the file giv
356b0 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f  en by sqliterc_o
356c0 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20  verride.  Or if 
356d0 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65  that.** paramete
356e0 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20  r is NULL, take 
356f0 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71  input from ~/.sq
35700 6c 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74  literc.**.** Ret
35710 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
35720 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74  of errors..*/.st
35730 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63 65 73  atic void proces
35740 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20 53 68  s_sqliterc(.  Sh
35750 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20  ellState *p,    
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35770 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64   Configuration d
35780 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
35790 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76  har *sqliterc_ov
357a0 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65  erride   /* Name
357b0 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e   of config file.
357c0 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66   NULL to use def
357d0 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ault */.){.  cha
357e0 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55  r *home_dir = NU
357f0 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  LL;.  const char
35800 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c   *sqliterc = sql
35810 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a  iterc_override;.
35820 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30    char *zBuf = 0
35830 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e  ;.  FILE *in = N
35840 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 73 71 6c 69  ULL;..  if (sqli
35850 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  terc == NULL) {.
35860 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 66      home_dir = f
35870 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 30 29 3b  ind_home_dir(0);
35880 0a 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69  .    if( home_di
35890 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  r==0 ){.      ra
358a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
358b0 20 22 2d 2d 20 77 61 72 6e 69 6e 67 3a 20 63 61   "-- warning: ca
358c0 6e 6e 6f 74 20 66 69 6e 64 20 68 6f 6d 65 20 64  nnot find home d
358d0 69 72 65 63 74 6f 72 79 3b 22 0a 20 20 20 20 20  irectory;".     
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 20 22 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 7e   " cannot read ~
35900 2f 2e 73 71 6c 69 74 65 72 63 5c 6e 22 29 3b 0a  /.sqliterc\n");.
35910 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
35920 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
35930 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
35940 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33    zBuf = sqlite3
35950 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e 73 71  _mprintf("%s/.sq
35960 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f 64 69 72  literc",home_dir
35970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 72 63 20  );.    sqliterc 
35980 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 69 6e  = zBuf;.  }.  in
35990 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69 74 65 72   = fopen(sqliter
359a0 63 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  c,"rb");.  if( i
359b0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 64  n ){.    if( std
359c0 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
359d0 65 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  e ){.      utf8_
359e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d  printf(stderr,"-
359f0 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72  - Loading resour
35a00 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73  ces from %s\n",s
35a10 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a  qliterc);.    }.
35a20 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e 70 75      process_inpu
35a30 74 28 70 2c 69 6e 29 3b 0a 20 20 20 20 66 63 6c  t(p,in);.    fcl
35a40 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 73  ose(in);.  }.  s
35a50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
35a60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  );.}../*.** Show
35a70 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61   available comma
35a80 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a  nd line options.
35a90 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
35aa0 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20  char zOptions[] 
35ab0 3d 0a 20 20 22 20 20 20 2d 61 73 63 69 69 20 20  =.  "   -ascii  
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
35ad0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
35ae0 27 61 73 63 69 69 27 5c 6e 22 0a 20 20 22 20 20  'ascii'\n".  "  
35af0 20 2d 62 61 69 6c 20 20 20 20 20 20 20 20 20 20   -bail          
35b00 20 20 20 20 20 20 73 74 6f 70 20 61 66 74 65 72        stop after
35b10 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
35b20 72 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63  r\n".  "   -batc
35b30 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
35b40 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c  force batch I/O\
35b50 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e  n".  "   -column
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
35b70 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
35b80 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22   'column'\n".  "
35b90 20 20 20 2d 63 6d 64 20 43 4f 4d 4d 41 4e 44 20     -cmd COMMAND 
35ba0 20 20 20 20 20 20 20 20 72 75 6e 20 5c 22 43 4f          run \"CO
35bb0 4d 4d 41 4e 44 5c 22 20 62 65 66 6f 72 65 20 72  MMAND\" before r
35bc0 65 61 64 69 6e 67 20 73 74 64 69 6e 5c 6e 22 0a  eading stdin\n".
35bd0 20 20 22 20 20 20 2d 63 73 76 20 20 20 20 20 20    "   -csv      
35be0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
35bf0 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63  utput mode to 'c
35c00 73 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63  sv'\n".  "   -ec
35c10 68 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ho              
35c20 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73    print commands
35c30 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f   before executio
35c40 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 69 74  n\n".  "   -init
35c50 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
35c60 72 65 61 64 2f 70 72 6f 63 65 73 73 20 6e 61 6d  read/process nam
35c70 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20  ed file\n".  "  
35c80 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20 20 20   -[no]header    
35c90 20 20 20 20 20 20 74 75 72 6e 20 68 65 61 64 65        turn heade
35ca0 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  rs on or off\n".
35cb0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
35cc0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
35cd0 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
35ce0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
35cf0 59 53 35 29 0a 20 20 22 20 20 20 2d 68 65 61 70  YS5).  "   -heap
35d00 20 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20   SIZE           
35d10 53 69 7a 65 20 6f 66 20 68 65 61 70 20 66 6f 72  Size of heap for
35d20 20 6d 65 6d 73 79 73 33 20 6f 72 20 6d 65 6d 73   memsys3 or mems
35d30 79 73 35 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ys5\n".#endif.  
35d40 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20  "   -help       
35d50 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
35d60 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
35d70 22 20 20 20 2d 68 74 6d 6c 20 20 20 20 20 20 20  "   -html       
35d80 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
35d90 70 75 74 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c  put mode to HTML
35da0 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72  \n".  "   -inter
35db0 61 63 74 69 76 65 20 20 20 20 20 20 20 20 20 66  active         f
35dc0 6f 72 63 65 20 69 6e 74 65 72 61 63 74 69 76 65  orce interactive
35dd0 20 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 6c   I/O\n".  "   -l
35de0 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
35df0 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
35e00 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
35e10 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
35e20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
35e30 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
35e40 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  ist'\n".  "   -l
35e50 6f 6f 6b 61 73 69 64 65 20 53 49 5a 45 20 4e 20  ookaside SIZE N 
35e60 20 20 20 75 73 65 20 4e 20 65 6e 74 72 69 65 73     use N entries
35e70 20 6f 66 20 53 5a 20 62 79 74 65 73 20 66 6f 72   of SZ bytes for
35e80 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
35e90 79 5c 6e 22 0a 20 20 22 20 20 20 2d 6d 6d 61 70  y\n".  "   -mmap
35ea0 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
35eb0 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
35ec0 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22 0a 23 69  e set to N\n".#i
35ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
35ee0 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22  LE_MULTIPLEX.  "
35ef0 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20     -multiplex   
35f00 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74          enable t
35f10 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56  he multiplexor V
35f20 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  FS\n".#endif.  "
35f30 20 20 20 2d 6e 65 77 6c 69 6e 65 20 53 45 50 20     -newline SEP 
35f40 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
35f50 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
35f60 2e 20 44 65 66 61 75 6c 74 3a 20 27 5c 5c 6e 27  . Default: '\\n'
35f70 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c 76  \n".  "   -nullv
35f80 61 6c 75 65 20 54 45 58 54 20 20 20 20 20 20 73  alue TEXT      s
35f90 65 74 20 74 65 78 74 20 73 74 72 69 6e 67 20 66  et text string f
35fa0 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  or NULL values. 
35fb0 44 65 66 61 75 6c 74 20 27 27 5c 6e 22 0a 20 20  Default ''\n".  
35fc0 22 20 20 20 2d 70 61 67 65 63 61 63 68 65 20 53  "   -pagecache S
35fd0 49 5a 45 20 4e 20 20 20 20 75 73 65 20 4e 20 73  IZE N    use N s
35fe0 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65 73  lots of SZ bytes
35ff0 20 65 61 63 68 20 66 6f 72 20 70 61 67 65 20 63   each for page c
36000 61 63 68 65 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20  ache memory\n". 
36010 20 22 20 20 20 2d 73 63 72 61 74 63 68 20 53 49   "   -scratch SI
36020 5a 45 20 4e 20 20 20 20 20 20 75 73 65 20 4e 20  ZE N      use N 
36030 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65  slots of SZ byte
36040 73 20 65 61 63 68 20 66 6f 72 20 73 63 72 61 74  s each for scrat
36050 63 68 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20 20 22  ch memory\n".  "
36060 20 20 20 2d 73 65 70 61 72 61 74 6f 72 20 53 45     -separator SE
36070 50 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70  P       set outp
36080 75 74 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ut column separa
36090 74 6f 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 7c  tor. Default: '|
360a0 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73 74 61 74  '\n".  "   -stat
360b0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
360c0 70 72 69 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61  print memory sta
360d0 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66  ts before each f
360e0 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20  inalize\n".  "  
360f0 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20   -version       
36100 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74        show SQLit
36110 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22  e version\n".  "
36120 20 20 20 2d 76 66 73 20 4e 41 4d 45 20 20 20 20     -vfs NAME    
36130 20 20 20 20 20 20 20 20 75 73 65 20 4e 41 4d 45          use NAME
36140 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   as the default 
36150 56 46 53 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  VFS\n".#ifdef SQ
36160 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54  LITE_ENABLE_VFST
36170 52 41 43 45 0a 20 20 22 20 20 20 2d 76 66 73 74  RACE.  "   -vfst
36180 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20  race            
36190 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 6f  enable tracing o
361a0 66 20 61 6c 6c 20 56 46 53 20 63 61 6c 6c 73 5c  f all VFS calls\
361b0 6e 22 0a 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74  n".#endif.;.stat
361c0 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e  ic void usage(in
361d0 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20  t showDetail){. 
361e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
361f0 65 72 72 2c 0a 20 20 20 20 20 20 22 55 73 61 67  err,.      "Usag
36200 65 3a 20 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20  e: %s [OPTIONS] 
36210 46 49 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e  FILENAME [SQL]\n
36220 22 0a 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d  ".      "FILENAM
36230 45 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  E is the name of
36240 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
36250 61 73 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62  ase. A new datab
36260 61 73 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e  ase is created\n
36270 22 0a 20 20 20 20 20 20 22 69 66 20 74 68 65 20  ".      "if the 
36280 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  file does not pr
36290 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c  eviously exist.\
362a0 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66  n", Argv0);.  if
362b0 28 20 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a  ( showDetail ){.
362c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
362d0 73 74 64 65 72 72 2c 20 22 4f 50 54 49 4f 4e 53  stderr, "OPTIONS
362e0 20 69 6e 63 6c 75 64 65 3a 5c 6e 25 73 22 2c 20   include:\n%s", 
362f0 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c  zOptions);.  }el
36300 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
36310 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20  tf(stderr, "Use 
36320 74 68 65 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e  the -help option
36330 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
36340 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
36350 0a 20 20 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a  .  }.  exit(1);.
36360 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
36370 69 7a 65 20 74 68 65 20 73 74 61 74 65 20 69 6e  ize the state in
36380 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74  formation in dat
36390 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
363a0 20 6d 61 69 6e 5f 69 6e 69 74 28 53 68 65 6c 6c   main_init(Shell
363b0 53 74 61 74 65 20 2a 64 61 74 61 29 20 7b 0a 20  State *data) {. 
363c0 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c   memset(data, 0,
363d0 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b   sizeof(*data));
363e0 0a 20 20 64 61 74 61 2d 3e 6e 6f 72 6d 61 6c 4d  .  data->normalM
363f0 6f 64 65 20 3d 20 64 61 74 61 2d 3e 63 4d 6f 64  ode = data->cMod
36400 65 20 3d 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d  e = data->mode =
36410 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 64 61   MODE_List;.  da
36420 74 61 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20  ta->autoExplain 
36430 3d 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61  = 1;.  memcpy(da
36440 74 61 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ta->colSeparator
36450 2c 53 45 50 5f 43 6f 6c 75 6d 6e 2c 20 32 29 3b  ,SEP_Column, 2);
36460 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e  .  memcpy(data->
36470 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 53 45 50  rowSeparator,SEP
36480 5f 52 6f 77 2c 20 32 29 3b 0a 20 20 64 61 74 61  _Row, 2);.  data
36490 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
364a0 3b 0a 20 20 64 61 74 61 2d 3e 73 68 65 6c 6c 46  ;.  data->shellF
364b0 6c 67 73 20 3d 20 53 48 46 4c 47 5f 4c 6f 6f 6b  lgs = SHFLG_Look
364c0 61 73 69 64 65 3b 0a 20 20 73 71 6c 69 74 65 33  aside;.  sqlite3
364d0 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
364e0 4f 4e 46 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20  ONFIG_URI, 1);. 
364f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
36500 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
36510 47 2c 20 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74  G, shellLog, dat
36520 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  a);.  sqlite3_co
36530 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
36540 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 29 3b  IG_MULTITHREAD);
36550 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
36560 6e 74 66 28 73 69 7a 65 6f 66 28 6d 61 69 6e 50  ntf(sizeof(mainP
36570 72 6f 6d 70 74 29 2c 20 6d 61 69 6e 50 72 6f 6d  rompt), mainProm
36580 70 74 2c 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a  pt,"sqlite> ");.
36590 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
365a0 74 66 28 73 69 7a 65 6f 66 28 63 6f 6e 74 69 6e  tf(sizeof(contin
365b0 75 65 50 72 6f 6d 70 74 29 2c 20 63 6f 6e 74 69  uePrompt), conti
365c0 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e  nuePrompt,"   ..
365d0 2e 3e 20 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .> ");.}../*.** 
365e0 4f 75 74 70 75 74 20 74 65 78 74 20 74 6f 20 74  Output text to t
365f0 68 65 20 63 6f 6e 73 6f 6c 65 20 69 6e 20 61 20  he console in a 
36600 66 6f 6e 74 20 74 68 61 74 20 61 74 74 72 61 63  font that attrac
36610 74 73 20 65 78 74 72 61 20 61 74 74 65 6e 74 69  ts extra attenti
36620 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57  on..*/.#ifdef _W
36630 49 4e 33 32 0a 73 74 61 74 69 63 20 76 6f 69 64  IN32.static void
36640 20 70 72 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74   printBold(const
36650 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20   char *zText){. 
36660 20 48 41 4e 44 4c 45 20 6f 75 74 20 3d 20 47 65   HANDLE out = Ge
36670 74 53 74 64 48 61 6e 64 6c 65 28 53 54 44 5f 4f  tStdHandle(STD_O
36680 55 54 50 55 54 5f 48 41 4e 44 4c 45 29 3b 0a 20  UTPUT_HANDLE);. 
36690 20 43 4f 4e 53 4f 4c 45 5f 53 43 52 45 45 4e 5f   CONSOLE_SCREEN_
366a0 42 55 46 46 45 52 5f 49 4e 46 4f 20 64 65 66 61  BUFFER_INFO defa
366b0 75 6c 74 53 63 72 65 65 6e 49 6e 66 6f 3b 0a 20  ultScreenInfo;. 
366c0 20 47 65 74 43 6f 6e 73 6f 6c 65 53 63 72 65 65   GetConsoleScree
366d0 6e 42 75 66 66 65 72 49 6e 66 6f 28 6f 75 74 2c  nBufferInfo(out,
366e0 20 26 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49   &defaultScreenI
366f0 6e 66 6f 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f  nfo);.  SetConso
36700 6c 65 54 65 78 74 41 74 74 72 69 62 75 74 65 28  leTextAttribute(
36710 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 46 4f  out,.         FO
36720 52 45 47 52 4f 55 4e 44 5f 52 45 44 7c 46 4f 52  REGROUND_RED|FOR
36730 45 47 52 4f 55 4e 44 5f 49 4e 54 45 4e 53 49 54  EGROUND_INTENSIT
36740 59 0a 20 20 29 3b 0a 20 20 70 72 69 6e 74 66 28  Y.  );.  printf(
36750 22 25 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20  "%s", zText);.  
36760 53 65 74 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74  SetConsoleTextAt
36770 74 72 69 62 75 74 65 28 6f 75 74 2c 20 64 65 66  tribute(out, def
36780 61 75 6c 74 53 63 72 65 65 6e 49 6e 66 6f 2e 77  aultScreenInfo.w
36790 41 74 74 72 69 62 75 74 65 73 29 3b 0a 7d 0a 23  Attributes);.}.#
367a0 65 6c 73 65 0a 73 74 61 74 69 63 20 76 6f 69 64  else.static void
367b0 20 70 72 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74   printBold(const
367c0 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20   char *zText){. 
367d0 20 70 72 69 6e 74 66 28 22 5c 30 33 33 5b 31 6d   printf("\033[1m
367e0 25 73 5c 30 33 33 5b 30 6d 22 2c 20 7a 54 65 78  %s\033[0m", zTex
367f0 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
36800 0a 2a 2a 20 47 65 74 20 74 68 65 20 61 72 67 75  .** Get the argu
36810 6d 65 6e 74 20 74 6f 20 61 6e 20 2d 2d 6f 70 74  ment to an --opt
36820 69 6f 6e 2e 20 20 54 68 72 6f 77 20 61 6e 20 65  ion.  Throw an e
36830 72 72 6f 72 20 61 6e 64 20 64 69 65 20 69 66 20  rror and die if 
36840 6e 6f 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  no argument.** i
36850 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
36860 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 6d 64  static char *cmd
36870 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75  line_option_valu
36880 65 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  e(int argc, char
36890 20 2a 2a 61 72 67 76 2c 20 69 6e 74 20 69 29 7b   **argv, int i){
368a0 0a 20 20 69 66 28 20 69 3d 3d 61 72 67 63 20 29  .  if( i==argc )
368b0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
368c0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 45  f(stderr, "%s: E
368d0 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72  rror: missing ar
368e0 67 75 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22 2c  gument to %s\n",
368f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67  .            arg
36900 76 5b 30 5d 2c 20 61 72 67 76 5b 61 72 67 63 2d  v[0], argv[argc-
36910 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  1]);.    exit(1)
36920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
36930 72 67 76 5b 69 5d 3b 0a 7d 0a 0a 23 69 66 6e 64  rgv[i];.}..#ifnd
36940 65 66 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f  ef SQLITE_SHELL_
36950 49 53 5f 55 54 46 38 0a 23 20 20 69 66 20 28 64  IS_UTF8.#  if (d
36960 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
36970 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
36980 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53  ) && defined(_MS
36990 43 5f 56 45 52 29 0a 23 20 20 20 20 64 65 66 69  C_VER).#    defi
369a0 6e 65 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f  ne SQLITE_SHELL_
369b0 49 53 5f 55 54 46 38 20 20 20 20 20 20 20 20 20  IS_UTF8         
369c0 20 28 30 29 0a 23 20 20 65 6c 73 65 0a 23 20 20   (0).#  else.#  
369d0 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
369e0 53 48 45 4c 4c 5f 49 53 5f 55 54 46 38 20 20 20  SHELL_IS_UTF8   
369f0 20 20 20 20 20 20 20 28 31 29 0a 23 20 20 65 6e         (1).#  en
36a00 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
36a10 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f  SQLITE_SHELL_IS_
36a20 55 54 46 38 0a 69 6e 74 20 53 51 4c 49 54 45 5f  UTF8.int SQLITE_
36a30 43 44 45 43 4c 20 6d 61 69 6e 28 69 6e 74 20 61  CDECL main(int a
36a40 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
36a50 29 7b 0a 23 65 6c 73 65 0a 69 6e 74 20 53 51 4c  ){.#else.int SQL
36a60 49 54 45 5f 43 44 45 43 4c 20 77 6d 61 69 6e 28  ITE_CDECL wmain(
36a70 69 6e 74 20 61 72 67 63 2c 20 77 63 68 61 72 5f  int argc, wchar_
36a80 74 20 2a 2a 77 61 72 67 76 29 7b 0a 20 20 63 68  t **wargv){.  ch
36a90 61 72 20 2a 2a 61 72 67 76 3b 0a 23 65 6e 64 69  ar **argv;.#endi
36aa0 66 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  f.  char *zErrMs
36ab0 67 20 3d 20 30 3b 0a 20 20 53 68 65 6c 6c 53 74  g = 0;.  ShellSt
36ac0 61 74 65 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73  ate data;.  cons
36ad0 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c  t char *zInitFil
36ae0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
36af0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
36b00 69 6e 74 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79  int warnInmemory
36b10 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
36b20 61 64 53 74 64 69 6e 20 3d 20 31 3b 0a 20 20 69  adStdin = 1;.  i
36b30 6e 74 20 6e 43 6d 64 20 3d 20 30 3b 0a 20 20 63  nt nCmd = 0;.  c
36b40 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 30 3b  har **azCmd = 0;
36b50 0a 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ..  setBinaryMod
36b60 65 28 73 74 64 69 6e 2c 20 30 29 3b 0a 20 20 73  e(stdin, 0);.  s
36b70 65 74 76 62 75 66 28 73 74 64 65 72 72 2c 20 30  etvbuf(stderr, 0
36b80 2c 20 5f 49 4f 4e 42 46 2c 20 30 29 3b 20 2f 2a  , _IONBF, 0); /*
36b90 20 4d 61 6b 65 20 73 75 72 65 20 73 74 64 65 72   Make sure stder
36ba0 72 20 69 73 20 75 6e 62 75 66 66 65 72 65 64 20  r is unbuffered 
36bb0 2a 2f 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e  */.  stdin_is_in
36bc0 74 65 72 61 63 74 69 76 65 20 3d 20 69 73 61 74  teractive = isat
36bd0 74 79 28 30 29 3b 0a 20 20 73 74 64 6f 75 74 5f  ty(0);.  stdout_
36be0 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20 69 73 61  is_console = isa
36bf0 74 74 79 28 31 29 3b 0a 0a 23 69 66 20 55 53 45  tty(1);..#if USE
36c00 5f 53 59 53 54 45 4d 5f 53 51 4c 49 54 45 2b 30  _SYSTEM_SQLITE+0
36c10 21 3d 31 0a 20 20 69 66 28 20 73 74 72 63 6d 70  !=1.  if( strcmp
36c20 28 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  (sqlite3_sourcei
36c30 64 28 29 2c 53 51 4c 49 54 45 5f 53 4f 55 52 43  d(),SQLITE_SOURC
36c40 45 5f 49 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  E_ID)!=0 ){.    
36c50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36c60 72 72 2c 20 22 53 51 4c 69 74 65 20 68 65 61 64  rr, "SQLite head
36c70 65 72 20 61 6e 64 20 73 6f 75 72 63 65 20 76 65  er and source ve
36c80 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 5c 6e  rsion mismatch\n
36c90 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s\n%s\n",.     
36ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
36cb0 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c 49 54  ourceid(), SQLIT
36cc0 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a 20 20  E_SOURCE_ID);.  
36cd0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 23    exit(1);.  }.#
36ce0 65 6e 64 69 66 0a 20 20 6d 61 69 6e 5f 69 6e 69  endif.  main_ini
36cf0 74 28 26 64 61 74 61 29 3b 0a 23 69 66 20 21 53  t(&data);.#if !S
36d00 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f 55  QLITE_SHELL_IS_U
36d10 54 46 38 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  TF8.  sqlite3_in
36d20 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 61 72  itialize();.  ar
36d30 67 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  gv = sqlite3_mal
36d40 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 61 72 67  loc64(sizeof(arg
36d50 76 5b 30 5d 29 2a 61 72 67 63 29 3b 0a 20 20 69  v[0])*argc);.  i
36d60 66 28 20 61 72 67 76 3d 3d 30 20 29 7b 0a 20 20  f( argv==0 ){.  
36d70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36d80 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
36d90 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
36da0 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
36db0 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
36dc0 29 7b 0a 20 20 20 20 61 72 67 76 5b 69 5d 20 3d  ){.    argv[i] =
36dd0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
36de0 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 77  nicode_to_utf8(w
36df0 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  argv[i]);.    if
36e00 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
36e10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36e20 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
36e30 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
36e40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
36e50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  }.  }.#endif.  a
36e60 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31 20 26  ssert( argc>=1 &
36e70 26 20 61 72 67 76 20 26 26 20 61 72 67 76 5b 30  & argv && argv[0
36e80 5d 20 29 3b 0a 20 20 41 72 67 76 30 20 3d 20 61  ] );.  Argv0 = a
36e90 72 67 76 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 4d 61  rgv[0];..  /* Ma
36ea0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
36eb0 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68  a valid signal h
36ec0 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65  andler early, be
36ed0 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20  fore anything.  
36ee0 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e  ** else is done.
36ef0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47  .  */.#ifdef SIG
36f00 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47  INT.  signal(SIG
36f10 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68  INT, interrupt_h
36f20 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a  andler);.#endif.
36f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
36f40 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f 43  HELL_DBNAME_PROC
36f50 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  .  {.    /* If t
36f60 68 65 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f  he SQLITE_SHELL_
36f70 44 42 4e 41 4d 45 5f 50 52 4f 43 20 6d 61 63 72  DBNAME_PROC macr
36f80 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  o is defined, th
36f90 65 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d  en it is the nam
36fa0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 43 2d  e.    ** of a C-
36fb0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 77 69  function that wi
36fc0 6c 6c 20 70 72 6f 76 69 64 65 20 74 68 65 20 6e  ll provide the n
36fd0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
36fe0 61 73 65 20 66 69 6c 65 2e 20 20 55 73 65 0a 20  ase file.  Use. 
36ff0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6d 70 69     ** this compi
37000 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 74  le-time option t
37010 6f 20 65 6d 62 65 64 20 74 68 69 73 20 73 68 65  o embed this she
37020 6c 6c 20 70 72 6f 67 72 61 6d 20 69 6e 20 6c 61  ll program in la
37030 72 67 65 72 0a 20 20 20 20 2a 2a 20 61 70 70 6c  rger.    ** appl
37040 69 63 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  ications. */.   
37050 20 65 78 74 65 72 6e 20 76 6f 69 64 20 53 51 4c   extern void SQL
37060 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45  ITE_SHELL_DBNAME
37070 5f 50 52 4f 43 28 63 6f 6e 73 74 20 63 68 61 72  _PROC(const char
37080 2a 2a 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f  **);.    SQLITE_
37090 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f  SHELL_DBNAME_PRO
370a0 43 28 26 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e  C(&data.zDbFilen
370b0 61 6d 65 29 3b 0a 20 20 20 20 77 61 72 6e 49 6e  ame);.    warnIn
370c0 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b 0a 20 20  memoryDb = 0;.  
370d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
370e0 6f 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73  o an initial pas
370f0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  s through the co
37100 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
37110 65 6e 74 20 74 6f 20 6c 6f 63 61 74 65 0a 20 20  ent to locate.  
37120 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** the name of t
37130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37140 2c 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  , the name of th
37150 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
37160 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 20   file,.  ** the 
37170 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 74 65  size of the alte
37180 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 68  rnative malloc h
37190 65 61 70 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eap,.  ** and th
371a0 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
371b0 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20 2a 2f  to execute..  */
371c0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
371d0 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  gc; i++){.    ch
371e0 61 72 20 2a 7a 3b 0a 20 20 20 20 7a 20 3d 20 61  ar *z;.    z = a
371f0 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rgv[i];.    if( 
37200 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
37210 20 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62 46     if( data.zDbF
37220 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
37230 20 20 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69        data.zDbFi
37240 6c 65 6e 61 6d 65 20 3d 20 7a 3b 0a 20 20 20 20  lename = z;.    
37250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37260 20 2f 2a 20 45 78 63 65 73 73 73 20 61 72 67 75   /* Excesss argu
37270 6d 65 6e 74 73 20 61 72 65 20 69 6e 74 65 72 70  ments are interp
37280 72 65 74 65 64 20 61 73 20 53 51 4c 20 28 6f 72  reted as SQL (or
37290 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 73 29 20 61   dot-commands) a
372a0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  nd.        ** me
372b0 61 6e 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20  an that nothing 
372c0 69 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74 64  is read from std
372d0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  in */.        re
372e0 61 64 53 74 64 69 6e 20 3d 20 30 3b 0a 20 20 20  adStdin = 0;.   
372f0 20 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20 20 20       nCmd++;.   
37300 20 20 20 20 20 61 7a 43 6d 64 20 3d 20 72 65 61       azCmd = rea
37310 6c 6c 6f 63 28 61 7a 43 6d 64 2c 20 73 69 7a 65  lloc(azCmd, size
37320 6f 66 28 61 7a 43 6d 64 5b 30 5d 29 2a 6e 43 6d  of(azCmd[0])*nCm
37330 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
37340 61 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20 20  azCmd==0 ){.    
37350 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37360 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
37370 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
37380 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
37390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
373a0 20 20 61 7a 43 6d 64 5b 6e 43 6d 64 2d 31 5d 20    azCmd[nCmd-1] 
373b0 3d 20 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = z;.      }.   
373c0 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d   }.    if( z[1]=
373d0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
373e0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73  if( strcmp(z,"-s
373f0 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 0a 20 20  eparator")==0.  
37400 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22     || strcmp(z,"
37410 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 0a  -nullvalue")==0.
37420 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a       || strcmp(z
37430 2c 22 2d 6e 65 77 6c 69 6e 65 22 29 3d 3d 30 0a  ,"-newline")==0.
37440 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a       || strcmp(z
37450 2c 22 2d 63 6d 64 22 29 3d 3d 30 0a 20 20 20 20  ,"-cmd")==0.    
37460 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64 29 63  ){.      (void)c
37470 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
37480 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20  lue(argc, argv, 
37490 2b 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ++i);.    }else 
374a0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69  if( strcmp(z,"-i
374b0 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nit")==0 ){.    
374c0 20 20 7a 49 6e 69 74 46 69 6c 65 20 3d 20 63 6d    zInitFile = cm
374d0 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c  dline_option_val
374e0 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20 2b  ue(argc, argv, +
374f0 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  +i);.    }else i
37500 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
37510 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tch")==0 ){.    
37520 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 68 65    /* Need to che
37530 63 6b 20 66 6f 72 20 62 61 74 63 68 20 6d 6f 64  ck for batch mod
37540 65 20 68 65 72 65 20 74 6f 20 73 6f 20 77 65 20  e here to so we 
37550 63 61 6e 20 61 76 6f 69 64 20 70 72 69 6e 74 69  can avoid printi
37560 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 66 6f  ng.      ** info
37570 72 6d 61 74 69 6f 6e 61 6c 20 6d 65 73 73 61 67  rmational messag
37580 65 73 20 28 6c 69 6b 65 20 66 72 6f 6d 20 70 72  es (like from pr
37590 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 29 20  ocess_sqliterc) 
375a0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
375b0 77 65 20 64 6f 20 74 68 65 20 61 63 74 75 61 6c  we do the actual
375c0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 61   processing of a
375d0 72 67 75 6d 65 6e 74 73 20 6c 61 74 65 72 20 69  rguments later i
375e0 6e 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 2e  n a second pass.
375f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37600 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
37610 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  tive = 0;.    }e
37620 6c 73 65 20 69 66 28 20 73 74 72 6