/ Hex Artifact Content
Login

Artifact 3ae4654560e91220a95738a73d135d91d937cda1:


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 2a 0a 2a 2a 20 24 49 64 3a 20 73  es..**.** $Id: s
01f0: 68 65 6c 6c 2e 63 2c 76 20 31 2e 31 36 30 20 32  hell.c,v 1.160 2
0200: 30 30 37 2f 30 32 2f 32 38 20 30 36 3a 31 34 3a  007/02/28 06:14:
0210: 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  25 drh Exp $.*/.
0220: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0230: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0240: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0250: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0260: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0270: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0280: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0290: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
02a0: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23 69 66 20  <stdarg.h>..#if 
02b0: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
02c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e   && !defined(WIN
02d0: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
02e0: 5f 5f 4d 41 43 4f 53 5f 5f 29 20 26 26 20 21 64  __MACOS__) && !d
02f0: 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a  efined(__OS2__).
0300: 23 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61  # include <signa
0310: 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  l.h>.# include <
0320: 70 77 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  pwd.h>.# include
0330: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e   <unistd.h>.# in
0340: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0350: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  .h>.#endif..#ifd
0360: 65 66 20 5f 5f 4d 41 43 4f 53 5f 5f 0a 23 20 69  ef __MACOS__.# i
0370: 6e 63 6c 75 64 65 20 3c 63 6f 6e 73 6f 6c 65 2e  nclude <console.
0380: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69  h>.# include <si
0390: 67 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  gnal.h>.# includ
03a0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69  e <unistd.h>.# i
03b0: 6e 63 6c 75 64 65 20 3c 65 78 74 72 61 73 2e 68  nclude <extras.h
03c0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 46 69 6c  >.# include <Fil
03d0: 65 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  es.h>.# include 
03e0: 3c 46 6f 6c 64 65 72 73 2e 68 3e 0a 23 65 6e 64  <Folders.h>.#end
03f0: 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 4f 53 32  if..#ifdef __OS2
0400: 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  __.# include <un
0410: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  istd.h>.#endif..
0420: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
0430: 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41  _READLINE) && HA
0440: 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 23  VE_READLINE==1.#
0450: 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69   include <readli
0460: 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23  ne/readline.h>.#
0470: 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69   include <readli
0480: 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65  ne/history.h>.#e
0490: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 65 61  lse.# define rea
04a0: 64 6c 69 6e 65 28 70 29 20 6c 6f 63 61 6c 5f 67  dline(p) local_g
04b0: 65 74 6c 69 6e 65 28 70 2c 73 74 64 69 6e 29 0a  etline(p,stdin).
04c0: 23 20 64 65 66 69 6e 65 20 61 64 64 5f 68 69 73  # define add_his
04d0: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
04e0: 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29   read_history(X)
04f0: 0a 23 20 64 65 66 69 6e 65 20 77 72 69 74 65 5f  .# define write_
0500: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
0510: 69 6e 65 20 73 74 69 66 6c 65 5f 68 69 73 74 6f  ine stifle_histo
0520: 72 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69  ry(X).#endif..#i
0530: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
0540: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
0550: 33 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69  32).# include <i
0560: 6f 2e 68 3e 0a 23 65 6c 73 65 0a 2f 2a 20 4d 61  o.h>.#else./* Ma
0570: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0580: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0590: 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20  ..*/.extern int 
05a0: 69 73 61 74 74 79 28 29 3b 0a 23 65 6e 64 69 66  isatty();.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
05c0: 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20 69 73  ollowing flag is
05d0: 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d 6d 61   set, then comma
05e0: 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73 74 6f  nd execution sto
05f0: 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72 72 6f  ps.** at an erro
0600: 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  r if we are not 
0610: 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a  interactive..*/.
0620: 73 74 61 74 69 63 20 69 6e 74 20 62 61 69 6c 5f  static int bail_
0630: 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f  on_error = 0;../
0640: 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74 64 69  *.** Threat stdi
0650: 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61 63 74  n as an interact
0660: 69 76 65 20 69 6e 70 75 74 20 69 66 20 74 68 65  ive input if the
0670: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
0680: 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65 2e 20  ble.** is true. 
0690: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
06a0: 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f 6e 6e  me stdin is conn
06b0: 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c 65 20  ected to a file 
06c0: 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74 61 74  or pipe..*/.stat
06d0: 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69 73 5f  ic int stdin_is_
06e0: 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 31 3b  interactive = 1;
06f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0700: 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65  owing is the ope
0710: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
0720: 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f  e.  We make a po
0730: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  inter.** to this
0740: 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61 74   database a stat
0750: 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74  ic variable so t
0760: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61 63  hat it can be ac
0770: 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  cessed.** by the
0780: 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20   SIGINT handler 
0790: 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61 74  to interrupt dat
07a0: 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67  abase processing
07b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
07c0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 2f 2a  te3 *db = 0;../*
07d0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
07e0: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
07f0: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
0800: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
0810: 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73  c volatile int s
0820: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
0830: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
0840: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72   the name of our
0850: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
0860: 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75  set in main(), u
0870: 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62  sed.** in a numb
0880: 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63  er of other plac
0890: 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65  es, mostly for e
08a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
08b0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 41  /.static char *A
08c0: 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rgv0;../*.** Pro
08d0: 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69  mpt strings. Ini
08e0: 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e  tialized in main
08f0: 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a  . Settable with.
0900: 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69  **   .prompt mai
0910: 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74  n continue.*/.st
0920: 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72  atic char mainPr
0930: 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a  ompt[20];     /*
0940: 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d   First line prom
0950: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71  pt. default: "sq
0960: 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63  lite> "*/.static
0970: 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72   char continuePr
0980: 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e  ompt[20]; /* Con
0990: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
09a0: 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e  . default: "   .
09b0: 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ..> " */../*.** 
09c0: 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63 65 73  Write I/O traces
09d0: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
09e0: 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 73 74 61  g stream..*/.sta
09f0: 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63  tic FILE *iotrac
0a00: 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  e = 0;../*.** Th
0a10: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
0a20: 20 6c 69 6b 65 20 70 72 69 6e 74 66 20 69 6e 20   like printf in 
0a30: 74 68 61 74 20 69 74 73 20 66 69 72 73 74 20 61  that its first a
0a40: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
0a50: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e  format string an
0a60: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  d subsequent arg
0a70: 75 6d 65 6e 74 73 20 61 72 65 20 76 61 6c 75 65  uments are value
0a80: 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  s to be substitu
0a90: 74 65 64 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20  ted.** in place 
0aa0: 6f 66 20 25 20 66 69 65 6c 64 73 2e 20 20 54 68  of % fields.  Th
0ab0: 65 20 72 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d  e result of form
0ac0: 61 74 74 69 6e 67 20 74 68 69 73 20 73 74 72 69  atting this stri
0ad0: 6e 67 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e  ng.** is written
0ae0: 20 74 6f 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a   to iotrace..*/.
0af0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f 74 72  static void iotr
0b00: 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74 20  acePrintf(const 
0b10: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0b20: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0b30: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
0b40: 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29  if( iotrace==0 )
0b50: 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74   return;.  va_st
0b60: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
0b70: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
0b80: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
0b90: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
0ba0: 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 69  ap);.  fprintf(i
0bb0: 6f 74 72 61 63 65 2c 20 22 25 73 22 2c 20 7a 29  otrace, "%s", z)
0bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
0bd0: 28 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  (z);.}.../*.** D
0be0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
0bf0: 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65  tring is a numbe
0c00: 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  r of not..*/.sta
0c10: 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72  tic int isNumber
0c20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
0c30: 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20  int *realnum){. 
0c40: 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20   if( *z=='-' || 
0c50: 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20  *z=='+' ) z++;. 
0c60: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a   if( !isdigit(*z
0c70: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
0c80: 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20  0;.  }.  z++;.  
0c90: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
0ca0: 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68  ealnum = 0;.  wh
0cb0: 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29  ile( isdigit(*z)
0cc0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28   ){ z++; }.  if(
0cd0: 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20   *z=='.' ){.    
0ce0: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73  z++;.    if( !is
0cf0: 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75  digit(*z) ) retu
0d00: 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
0d10: 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20   isdigit(*z) ){ 
0d20: 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72  z++; }.    if( r
0d30: 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75  ealnum ) *realnu
0d40: 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  m = 1;.  }.  if(
0d50: 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d   *z=='e' || *z==
0d60: 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a  'E' ){.    z++;.
0d70: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20      if( *z=='+' 
0d80: 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b  || *z=='-' ) z++
0d90: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69 67  ;.    if( !isdig
0da0: 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  it(*z) ) return 
0db0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  0;.    while( is
0dc0: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
0dd0: 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c  ; }.    if( real
0de0: 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d  num ) *realnum =
0df0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
0e00: 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   *z==0;.}../*.**
0e10: 20 41 20 67 6c 6f 62 61 6c 20 63 68 61 72 2a 20   A global char* 
0e20: 61 6e 64 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  and an SQL funct
0e30: 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20 69 74  ion to access it
0e40: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
0e50: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
0e60: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
0e70: 2e 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 75  . This program u
0e80: 73 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 0a  sed to use the .
0e90: 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 70  ** sqlite_exec_p
0ea0: 72 69 6e 74 66 28 29 20 41 50 49 20 74 6f 20 73  rintf() API to s
0eb0: 75 62 73 74 69 74 75 65 20 61 20 73 74 72 69 6e  ubstitue a strin
0ec0: 67 20 69 6e 74 6f 20 61 6e 20 53 51 4c 20 73 74  g into an SQL st
0ed0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  atement..** The 
0ee0: 63 6f 72 72 65 63 74 20 77 61 79 20 74 6f 20 64  correct way to d
0ef0: 6f 20 74 68 69 73 20 77 69 74 68 20 73 71 6c 69  o this with sqli
0f00: 74 65 33 20 69 73 20 74 6f 20 75 73 65 20 74 68  te3 is to use th
0f10: 65 20 62 69 6e 64 20 41 50 49 2c 20 62 75 74 0a  e bind API, but.
0f20: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73 68 65  ** since the she
0f30: 6c 6c 20 69 73 20 62 75 69 6c 74 20 61 72 6f 75  ll is built arou
0f40: 6e 64 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  nd the callback 
0f50: 70 61 72 61 64 69 67 6d 20 69 74 20 77 6f 75 6c  paradigm it woul
0f60: 64 20 62 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  d be a lot.** of
0f70: 20 77 6f 72 6b 2e 20 49 6e 73 74 65 61 64 20 6a   work. Instead j
0f80: 75 73 74 20 75 73 65 20 74 68 69 73 20 68 61 63  ust use this hac
0f90: 6b 2c 20 77 68 69 63 68 20 69 73 20 71 75 69 74  k, which is quit
0fa0: 65 20 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f 0a 73  e harmless..*/.s
0fb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
0fc0: 20 2a 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d   *zShellStatic =
0fd0: 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20   0;.static void 
0fe0: 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e 63 28  shellstaticFunc(
0ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1000: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1010: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1030: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  ){.  assert( 0==
1040: 61 72 67 63 20 29 3b 0a 20 20 61 73 73 65 72 74  argc );.  assert
1050: 28 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 29  ( zShellStatic )
1060: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1070: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1080: 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d   zShellStatic, -
1090: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
10a0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
10b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
10c0: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
10d0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
10e0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
10f0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1100: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
1110: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
1120: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
1130: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
1140: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
1150: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
1160: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
1170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
1180: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
1190: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
11a0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
11b0: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
11c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
11d0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
11e0: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
11f0: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
1200: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
1210: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ine;.  int n;.  
1220: 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20  int eol;..  if( 
1230: 7a 50 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f  zPrompt && *zPro
1240: 6d 70 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  mpt ){.    print
1250: 66 28 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b  f("%s",zPrompt);
1260: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
1270: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65  ut);.  }.  nLine
1280: 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20   = 100;.  zLine 
1290: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20  = malloc( nLine 
12a0: 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d  );.  if( zLine==
12b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12c0: 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30  n = 0;.  eol = 0
12d0: 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20  ;.  while( !eol 
12e0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
12f0: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
1300: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
1310: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
1320: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
1330: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
1340: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
1350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1360: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
1370: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
1380: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
1390: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
13a0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
13b0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
13c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
13d0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
13e0: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
13f0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1400: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
1410: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b   zLine[n] ){ n++
1420: 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20  ; }.    if( n>0 
1430: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
1440: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d  \n' ){.      n--
1450: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  ;.      zLine[n]
1460: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
1470: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
1480: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
1490: 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a  ( zLine, n+1 );.
14a0: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
14b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
14c0: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
14d0: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
14e0: 2a 0a 2a 2a 20 7a 50 72 69 6f 72 20 69 73 20 61  *.** zPrior is a
14f0: 20 73 74 72 69 6e 67 20 6f 66 20 70 72 69 6f 72   string of prior
1500: 20 74 65 78 74 20 72 65 74 72 69 65 76 65 64 2e   text retrieved.
1510: 20 20 49 66 20 6e 6f 74 20 74 68 65 20 65 6d 70    If not the emp
1520: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 74 68  ty.** string, th
1530: 65 6e 20 69 73 73 75 65 20 61 20 63 6f 6e 74 69  en issue a conti
1540: 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a  nuation prompt..
1550: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1560: 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 63  one_input_line(c
1570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 69 6f  onst char *zPrio
1580: 72 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  r, FILE *in){.  
1590: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20  char *zPrompt;. 
15a0: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
15b0: 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20    if( in!=0 ){. 
15c0: 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f     return local_
15d0: 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 3b 0a  getline(0, in);.
15e0: 20 20 7d 0a 20 20 69 66 28 20 7a 50 72 69 6f 72    }.  if( zPrior
15f0: 20 26 26 20 7a 50 72 69 6f 72 5b 30 5d 20 29 7b   && zPrior[0] ){
1600: 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 63  .    zPrompt = c
1610: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 3b 0a 20  ontinuePrompt;. 
1620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
1630: 6d 70 74 20 3d 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt = mainPrompt
1640: 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20  ;.  }.  zResult 
1650: 3d 20 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d  = readline(zProm
1660: 70 74 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  pt);.#if defined
1670: 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20  (HAVE_READLINE) 
1680: 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  && HAVE_READLINE
1690: 3d 3d 31 0a 20 20 69 66 28 20 7a 52 65 73 75 6c  ==1.  if( zResul
16a0: 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20  t && *zResult ) 
16b0: 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52 65 73  add_history(zRes
16c0: 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ult);.#endif.  r
16d0: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
16e0: 0a 0a 73 74 72 75 63 74 20 70 72 65 76 69 6f 75  ..struct previou
16f0: 73 5f 6d 6f 64 65 5f 64 61 74 61 20 7b 0a 20 20  s_mode_data {.  
1700: 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20  int valid;      
1710: 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65    /* Is there le
1720: 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65  git data in here
1730: 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b  ? */.  int mode;
1740: 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65  .  int showHeade
1750: 72 3b 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  r;.  int colWidt
1760: 68 5b 31 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  h[100];.};../*.*
1770: 2a 20 41 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20  * An pointer to 
1780: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1790: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
17a0: 20 70 61 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20   passed from.** 
17b0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
17c0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
17d0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
17e0: 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 0a 2a  to communicate.*
17f0: 2a 20 73 74 61 74 65 20 61 6e 64 20 6d 6f 64 65  * state and mode
1800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
1810: 0a 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  .struct callback
1820: 5f 64 61 74 61 20 7b 0a 20 20 73 71 6c 69 74 65  _data {.  sqlite
1830: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1840: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1850: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f  e */.  int echoO
1860: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
1870: 20 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69 6e   True to echo in
1880: 70 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  put commands */.
1890: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18b0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69  er of records di
18c0: 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a  splayed so far *
18d0: 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20  /.  FILE *out;  
18e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18f0: 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
1900: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
1930: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
1940: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
1950: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
1960: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
1970: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
1980: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
1990: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
19a0: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
19b0: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
19c0: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 63 68 61  mn mode */.  cha
19d0: 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20  r *zDestTable;  
19e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
19f0: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
1a00: 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72   when MODE_Inser
1a10: 74 20 2a 2f 0a 20 20 63 68 61 72 20 73 65 70 61  t */.  char sepa
1a20: 72 61 74 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a  rator[20];    /*
1a30: 20 53 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   Separator chara
1a40: 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69  cter for MODE_Li
1a50: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57  st */.  int colW
1a60: 69 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f  idth[100];     /
1a70: 2a 20 52 65 71 75 65 73 74 65 64 20 77 69 64 74  * Requested widt
1a80: 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  h of each column
1a90: 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20   when in column 
1aa0: 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74  mode*/.  int act
1ab0: 75 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  ualWidth[100];  
1ac0: 2f 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68 20  /* Actual width 
1ad0: 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a  of each column *
1ae0: 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c 76 61 6c  /.  char nullval
1af0: 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68  ue[20];    /* Th
1b00: 65 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74 20  e text to print 
1b10: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
1b20: 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20  s back from.    
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1b50: 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  base */.  struct
1b60: 20 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64   previous_mode_d
1b70: 61 74 61 20 65 78 70 6c 61 69 6e 50 72 65 76 3b  ata explainPrev;
1b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 6c            /* Hol
1ba0: 64 73 20 74 68 65 20 6d 6f 64 65 20 69 6e 66 6f  ds the mode info
1bb0: 72 6d 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  rmation just bef
1bc0: 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1be0: 2e 65 78 70 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20  .explain ON */. 
1bf0: 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49   char outfile[FI
1c00: 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20  LENAME_MAX]; /* 
1c10: 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75  Filename for *ou
1c20: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
1c30: 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20  r *zDbFilename; 
1c40: 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
1c50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c60: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1c70: 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77  se are the allow
1c80: 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  ed modes..*/.#de
1c90: 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20  fine MODE_Line  
1ca0: 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c     0  /* One col
1cb0: 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42  umn per line.  B
1cc0: 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65  lank line betwee
1cd0: 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65  n records */.#de
1ce0: 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  fine MODE_Column
1cf0: 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63     1  /* One rec
1d00: 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20  ord per line in 
1d10: 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  neat columns */.
1d20: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73  #define MODE_Lis
1d30: 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20  t     2  /* One 
1d40: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
1d50: 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72  with a separator
1d60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
1d70: 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20  _Semi     3  /* 
1d80: 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73  Same as MODE_Lis
1d90: 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22  t but append ";"
1da0: 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   to each line */
1db0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74  .#define MODE_Ht
1dc0: 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e  ml     4  /* Gen
1dd0: 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74  erate an XHTML t
1de0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
1df0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20  MODE_Insert   5 
1e00: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c   /* Generate SQL
1e10: 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d   "insert" statem
1e20: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
1e30: 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20 20 36 20  MODE_Tcl      6 
1e40: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 41 4e 53   /* Generate ANS
1e50: 49 2d 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 65  I-C or TCL quote
1e60: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  d elements */.#d
1e70: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20  efine MODE_Csv  
1e80: 20 20 20 20 37 20 20 2f 2a 20 51 75 6f 74 65 20      7  /* Quote 
1e90: 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73  strings, numbers
1ea0: 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64   are plain */.#d
1eb0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4e 55 4d 5f 4f  efine MODE_NUM_O
1ec0: 46 20 20 20 38 20 20 2f 2a 20 54 68 65 20 6e 75  F   8  /* The nu
1ed0: 6d 62 65 72 20 6f 66 20 6d 6f 64 65 73 20 28 6e  mber of modes (n
1ee0: 6f 74 20 61 20 6d 6f 64 65 20 69 74 73 65 6c 66  ot a mode itself
1ef0: 29 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  ) */..static con
1f00: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
1f10: 63 72 5b 4d 4f 44 45 5f 4e 55 4d 5f 4f 46 5d 20  cr[MODE_NUM_OF] 
1f20: 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20  = {.  "line",.  
1f30: 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73  "column",.  "lis
1f40: 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20  t",.  "semi",.  
1f50: 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72  "html",.  "inser
1f60: 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  t",.  "tcl",.  "
1f70: 63 73 76 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  csv",.};../*.** 
1f80: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
1f90: 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a  ts in an array.*
1fa0: 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53  /.#define ArrayS
1fb0: 69 7a 65 28 58 29 20 20 28 73 69 7a 65 6f 66 28  ize(X)  (sizeof(
1fc0: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
1fd0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
1fe0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
1ff0: 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  as a quoted stri
2000: 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f  ng using SQL quo
2010: 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ting conventions
2020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2030: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
2040: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
2050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
2060: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2070: 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20 20 66  nSingle = 0;.  f
2080: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
2090: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
20a0: 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67 6c 65  =='\'' ) nSingle
20b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53  ++;.  }.  if( nS
20c0: 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ingle==0 ){.    
20d0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  fprintf(out,"'%s
20e0: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
20f0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
2100: 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  "'");.    while(
2110: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   *z ){.      for
2120: 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b  (i=0; z[i] && z[
2130: 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d  i]!='\''; i++){}
2140: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20  .      if( i==0 
2150: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
2160: 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a 20 20  tf(out,"''");.  
2170: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
2180: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
2190: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
21a0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
21b0: 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20 20 20  *s''",i,z);.    
21c0: 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20      z += i+1;.  
21d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21f0: 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20  %s",z);.        
2200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2210: 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
2220: 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d 0a 7d  (out,"'");.  }.}
2230: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
2240: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
2250: 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f  as a quoted acco
2260: 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43  rding to C or TC
2270: 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e  L quoting rules.
2280: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2290: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
22a0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
22b0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73   char *z){.  uns
22c0: 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66  igned int c;.  f
22d0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
22e0: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28    while( (c = *(
22f0: 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  z++))!=0 ){.    
2300: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
2310: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
2320: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
2330: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  c, out);.    }el
2340: 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29  se if( c=='\t' )
2350: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
2360: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
2370: 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b  fputc('t', out);
2380: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2390: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
23a0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
23b0: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e  ;.      fputc('n
23c0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
23d0: 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29  se if( c=='\r' )
23e0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
23f0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
2400: 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b  fputc('r', out);
2410: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
2420: 69 73 70 72 69 6e 74 28 63 29 20 29 7b 0a 20 20  isprint(c) ){.  
2430: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
2440: 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66   "\\%03o", c&0xf
2450: 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2460: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
2470: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2480: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
2490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
24a0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
24b0: 67 20 77 69 74 68 20 63 68 61 72 61 63 74 65 72  g with character
24c0: 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
24d0: 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73  al to.** HTML es
24e0: 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  caped..*/.static
24f0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d   void output_htm
2500: 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  l_string(FILE *o
2510: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
2520: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 77  z){.  int i;.  w
2530: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
2540: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26  for(i=0; z[i] &&
2550: 20 7a 5b 69 5d 21 3d 27 3c 27 20 26 26 20 7a 5b   z[i]!='<' && z[
2560: 69 5d 21 3d 27 26 27 3b 20 69 2b 2b 29 7b 7d 0a  i]!='&'; i++){}.
2570: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
2580: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
2590: 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20  ,"%.*s",i,z);.  
25a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
25b0: 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 66  =='<' ){.      f
25c0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b  printf(out,"&lt;
25d0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
25e0: 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20  ( z[i]=='&' ){. 
25f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
2600: 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d  ,"&amp;");.    }
2610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
2620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b  k;.    }.    z +
2630: 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  = i + 1;.  }.}..
2640: 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64  /*.** If a field
2650: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68   contains any ch
2660: 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66 69  aracter identifi
2670: 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68 65  ed by a 1 in the
2680: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72   following.** ar
2690: 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ray, then the st
26a0: 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f  ring must be quo
26b0: 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a  ted for CSV..*/.
26c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
26d0: 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d  r needCsvQuote[]
26e0: 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20   = {.  1, 1, 1, 
26f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
2700: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2710: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
2720: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2730: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
2740: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2750: 20 20 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c    .  1, 0, 1, 0,
2760: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30   0, 0, 0, 1,   0
2770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2780: 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20   0, 0, .  0, 0, 
2790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
27a0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
27b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30  0, 0, 0, 0, .  0
27c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
27d0: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
27e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
27f0: 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   .  0, 0, 0, 0, 
2800: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
2810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2820: 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30  0, 0, .  0, 0, 0
2830: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2840: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
2850: 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c  , 0, 0, 0, .  0,
2860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2870: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
2880: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
2890: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
28a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
28b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
28c0: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
28d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
28e0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
28f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
2900: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2910: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
2920: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2930: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
2940: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2950: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
2960: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31   1, 1, 1,   .  1
2970: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2980: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
2990: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
29a0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
29b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
29c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
29d0: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
29e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
29f0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
2a00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
2a10: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
2a20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
2a30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2a40: 31 2c 20 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a  1, 1,   .};../*.
2a50: 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67  ** Output a sing
2a60: 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20  le term of CSV. 
2a70: 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65   Actually, p->se
2a80: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
2a90: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
2aa0: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
2ab0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
2ac0: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76  comma.  p->nullv
2ad0: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
2ae0: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
2af0: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 75  ngs are quoted u
2b00: 73 69 6e 67 20 41 4e 53 49 2d 43 20 72 75 6c 65  sing ANSI-C rule
2b10: 73 2e 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61  s.  Numbers.** a
2b20: 70 70 65 61 72 20 6f 75 74 73 69 64 65 20 6f 66  ppear outside of
2b30: 20 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74   quotes..*/.stat
2b40: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
2b50: 73 76 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61  sv(struct callba
2b60: 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73  ck_data *p, cons
2b70: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62  t char *z, int b
2b80: 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  Sep){.  FILE *ou
2b90: 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66  t = p->out;.  if
2ba0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( z==0 ){.    fp
2bb0: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
2bc0: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
2bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
2be0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
2bf0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
2c00: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
2c10: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
2c20: 72 2a 29 7a 29 5b 69 5d 5d 20 29 7b 0a 20 20 20  r*)z)[i]] ){.   
2c30: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
2c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c50: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c60: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70   i==0 ){.      p
2c70: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
2c80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
2c90: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
2ca0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20    if( z[i]=='"' 
2cb0: 29 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29  ) putc('"', out)
2cc0: 3b 0a 20 20 20 20 20 20 20 20 70 75 74 63 28 7a  ;.        putc(z
2cd0: 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  [i], out);.     
2ce0: 20 7d 0a 20 20 20 20 20 20 70 75 74 63 28 27 22   }.      putc('"
2cf0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
2d00: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
2d10: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  f(out, "%s", z);
2d20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2d30: 20 62 53 65 70 20 29 7b 0a 20 20 20 20 66 70 72   bSep ){.    fpr
2d40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  intf(p->out, p->
2d50: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a  separator);.  }.
2d60: 7d 0a 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54  }..#ifdef SIGINT
2d70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d80: 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68  ine runs when th
2d90: 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43  e user presses C
2da0: 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20  trl-C.*/.static 
2db0: 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68  void interrupt_h
2dc0: 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73  andler(int NotUs
2dd0: 65 64 29 7b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed){.  seenInter
2de0: 72 75 70 74 20 3d 20 31 3b 0a 20 20 69 66 28 20  rupt = 1;.  if( 
2df0: 64 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74  db ) sqlite3_int
2e00: 65 72 72 75 70 74 28 64 62 29 3b 0a 7d 0a 23 65  errupt(db);.}.#e
2e10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
2e20: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
2e30: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
2e40: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2e50: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
2e60: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
2e70: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
2e80: 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61  tatic int callba
2e90: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
2ea0: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
2eb0: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
2ec0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
2ed0: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
2ee0: 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75  _data *p = (stru
2ef0: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
2f00: 2a 29 70 41 72 67 3b 0a 20 20 73 77 69 74 63 68  *)pArg;.  switch
2f10: 28 20 70 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20 20  ( p->mode ){.   
2f20: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a   case MODE_Line:
2f30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d   {.      int w =
2f40: 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a   5;.      if( az
2f50: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
2f60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2f70: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2f80: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
2f90: 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 20 3f  trlen(azCol[i] ?
2fa0: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
2fb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
2fc0: 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20  >w ) w = len;.  
2fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fe0: 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 66 70 72  p->cnt++>0 ) fpr
2ff0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
3000: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
3010: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
3020: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
3030: 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73  p->out,"%*s = %s
3040: 5c 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  \n", w, azCol[i]
3050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3060: 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41    azArg[i] ? azA
3070: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76  rg[i] : p->nullv
3080: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  alue);.      }. 
3090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30a0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
30b0: 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20  Column: {.      
30c0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
30d0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
30e0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
30f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
3100: 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  w, n;.          
3110: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
3120: 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a  p->colWidth) ){.
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
3140: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b   p->colWidth[i];
3150: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
3160: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 77  {.             w
3170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
3180: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
3190: 77 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w<=0 ){.        
31a0: 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 28 61      w = strlen(a
31b0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
31c0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
31d0: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
31e0: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
31f0: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
3200: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
3210: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
3220: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
3230: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
3240: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
3250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3260: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
3270: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
3280: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3290: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
32a0: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
32b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
32c0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
32d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
32e0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
32f0: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a 43 6f  *.*s%s",w,w,azCo
3300: 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  l[i], i==nArg-1 
3310: 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20  ? "\n": "  ");. 
3320: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
3340: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
3350: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
3360: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
3370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
3380: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
3390: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
33a0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
33b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
33c0: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
33d0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
33e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
3400: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
3410: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
3420: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
3430: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22 2d 2d  -*.*s%s",w,w,"--
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
3470: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
34c0: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
34d0: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
34e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3500: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
3510: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
3520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
3530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3540: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69  int w;.        i
3550: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
3560: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
3570: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
3580: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
3590: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
35a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  e{.           w 
35b0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
35c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
35d0: 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73  p->out,"%-*.*s%s
35e0: 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20  ",w,w,.         
35f0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
3600: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
3610: 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67 2d 31  value, i==nArg-1
3620: 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a   ? "\n": "  ");.
3630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
3640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3650: 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 0a 20  ase MODE_Semi:. 
3660: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73     case MODE_Lis
3670: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
3680: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
3690: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
36a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
36b0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
36c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
36d0: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a  p->out,"%s%s",az
36e0: 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d  Col[i], i==nArg-
36f0: 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d 3e 73 65  1 ? "\n" : p->se
3700: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
3710: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3720: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
3730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
3740: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
3750: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3760: 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
3770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
3780: 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 76  0 ) z = p->nullv
3790: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 66 70  alue;.        fp
37a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
37b0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
37c0: 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a  if( i<nArg-1 ){.
37d0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
37e0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
37f0: 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20  p->separator);. 
3800: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
3810: 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 53   p->mode==MODE_S
3820: 65 6d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 20  emi ){.         
3830: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
3840: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20   ";\n");.       
3850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3860: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3870: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  , "\n");.       
3880: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
38a0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c    case MODE_Html
38b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
38c0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
38d0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
38e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
38f0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
3900: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3910: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
3920: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
3930: 2d 3e 6f 75 74 2c 22 3c 54 48 3e 25 73 3c 2f 54  ->out,"<TH>%s</T
3940: 48 3e 22 2c 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  H>",azCol[i]);. 
3950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3960: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
3970: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
3980: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
3990: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
39a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
39b0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
39c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
39d0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
39e0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
39f0: 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20  t,"<TD>");.     
3a00: 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73     output_html_s
3a10: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
3a20: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
3a30: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  ] : p->nullvalue
3a40: 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
3a50: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e  tf(p->out,"</TD>
3a60: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
3a70: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3a80: 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20  ut,"</TR>\n");. 
3a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3aa0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
3ab0: 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Tcl: {.      if(
3ac0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
3ad0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
3ae0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
3af0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
3b00: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
3b10: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
3b20: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
3b30: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
3b40: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
3b50: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
3b60: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
3b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
3b80: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
3b90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ba0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
3bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
3bc0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
3bd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70  +){.        outp
3be0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
3bf0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
3c00: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
3c10: 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lvalue);.       
3c20: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
3c30: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
3c40: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
3c50: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3c60: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
3c70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3c80: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
3c90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
3ca0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
3cb0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
3cc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3cd0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
3ce0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
3cf0: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
3d00: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
3d10: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
3d20: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
3d30: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
3d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3d50: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
3d60: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
3d70: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
3d80: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
3d90: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
3da0: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
3db0: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
3dc0: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
3dd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3de0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
3df0: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
3e00: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
3e10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72  break;.      fpr
3e20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53  intf(p->out,"INS
3e30: 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55  ERT INTO %s VALU
3e40: 45 53 28 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62  ES(",p->zDestTab
3e50: 6c 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  le);.      for(i
3e60: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
3e70: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3e80: 7a 53 65 70 20 3d 20 69 3e 30 20 3f 20 22 2c 22  zSep = i>0 ? ","
3e90: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
3ea0: 28 20 61 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 7b  ( azArg[i]==0 ){
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
3ec0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c  tf(p->out,"%sNUL
3ed0: 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  L",zSep);.      
3ee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
3ef0: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
3f00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
3f10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
3f20: 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72 67  s%s",zSep, azArg
3f30: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
3f40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
3f50: 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72  f( zSep[0] ) fpr
3f60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
3f70: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
3f80: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
3f90: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
3fa0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
3fb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3fc0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3fd0: 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ,");\n");.      
3fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3ff0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4000: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
4010: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
4020: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 61 6c  field of the cal
4030: 6c 62 61 63 6b 5f 64 61 74 61 20 73 74 72 75 63  lback_data struc
4040: 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ture to.** the n
4050: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
4060: 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20   given.  Escape 
4070: 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61 63  any quote charac
4080: 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ters in the.** t
4090: 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  able name..*/.st
40a0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61  atic void set_ta
40b0: 62 6c 65 5f 6e 61 6d 65 28 73 74 72 75 63 74 20  ble_name(struct 
40c0: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
40d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
40e0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  ame){.  int i, n
40f0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
4100: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
4110: 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62   if( p->zDestTab
4120: 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  le ){.    free(p
4130: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
4140: 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
4150: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
4160: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
4170: 6e 3b 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d  n;.  needQuote =
4180: 20 21 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67   !isalpha((unsig
4190: 6e 65 64 20 63 68 61 72 29 2a 7a 4e 61 6d 65 29  ned char)*zName)
41a0: 20 26 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b   && *zName!='_';
41b0: 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e  .  for(i=n=0; zN
41c0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b  ame[i]; i++, n++
41d0: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
41e0: 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68  num((unsigned ch
41f0: 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20  ar)zName[i]) && 
4200: 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 7b  zName[i]!='_' ){
4210: 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65  .      needQuote
4220: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
4230: 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29  zName[i]=='\'' )
4240: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
4250: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
4260: 29 20 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20  ) n += 2;.  z = 
4270: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
4280: 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  malloc( n+1 );. 
4290: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
42a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
42b0: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c  "Out of memory!\
42c0: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
42d0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20  ;.  }.  n = 0;. 
42e0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
42f0: 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[n++] = '\'';.
4300: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
4310: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  [i]; i++){.    z
4320: 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d  [n++] = zName[i]
4330: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b  ;.    if( zName[
4340: 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 6e 2b 2b  i]=='\'' ) z[n++
4350: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
4360: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
4370: 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[n++] = '\'';. 
4380: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[n] = 0;.}../*
4390: 20 7a 49 6e 20 69 73 20 65 69 74 68 65 72 20 61   zIn is either a
43a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55   pointer to a NU
43b0: 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  LL-terminated st
43c0: 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ring in memory o
43d0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
43e0: 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e  malloc(), or a N
43f0: 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65  ULL pointer. The
4400: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
4410: 74 6f 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73  to by zAppend is
4420: 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e  .** added to zIn
4430: 2c 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  , and the result
4440: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d   returned in mem
4450: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4460: 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a  m malloc()..** z
4470: 49 6e 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f  In, if it was no
4480: 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64  t NULL, is freed
4490: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
44a0: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71  hird argument, q
44b0: 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30  uote, is not '\0
44c0: 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20 75 73  ', then it is us
44d0: 65 64 20 61 73 20 61 20 0a 2a 2a 20 71 75 6f 74  ed as a .** quot
44e0: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  e character for 
44f0: 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  zAppend..*/.stat
4500: 69 63 20 63 68 61 72 20 2a 61 70 70 65 6e 64 54  ic char *appendT
4510: 65 78 74 28 63 68 61 72 20 2a 7a 49 6e 2c 20 63  ext(char *zIn, c
4520: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65  har const *zAppe
4530: 6e 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b  nd, char quote){
4540: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
4550: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65  t i;.  int nAppe
4560: 6e 64 20 3d 20 73 74 72 6c 65 6e 28 7a 41 70 70  nd = strlen(zApp
4570: 65 6e 64 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20  end);.  int nIn 
4580: 3d 20 28 7a 49 6e 3f 73 74 72 6c 65 6e 28 7a 49  = (zIn?strlen(zI
4590: 6e 29 3a 30 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  n):0);..  len = 
45a0: 6e 41 70 70 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20  nAppend+nIn+1;. 
45b0: 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20   if( quote ){.  
45c0: 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20    len += 2;.    
45d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65  for(i=0; i<nAppe
45e0: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; i++){.      
45f0: 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d  if( zAppend[i]==
4600: 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20  quote ) len++;. 
4610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20     }.  }..  zIn 
4620: 3d 20 28 63 68 61 72 20 2a 29 72 65 61 6c 6c 6f  = (char *)reallo
4630: 63 28 7a 49 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69  c(zIn, len);.  i
4640: 66 28 20 21 7a 49 6e 20 29 7b 0a 20 20 20 20 72  f( !zIn ){.    r
4650: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
4660: 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20  if( quote ){.   
4670: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 26 7a   char *zCsr = &z
4680: 49 6e 5b 6e 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43  In[nIn];.    *zC
4690: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
46a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70    for(i=0; i<nAp
46b0: 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pend; i++){.    
46c0: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70    *zCsr++ = zApp
46d0: 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  end[i];.      if
46e0: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
46f0: 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  ote ) *zCsr++ = 
4700: 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  quote;.    }.   
4710: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
4720: 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20  ;.    *zCsr++ = 
4730: 27 5c 30 27 3b 0a 20 20 20 20 61 73 73 65 72 74  '\0';.    assert
4740: 28 20 28 7a 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65  ( (zCsr-zIn)==le
4750: 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
4760: 20 20 6d 65 6d 63 70 79 28 26 7a 49 6e 5b 6e 49    memcpy(&zIn[nI
4770: 6e 5d 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70  n], zAppend, nAp
4780: 70 65 6e 64 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c  pend);.    zIn[l
4790: 65 6e 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en-1] = '\0';.  
47a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b  }..  return zIn;
47b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
47c0: 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
47d0: 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 20  ment that has a 
47e0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
47f0: 6c 75 6d 6e 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  lumn.  Print.** 
4800: 74 68 61 74 20 72 65 73 75 6c 74 20 63 6f 6c 75  that result colu
4810: 6d 6e 20 6f 6e 20 61 20 6c 69 6e 65 20 62 79 20  mn on a line by 
4820: 69 74 73 65 6c 66 20 77 69 74 68 20 61 20 73 65  itself with a se
4830: 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
4840: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  or..**.** This i
4850: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
4860: 70 6c 65 2c 20 74 6f 20 73 68 6f 77 20 74 68 65  ple, to show the
4870: 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 64   schema of the d
4880: 61 74 61 62 61 73 65 20 62 79 0a 2a 2a 20 71 75  atabase by.** qu
4890: 65 72 79 69 6e 67 20 74 68 65 20 53 51 4c 49 54  erying the SQLIT
48a0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 0a  E_MASTER table..
48b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
48c0: 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
48d0: 72 79 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71  ry(FILE *out, sq
48e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
48f0: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 29 7b   char *zSelect){
4900: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4910: 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  *pSelect;.  int 
4920: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
4930: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
4940: 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65  Select, -1, &pSe
4950: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
4960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
4970: 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20   !pSelect ){.   
4980: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
4990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
49a0: 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  tep(pSelect);.  
49b0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
49c0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 70 72  E_ROW ){.    fpr
49d0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e  intf(out, "%s;\n
49e0: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
49f0: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
4a00: 30 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0));.    rc = sq
4a10: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
4a20: 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ct);.  }.  retur
4a30: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
4a40: 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  ze(pSelect);.}..
4a50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
4a60: 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
4a70: 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ack routine used
4a80: 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65   for dumping the
4a90: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61   database..** Ea
4aa0: 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20  ch row received 
4ab0: 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  by this callback
4ac0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74   consists of a t
4ad0: 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  able name,.** th
4ae0: 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69  e table type ("i
4af0: 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22  ndex" or "table"
4b00: 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65  ) and SQL to cre
4b10: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
4b20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
4b30: 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74  hould print text
4b40: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72   sufficient to r
4b50: 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c  ecreate the tabl
4b60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4b70: 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76   dump_callback(v
4b80: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
4b90: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
4ba0: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  g, char **azCol)
4bb0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  {.  int rc;.  co
4bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
4bd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4be0: 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zType;.  const c
4bf0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 74 72  har *zSql;.  str
4c00: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
4c10: 61 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63  a *p = (struct c
4c20: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29 70  allback_data *)p
4c30: 41 72 67 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  Arg;..  if( nArg
4c40: 21 3d 33 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  !=3 ) return 1;.
4c50: 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
4c60: 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
4c70: 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
4c80: 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a 20  = azArg[2];.  . 
4c90: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
4ca0: 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
4cb0: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
4cc0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4cd0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
4ce0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
4cf0: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
4d00: 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  strcmp(zTable, "
4d10: 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d  sqlite_stat1")==
4d20: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
4d30: 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
4d40: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
4d50: 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
4d60: 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65  ( strncmp(zTable
4d70: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
4d80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4d90: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4da0: 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43  strncmp(zSql, "C
4db0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4dc0: 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a  BLE", 20)==0 ){.
4dd0: 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a      char *zIns;.
4de0: 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74      if( !p->writ
4df0: 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
4e00: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
4e10: 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
4e20: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
4e30: 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
4e40: 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
4e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
4e60: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4e70: 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
4e80: 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
4e90: 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
4ea0: 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
4eb0: 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
4ec0: 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
4ed0: 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
4ee0: 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
4ef0: 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
4f00: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
4f10: 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49  >out, "%s\n", zI
4f20: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
4f30: 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20  _free(zIns);.   
4f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
4f50: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
4f60: 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  p->out, "%s;\n",
4f70: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69   zSql);.  }..  i
4f80: 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  f( strcmp(zType,
4f90: 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a   "table")==0 ){.
4fa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4fb0: 20 2a 70 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30   *pTableInfo = 0
4fc0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6c  ;.    char *zSel
4fd0: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ect = 0;.    cha
4fe0: 72 20 2a 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20  r *zTableInfo = 
4ff0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 6d  0;.    char *zTm
5000: 70 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a  p = 0;.   .    z
5010: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
5020: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
5030: 6f 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  o, "PRAGMA table
5040: 5f 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20  _info(", 0);.   
5050: 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70   zTableInfo = ap
5060: 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49  pendText(zTableI
5070: 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  nfo, zTable, '"'
5080: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
5090: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
50a0: 54 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c  TableInfo, ");",
50b0: 20 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73   0);..    rc = s
50c0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
50d0: 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f  ->db, zTableInfo
50e0: 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e 66  , -1, &pTableInf
50f0: 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  o, 0);.    if( z
5100: 54 61 62 6c 65 49 6e 66 6f 20 29 20 66 72 65 65  TableInfo ) free
5110: 28 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20  (zTableInfo);.  
5120: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5130: 5f 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e  _OK || !pTableIn
5140: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  fo ){.      retu
5150: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
5160: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
5170: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
5180: 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49  SELECT 'INSERT I
5190: 4e 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a  NTO ' || ", 0);.
51a0: 20 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e      zTmp = appen
51b0: 64 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62  dText(zTmp, zTab
51c0: 6c 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66  le, '"');.    if
51d0: 28 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20  ( zTmp ){.      
51e0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
51f0: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
5200: 6d 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 7d  mp, '\'');.    }
5210: 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61  .    zSelect = a
5220: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
5230: 74 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45 53  t, " || ' VALUES
5240: 28 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20  (' || ", 0);.   
5250: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
5260: 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a  ep(pTableInfo);.
5270: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
5280: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
5290: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
52a0: 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
52b0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
52c0: 75 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65 49  umn_text(pTableI
52d0: 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a  nfo, 1);.      z
52e0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
52f0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71 75  ext(zSelect, "qu
5300: 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  ote(", 0);.     
5310: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
5320: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a  dText(zSelect, z
5330: 54 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20 20  Text, '"');.    
5340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
5350: 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  tep(pTableInfo);
5360: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5370: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
5380: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
5390: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
53a0: 74 2c 20 22 29 20 7c 7c 20 27 2c 27 20 7c 7c 20  t, ") || ',' || 
53b0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
53c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c  se{.        zSel
53d0: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
53e0: 28 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c 20  (zSelect, ") ", 
53f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5400: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
5410: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61 62  e3_finalize(pTab
5420: 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  leInfo);.    if(
5430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5440: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65 6c  {.      if( zSel
5450: 65 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c 65  ect ) free(zSele
5460: 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ct);.      retur
5470: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  n 1;.    }.    z
5480: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
5490: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c 7c  ext(zSelect, "||
54a0: 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20 30 29   ')' FROM  ", 0)
54b0: 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  ;.    zSelect = 
54c0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
54d0: 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29  ct, zTable, '"')
54e0: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75 6e 5f  ;..    rc = run_
54f0: 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
5500: 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 20  (p->out, p->db, 
5510: 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  zSelect);.    if
5520: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
5530: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a 53  RUPT ){.      zS
5540: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
5550: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f 52  xt(zSelect, " OR
5560: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
5570: 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  C", 0);.      rc
5580: 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d   = run_table_dum
5590: 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20  p_query(p->out, 
55a0: 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 29 3b  p->db, zSelect);
55b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
55c0: 53 65 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53  Select ) free(zS
55d0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65  elect);.  }.  re
55e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
55f0: 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
5600: 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
5610: 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
5620: 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
5630: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
5640: 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
5650: 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
5660: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
5670: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
5680: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
5690: 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
56a0: 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
56b0: 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
56c0: 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
56d0: 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
56e0: 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
56f0: 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
5700: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
5710: 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f 6e  _data *p, .  con
5720: 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c  st char *zQuery,
5730: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
5740: 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sg.){.  int rc;.
5750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
5760: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  xec(p->db, zQuer
5770: 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  y, dump_callback
5780: 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  , p, pzErrMsg);.
5790: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
57a0: 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
57b0: 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
57c0: 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  nt len = strlen(
57d0: 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 69 66 28  zQuery);.    if(
57e0: 20 70 7a 45 72 72 4d 73 67 20 29 20 73 71 6c 69   pzErrMsg ) sqli
57f0: 74 65 33 5f 66 72 65 65 28 2a 70 7a 45 72 72 4d  te3_free(*pzErrM
5800: 73 67 29 3b 0a 20 20 20 20 7a 51 32 20 3d 20 6d  sg);.    zQ2 = m
5810: 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
5820: 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
5830: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
5840: 20 20 73 70 72 69 6e 74 66 28 7a 51 32 2c 20 22    sprintf(zQ2, "
5850: 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
5860: 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
5870: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
5880: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
5890: 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
58a0: 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b  k, p, pzErrMsg);
58b0: 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
58c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
58d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
58e0: 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
58f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
5900: 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 62 61  zHelp[] =.  ".ba
5910: 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  il ON|OFF       
5920: 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68      Stop after h
5930: 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  itting an error.
5940: 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22    Default OFF\n"
5950: 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20  .  ".databases  
5960: 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
5970: 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
5980: 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
5990: 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 75 6d  bases\n".  ".dum
59a0: 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
59b0: 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61     Dump the data
59c0: 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74  base in an SQL t
59d0: 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20  ext format\n".  
59e0: 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46 20 20 20  ".echo ON|OFF   
59f0: 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d          Turn com
5a00: 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20  mand echo on or 
5a10: 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20  off\n".  ".exit 
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
5a40: 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c 61 69  am\n".  ".explai
5a50: 6e 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  n ON|OFF        
5a60: 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  Turn output mode
5a70: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 45 58   suitable for EX
5a80: 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66 66 2e  PLAIN on or off.
5a90: 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 28 73  \n".  ".header(s
5aa0: 29 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 54 75  ) ON|OFF      Tu
5ab0: 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65  rn display of he
5ac0: 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  aders on or off\
5ad0: 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20 20  n".  ".help     
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
5af0: 77 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e  w this message\n
5b00: 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c  ".  ".import FIL
5b10: 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70 6f  E TABLE     Impo
5b20: 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
5b30: 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a  E into TABLE\n".
5b40: 20 20 22 2e 69 6e 64 69 63 65 73 20 54 41 42 4c    ".indices TABL
5b50: 45 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e  E         Show n
5b60: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69  ames of all indi
5b70: 63 65 73 20 6f 6e 20 54 41 42 4c 45 5c 6e 22 0a  ces on TABLE\n".
5b80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5b90: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
5ba0: 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45  ON.  ".load FILE
5bb0: 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61   ?ENTRY?     Loa
5bc0: 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c  d an extension l
5bd0: 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66  ibrary\n".#endif
5be0: 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f  .  ".mode MODE ?
5bf0: 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f  TABLE?     Set o
5c00: 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65  utput mode where
5c10: 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a   MODE is one of:
5c20: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73  csv      Comma-s
5c50: 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c  eparated values\
5c60: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
5c80: 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
5c90: 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
5ca0: 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20  See .width)\n". 
5cb0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5cc0: 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20             html 
5cd0: 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e      HTML <table>
5ce0: 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   code\n".  "    
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
5d10: 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
5d20: 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22  nts for TABLE\n"
5d30: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
5d50: 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
5d60: 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20  per line\n".  " 
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20          list    
5d90: 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65   Values delimite
5da0: 64 20 62 79 20 2e 73 65 70 61 72 61 74 6f 72 20  d by .separator 
5db0: 73 74 72 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  string\n".  "   
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54        tabs     T
5de0: 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ab-separated val
5df0: 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20     tcl      TCL 
5e20: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22  list elements\n"
5e30: 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53  .  ".nullvalue S
5e40: 54 52 49 4e 47 20 20 20 20 20 20 50 72 69 6e 74  TRING      Print
5e50: 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65   STRING in place
5e60: 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c   of NULL values\
5e70: 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 46 49  n".  ".output FI
5e80: 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 53 65 6e  LENAME       Sen
5e90: 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45  d output to FILE
5ea0: 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70  NAME\n".  ".outp
5eb0: 75 74 20 73 74 64 6f 75 74 20 20 20 20 20 20 20  ut stdout       
5ec0: 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
5ed0: 20 74 68 65 20 73 63 72 65 65 6e 5c 6e 22 0a 20   the screen\n". 
5ee0: 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
5ef0: 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65  ONTINUE  Replace
5f00: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72   the standard pr
5f10: 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69  ompts\n".  ".qui
5f20: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
5f30: 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
5f40: 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64  gram\n".  ".read
5f50: 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
5f60: 20 20 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e    Execute SQL in
5f70: 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22   FILENAME\n".  "
5f80: 2e 73 63 68 65 6d 61 20 3f 54 41 42 4c 45 3f 20  .schema ?TABLE? 
5f90: 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
5fa0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
5fb0: 73 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74  s\n".  ".separat
5fc0: 6f 72 20 53 54 52 49 4e 47 20 20 20 20 20 20 43  or STRING      C
5fd0: 68 61 6e 67 65 20 73 65 70 61 72 61 74 6f 72 20  hange separator 
5fe0: 75 73 65 64 20 62 79 20 6f 75 74 70 75 74 20 6d  used by output m
5ff0: 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c  ode and .import\
6000: 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20  n".  ".show     
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
6020: 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
6030: 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
6040: 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22   settings\n".  "
6050: 2e 74 61 62 6c 65 73 20 3f 50 41 54 54 45 52 4e  .tables ?PATTERN
6060: 3f 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65  ?      List name
6070: 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63  s of tables matc
6080: 68 69 6e 67 20 61 20 4c 49 4b 45 20 70 61 74 74  hing a LIKE patt
6090: 65 72 6e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f  ern\n".  ".timeo
60a0: 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
60b0: 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
60c0: 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
60d0: 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e  S milliseconds\n
60e0: 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 20  ".  ".width NUM 
60f0: 4e 55 4d 20 2e 2e 2e 20 20 20 20 20 53 65 74 20  NUM ...     Set 
6100: 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f  column widths fo
6110: 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64  r \"column\" mod
6120: 65 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f 72 77 61  e\n".;../* Forwa
6130: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
6140: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
6150: 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63 74 20  ss_input(struct 
6160: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
6170: 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a  , FILE *in);../*
6180: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
6190: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
61a0: 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  en.  If it is no
61b0: 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e  t, then open it.
61c0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61    If.** the data
61d0: 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70  base fails to op
61e0: 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72  en, print an err
61f0: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65  or message and e
6200: 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  xit..*/.static v
6210: 6f 69 64 20 6f 70 65 6e 5f 64 62 28 73 74 72 75  oid open_db(stru
6220: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
6230: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
6240: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
6250: 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  te3_open(p->zDbF
6260: 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29  ilename, &p->db)
6270: 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e 64 62  ;.    db = p->db
6280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
6290: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
62a0: 2c 20 22 73 68 65 6c 6c 73 74 61 74 69 63 22 2c  , "shellstatic",
62b0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
62c0: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 68 65 6c   0,.        shel
62d0: 6c 73 74 61 74 69 63 46 75 6e 63 2c 20 30 2c 20  lstaticFunc, 0, 
62e0: 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
62f0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
6300: 72 72 63 6f 64 65 28 64 62 29 20 29 7b 0a 20 20  rrcode(db) ){.  
6310: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
6320: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 6f 70  rr,"Unable to op
6330: 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73  en database \"%s
6340: 5c 22 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20  \": %s\n", .    
6350: 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65        p->zDbFile
6360: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  name, sqlite3_er
6370: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
6380: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
6390: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
63a0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
63b0: 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ON.    sqlite3_e
63c0: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
63d0: 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a  sion(p->db, 1);.
63e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
63f0: 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
6400: 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
6410: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 74 20 20  g..**.**    \t  
6420: 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c    -> tab.**    \
6430: 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a  n    -> newline.
6440: 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63  **    \r    -> c
6450: 61 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a  arriage return.*
6460: 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73  *    \NNN  -> as
6470: 63 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e  cii character NN
6480: 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2a 20 20 20  N in octal.**   
6490: 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c   \\    -> backsl
64a0: 61 73 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ash.*/.static vo
64b0: 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
64c0: 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
64d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a  .  int i, j, c;.
64e0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
64f0: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
6500: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
6510: 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
6520: 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20  c = z[++i];.    
6530: 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a    if( c=='n' ){.
6540: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
6550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6560: 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
6570: 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
6580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6590: 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='r' ){.        
65a0: 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
65b0: 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27  }else if( c>='0'
65c0: 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20   && c<='7' ){.  
65d0: 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a        c -= '0';.
65e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
65f0: 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
6600: 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
6610: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
6620: 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
6630: 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
6640: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6650: 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
6660: 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
6670: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
6680: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
6690: 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
66a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
66b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
66c0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a  }.    z[j] = c;.
66d0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
66e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
66f0: 65 74 20 7a 41 72 67 20 61 73 20 61 20 62 6f 6f  et zArg as a boo
6700: 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
6710: 75 72 6e 20 65 69 74 68 65 72 20 30 20 6f 72 20  urn either 0 or 
6720: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
6730: 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68   booleanValue(ch
6740: 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74  ar *zArg){.  int
6750: 20 76 61 6c 20 3d 20 61 74 6f 69 28 7a 41 72 67   val = atoi(zArg
6760: 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  );.  int j;.  fo
6770: 72 28 6a 3d 30 3b 20 7a 41 72 67 5b 6a 5d 3b 20  r(j=0; zArg[j]; 
6780: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 41 72 67 5b 6a  j++){.    zArg[j
6790: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 41 72 67  ] = tolower(zArg
67a0: 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [j]);.  }.  if( 
67b0: 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 6f 6e 22  strcmp(zArg,"on"
67c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76 61 6c 20  )==0 ){.    val 
67d0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
67e0: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 79 65   strcmp(zArg,"ye
67f0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76 61  s")==0 ){.    va
6800: 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 1;.  }.  ret
6810: 75 72 6e 20 76 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn val;.}../*.*
6820: 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69  * If an input li
6830: 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ne begins with "
6840: 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  ." then invoke t
6850: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  his routine to.*
6860: 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c  * process that l
6870: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
6880: 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
6890: 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
68a0: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
68b0: 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f  tic int do_meta_
68c0: 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c  command(char *zL
68d0: 69 6e 65 2c 20 73 74 72 75 63 74 20 63 61 6c 6c  ine, struct call
68e0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 29 7b 0a 20  back_data *p){. 
68f0: 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20 69 6e   int i = 1;.  in
6900: 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  t nArg = 0;.  in
6910: 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63  t n, c;.  int rc
6920: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a   = 0;.  char *az
6930: 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50  Arg[50];..  /* P
6940: 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c  arse the input l
6950: 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e  ine into tokens.
6960: 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  .  */.  while( z
6970: 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72 67 3c  Line[i] && nArg<
6980: 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29  ArraySize(azArg)
6990: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   ){.    while( i
69a0: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
69b0: 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 20   char)zLine[i]) 
69c0: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ i++; }.    if
69d0: 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30 20 29 20  ( zLine[i]==0 ) 
69e0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a  break;.    if( z
69f0: 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27 20 7c 7c  Line[i]=='\'' ||
6a00: 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22 27 20 29   zLine[i]=='"' )
6a10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69  {.      int deli
6a20: 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b 0a  m = zLine[i++];.
6a30: 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
6a40: 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b  ++] = &zLine[i];
6a50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
6a60: 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[i] && zLine[
6a70: 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 69 2b 2b  i]!=delim ){ i++
6a80: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
6a90: 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d 20 29 7b  ine[i]==delim ){
6aa0: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
6ab0: 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ++] = 0;.      }
6ac0: 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d  .      if( delim
6ad0: 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f  =='"' ) resolve_
6ae0: 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
6af0: 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
6b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41  }else{.      azA
6b10: 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
6b20: 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77 68  ine[i];.      wh
6b30: 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26  ile( zLine[i] &&
6b40: 20 21 69 73 73 70 61 63 65 28 28 75 6e 73 69 67   !isspace((unsig
6b50: 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69  ned char)zLine[i
6b60: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
6b70: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 20     if( zLine[i] 
6b80: 29 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30  ) zLine[i++] = 0
6b90: 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f  ;.      resolve_
6ba0: 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
6bb0: 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
6bc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
6bd0: 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69  ess the input li
6be0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
6bf0: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
6c00: 72 63 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e  rc;.  n = strlen
6c10: 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20  (azArg[0]);.  c 
6c20: 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20  = azArg[0][0];. 
6c30: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
6c40: 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
6c50: 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20  Arg[0], "bail", 
6c60: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20  n)==0 && nArg>1 
6c70: 29 7b 0a 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  ){.    bail_on_e
6c80: 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  rror = booleanVa
6c90: 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
6ca0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
6cb0: 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73  ='d' && n>1 && s
6cc0: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
6cd0: 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29   "databases", n)
6ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
6cf0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
6d00: 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
6d10: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
6d20: 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20   open_db(p);.   
6d30: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
6d40: 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
6d50: 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
6d60: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 64 61  ader = 1;.    da
6d70: 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  ta.mode = MODE_C
6d80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61 74 61 2e  olumn;.    data.
6d90: 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20 33 3b  colWidth[0] = 3;
6da0: 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64  .    data.colWid
6db0: 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20 20 20 20  th[1] = 15;.    
6dc0: 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 32 5d  data.colWidth[2]
6dd0: 20 3d 20 35 38 3b 0a 20 20 20 20 64 61 74 61 2e   = 58;.    data.
6de0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  cnt = 0;.    sql
6df0: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
6e00: 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73   "PRAGMA databas
6e10: 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61 6c 6c 62  e_list; ", callb
6e20: 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
6e30: 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
6e40: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
6e50: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
6e60: 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
6e70: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
6e80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
6e90: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  sg);.    }.  }el
6ea0: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
6eb0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
6ec0: 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
6ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
6ee0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
6ef0: 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20    open_db(p);.  
6f00: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
6f10: 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43  , "BEGIN TRANSAC
6f20: 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  TION;\n");.    p
6f30: 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
6f40: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
6f50: 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg==1 ){.      r
6f60: 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
6f70: 75 65 72 79 28 70 2c 20 0a 20 20 20 20 20 20 20  uery(p, .       
6f80: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
6f90: 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
6fa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
6fb0: 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
6fc0: 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
6fd0: 70 65 3d 3d 27 74 61 62 6c 65 27 22 2c 20 30 0a  pe=='table'", 0.
6fe0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
6ff0: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
7000: 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64  ery(p->out, p->d
7010: 62 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  b,.        "SELE
7020: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
7030: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
7040: 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
7050: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
7060: 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
7070: 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a  igger','view')".
7080: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
7090: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
70a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
70b0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
70c0: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
70d0: 69 63 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ic = azArg[i];. 
70e0: 20 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d         run_schem
70f0: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
7100: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
7110: 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
7120: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
7130: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
7140: 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
7150: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
7160: 63 28 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  c() AND type=='t
7170: 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20  able'".         
7180: 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
7190: 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20  NULL", 0);.     
71a0: 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
71b0: 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20  p_query(p->out, 
71c0: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
71d0: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
71e0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
71f0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
7200: 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
7210: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
7220: 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
7230: 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
7240: 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
7250: 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20  "  AND tbl_name 
7260: 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
7270: 28 29 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ()".        );. 
7280: 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61         zShellSta
7290: 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tic = 0;.      }
72a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
72b0: 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
72c0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
72d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  f(p->out, "PRAGM
72e0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
72f0: 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  a=OFF;\n");.    
7300: 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
7310: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ema = 0;.    }. 
7320: 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
7330: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
7340: 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
7350: 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
7360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7370: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
7380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
7390: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 43  rintf(p->out, "C
73a0: 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
73b0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
73c0: 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
73d0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63  mp(azArg[0], "ec
73e0: 68 6f 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ho", n)==0 && nA
73f0: 72 67 3e 31 20 29 7b 0a 20 20 20 20 70 2d 3e 65  rg>1 ){.    p->e
7400: 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56  choOn = booleanV
7410: 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
7420: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
7430: 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
7440: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
7450: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
7460: 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
7470: 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
7480: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
7490: 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29  ], "explain", n)
74a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  ==0 ){.    int v
74b0: 61 6c 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62  al = nArg>=2 ? b
74c0: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
74d0: 67 5b 31 5d 29 20 3a 20 31 3b 0a 20 20 20 20 69  g[1]) : 1;.    i
74e0: 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20  f(val == 1) {.  
74f0: 20 20 20 20 69 66 28 21 70 2d 3e 65 78 70 6c 61      if(!p->expla
7500: 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a  inPrev.valid) {.
7510: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61          p->expla
7520: 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 31  inPrev.valid = 1
7530: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70  ;.        p->exp
7540: 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65 20 3d 20  lainPrev.mode = 
7550: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  p->mode;.       
7560: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
7570: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e  showHeader = p->
7580: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
7590: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 65 78      memcpy(p->ex
75a0: 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c 57 69 64  plainPrev.colWid
75b0: 74 68 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 73  th,p->colWidth,s
75c0: 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74  izeof(p->colWidt
75d0: 68 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h));.      }.   
75e0: 20 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 70     /* We could p
75f0: 75 74 20 74 68 69 73 20 63 6f 64 65 20 75 6e 64  ut this code und
7600: 65 72 20 74 68 65 20 21 70 2d 3e 65 78 70 6c 61  er the !p->expla
7610: 69 6e 56 61 6c 69 64 0a 20 20 20 20 20 20 2a 2a  inValid.      **
7620: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 74 68   condition so th
7630: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  at it does not e
7640: 78 65 63 75 74 65 20 69 66 20 77 65 20 61 72 65  xecute if we are
7650: 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 20 20   already in.    
7660: 20 20 2a 2a 20 65 78 70 6c 61 69 6e 20 6d 6f 64    ** explain mod
7670: 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 6c 77 61  e. However, alwa
7680: 79 73 20 65 78 65 63 75 74 69 6e 67 20 69 74 20  ys executing it 
7690: 61 6c 6c 6f 77 73 20 75 73 20 61 6e 20 65 61 73  allows us an eas
76a0: 79 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  y.      ** was t
76b0: 6f 20 72 65 73 65 74 20 74 6f 20 65 78 70 6c 61  o reset to expla
76c0: 69 6e 20 6d 6f 64 65 20 69 6e 20 63 61 73 65 20  in mode in case 
76d0: 74 68 65 20 75 73 65 72 20 70 72 65 76 69 6f 75  the user previou
76e0: 73 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 64  sly.      ** did
76f0: 20 61 6e 20 2e 65 78 70 6c 61 69 6e 20 66 6f 6c   an .explain fol
7700: 6c 6f 77 65 64 20 62 79 20 61 20 2e 77 69 64 74  lowed by a .widt
7710: 68 2c 20 2e 6d 6f 64 65 20 6f 72 20 2e 68 65 61  h, .mode or .hea
7720: 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  der.      ** com
7730: 6d 61 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mand..      */. 
7740: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
7750: 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
7760: 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
7770: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 1;.      memse
7780: 74 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 30 2c  t(p->colWidth,0,
7790: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
77a0: 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20 20 70  Width));.      p
77b0: 2d 3e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20  ->colWidth[0] = 
77c0: 34 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  4;.      p->colW
77d0: 69 64 74 68 5b 31 5d 20 3d 20 31 34 3b 0a 20 20  idth[1] = 14;.  
77e0: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
77f0: 32 5d 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 70  2] = 10;.      p
7800: 2d 3e 63 6f 6c 57 69 64 74 68 5b 33 5d 20 3d 20  ->colWidth[3] = 
7810: 31 30 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  10;.      p->col
7820: 57 69 64 74 68 5b 34 5d 20 3d 20 33 33 3b 0a 20  Width[4] = 33;. 
7830: 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e     }else if (p->
7840: 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69  explainPrev.vali
7850: 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  d) {.      p->ex
7860: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
7870: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  = 0;.      p->mo
7880: 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50  de = p->explainP
7890: 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rev.mode;.      
78a0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
78b0: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73  p->explainPrev.s
78c0: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
78d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69   memcpy(p->colWi
78e0: 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72  dth,p->explainPr
78f0: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  ev.colWidth,size
7900: 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
7910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
7920: 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
7930: 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
7940: 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29  0], "header", n)
7950: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
7960: 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28          strncmp(
7970: 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
7980: 72 73 22 2c 20 6e 29 3d 3d 30 20 29 26 26 20 6e  rs", n)==0 )&& n
7990: 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 70 2d 3e  Arg>1 ){.    p->
79a0: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f  showHeader = boo
79b0: 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
79c0: 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  1]);.  }else..  
79d0: 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
79e0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
79f0: 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "help", n)==0 ){
7a00: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
7a10: 65 72 72 2c 7a 48 65 6c 70 29 3b 0a 20 20 7d 65  err,zHelp);.  }e
7a20: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
7a30: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
7a40: 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c  rg[0], "import",
7a50: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d   n)==0 && nArg>=
7a60: 33 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  3 ){.    char *z
7a70: 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d  Table = azArg[2]
7a80: 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64  ;    /* Insert d
7a90: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
7aa0: 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
7ab0: 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  *zFile = azArg[1
7ac0: 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ];     /* The fi
7ad0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
7ae0: 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f   extract data */
7af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
7b00: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
7b10: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
7b20: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7b50: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
7b60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7b90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
7ba0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7bc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7bd0: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
7be0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7c10: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
7c20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7c30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c40: 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65  f bytes in p->se
7c50: 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20  parator[] */.   
7c60: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c80: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
7c90: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
7ca0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
7cb0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
7cc0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
7cd0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
7ce0: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d00: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
7d10: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
7d20: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
7d30: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
7d40: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
7d50: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 20  mmit changes */ 
7d60: 20 20 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b    .    FILE *in;
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
7d90: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
7da0: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
7db0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
7dc0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
7dd0: 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65  file */..    ope
7de0: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 6e 53 65  n_db(p);.    nSe
7df0: 70 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 73 65  p = strlen(p->se
7e00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66  parator);.    if
7e10: 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
7e20: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7e30: 72 2c 20 22 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  r, "non-null sep
7e40: 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
7e50: 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
7e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7e70: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
7e80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7e90: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
7ea0: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
7eb0: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
7ec0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7ed0: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nByte = strlen(z
7ee0: 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
7ef0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
7f00: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
7f10: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
7f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7f30: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
7f40: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
7f50: 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
7f60: 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
7f70: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
7f80: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20   nCol = 0;.     
7f90: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
7fa0: 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  se{.      nCol =
7fb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7fc0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
7fd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7fe0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
7ff0: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
8000: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8010: 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20   zSql = malloc( 
8020: 6e 42 79 74 65 20 2b 20 32 30 20 2b 20 6e 43 6f  nByte + 20 + nCo
8030: 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
8040: 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
8050: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
8060: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30  nprintf(nByte+20
8070: 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
8080: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
8090: 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
80a0: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71    j = strlen(zSq
80b0: 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
80c0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
80d0: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
80e0: 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
80f0: 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
8100: 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
8110: 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
8120: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
8130: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
8140: 65 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  e(p->db, zSql, -
8150: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
8160: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
8170: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
8180: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8190: 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
81a0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
81b0: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  (db));.      sql
81c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
81d0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
81e0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
81f0: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
8200: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
8210: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
8220: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
8230: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
8240: 65 3a 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 29  e: %s\n", zFile)
8250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8260: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8270: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
8280: 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
8290: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
82a0: 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
82b0: 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
82c0: 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
82d0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
82e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
82f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8300: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47  exec(p->db, "BEG
8310: 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
8320: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f     zCommit = "CO
8330: 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65  MMIT";.    while
8340: 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c  ( (zLine = local
8350: 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29  _getline(0, in))
8360: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  !=0 ){.      cha
8370: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20  r *z;.      i = 
8380: 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  0;.      lineno+
8390: 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
83a0: 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
83b0: 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
83c0: 65 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e  e; *z && *z!='\n
83d0: 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a  ' && *z!='\r'; z
83e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
83f0: 20 2a 7a 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f   *z==p->separato
8400: 72 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  r[0] && strncmp(
8410: 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c  z, p->separator,
8420: 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20   nSep)==0 ){.   
8430: 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20         *z = 0;. 
8440: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
8450: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
8460: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
8470: 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b    azCol[i] = &z[
8480: 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  nSep];.         
8490: 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a     z += nSep-1;.
84a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
84b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
84c0: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
84d0: 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20    if( i+1!=nCol 
84e0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
84f0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 20 6c 69  tf(stderr,"%s li
8500: 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20  ne %d: expected 
8510: 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  %d columns of da
8520: 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 5c  ta but found %d\
8530: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
8540: 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43  File, lineno, nC
8550: 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
8560: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
8570: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
8580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8590: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
85a0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
85b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
85c0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
85d0: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
85e0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
85f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8600: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
8610: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8620: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
8630: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
8640: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
8650: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8660: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
8670: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
8680: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
8690: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
86a0: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
86b0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
86c0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
86e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
86f0: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
8700: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
8710: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8720: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
8730: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43  3_exec(p->db, zC
8740: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
8750: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
8760: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
8770: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
8780: 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20  ices", n)==0 && 
8790: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 73 74  nArg>1 ){.    st
87a0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
87b0: 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
87c0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
87d0: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
87e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
87f0: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
8800: 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
8810: 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
8820: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
8830: 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7a 53 68 65  E_List;.    zShe
8840: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
8850: 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [1];.    sqlite3
8860: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
8870: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
8880: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
8890: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
88a0: 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
88b0: 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  ND tbl_name LIKE
88c0: 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22   shellstatic() "
88d0: 0a 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c  .      "UNION AL
88e0: 4c 20 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43  L ".      "SELEC
88f0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
8900: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22  te_temp_master "
8910: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79  .      "WHERE ty
8920: 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
8930: 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65  bl_name LIKE she
8940: 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20 20  llstatic() ".   
8950: 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c     "ORDER BY 1",
8960: 0a 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c  .      callback,
8970: 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
8980: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 68 65  .    );.    zShe
8990: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20  llStatic = 0;.  
89a0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
89b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
89c0: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
89d0: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
89e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
89f0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
8a00: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
8a10: 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
8a20: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f  mp(azArg[0], "io
8a30: 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
8a40: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
8a50: 20 28 2a 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72   (*sqlite3_io_tr
8a60: 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
8a70: 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20  , ...);.    if( 
8a80: 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61  iotrace && iotra
8a90: 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c  ce!=stdout ) fcl
8aa0: 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20  ose(iotrace);.  
8ab0: 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20    iotrace = 0;. 
8ac0: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
8ad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
8ae0: 6f 5f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  o_trace = 0;.   
8af0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
8b00: 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
8b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8b20: 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 20 3d 20  ite3_io_trace = 
8b30: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20  iotracePrintf;. 
8b40: 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73       iotrace = s
8b50: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
8b60: 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  {.      iotrace 
8b70: 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
8b80: 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
8b90: 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a  ( iotrace==0 ){.
8ba0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
8bb0: 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
8bc0: 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
8bd0: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
8be0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72     sqlite3_io_tr
8bf0: 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
8c00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8c10: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 20 3d  lite3_io_trace =
8c20: 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
8c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8c40: 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
8c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
8c60: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20  EXTENSION.  if( 
8c70: 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
8c80: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61  p(azArg[0], "loa
8c90: 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  d", n)==0 && nAr
8ca0: 67 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73  g>=2 ){.    cons
8cb0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a  t char *zFile, *
8cc0: 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20  zProc;.    char 
8cd0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
8ce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 7a 46    int rc;.    zF
8cf0: 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
8d00: 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
8d10: 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
8d20: 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
8d30: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
8d40: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
8d50: 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65  ion(p->db, zFile
8d60: 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73  , zProc, &zErrMs
8d70: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
8d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8d90: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8da0: 72 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  r, "%s\n", zErrM
8db0: 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
8dc0: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
8dd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
8de0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
8df0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
8e00: 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  m' && strncmp(az
8e10: 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20  Arg[0], "mode", 
8e20: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32  n)==0 && nArg>=2
8e30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d   ){.    int n2 =
8e40: 20 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 31 5d   strlen(azArg[1]
8e50: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  );.    if( strnc
8e60: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e  mp(azArg[1],"lin
8e70: 65 22 2c 6e 32 29 3d 3d 30 0a 20 20 20 20 20 20  e",n2)==0.      
8e80: 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 73 74 72    ||.        str
8e90: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
8ea0: 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  ines",n2)==0 ){.
8eb0: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
8ec0: 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 7d  MODE_Line;.    }
8ed0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
8ee0: 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
8ef0: 6e 22 2c 6e 32 29 3d 3d 30 0a 20 20 20 20 20 20  n",n2)==0.      
8f00: 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20          ||.     
8f10: 20 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70           strncmp
8f20: 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
8f30: 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ns",n2)==0 ){.  
8f40: 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
8f50: 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
8f60: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
8f70: 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22  (azArg[1],"list"
8f80: 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
8f90: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
8fa0: 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  List;.    }else 
8fb0: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
8fc0: 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d  g[1],"html",n2)=
8fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
8fe0: 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b  ode = MODE_Html;
8ff0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9000: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
9010: 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "tcl",n2)==0 ){.
9020: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
9030: 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 7d 65  MODE_Tcl;.    }e
9040: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
9050: 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e  azArg[1],"csv",n
9060: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
9070: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
9080: 76 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  v;.      strcpy(
9090: 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 2c  p->separator, ",
90a0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
90b0: 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
90c0: 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30  1],"tabs",n2)==0
90d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
90e0: 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
90f0: 20 20 20 20 20 73 74 72 63 70 79 28 70 2d 3e 73       strcpy(p->s
9100: 65 70 61 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b  eparator, "\t");
9110: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9120: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
9130: 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20  "insert",n2)==0 
9140: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
9150: 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
9160: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d        if( nArg>=
9170: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  3 ){.        set
9180: 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 61  _table_name(p, a
9190: 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20  zArg[2]);.      
91a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
91b0: 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c  et_table_name(p,
91c0: 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 20   "table");.     
91d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20   }.    }else {. 
91e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
91f0: 65 72 72 2c 22 6d 6f 64 65 20 73 68 6f 75 6c 64  err,"mode should
9200: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
9210: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63         "column c
9220: 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c  sv html insert l
9230: 69 6e 65 20 6c 69 73 74 20 74 61 62 73 20 74 63  ine list tabs tc
9240: 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l\n");.    }.  }
9250: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
9260: 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  n' && strncmp(az
9270: 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c  Arg[0], "nullval
9280: 75 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ue", n)==0 && nA
9290: 72 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20 73 70  rg==2 ) {.    sp
92a0: 72 69 6e 74 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c  rintf(p->nullval
92b0: 75 65 2c 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74  ue, "%.*s", (int
92c0: 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
92d0: 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llvalue)-1, azAr
92e0: 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
92f0: 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
9300: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
9310: 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
9320: 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
9330: 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 21 3d      if( p->out!=
9340: 73 74 64 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  stdout ){.      
9350: 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  fclose(p->out);.
9360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
9370: 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73  rcmp(azArg[1],"s
9380: 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20  tdout")==0 ){.  
9390: 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
93a0: 6f 75 74 3b 0a 20 20 20 20 20 20 73 74 72 63 70  out;.      strcp
93b0: 79 28 70 2d 3e 6f 75 74 66 69 6c 65 2c 22 73 74  y(p->outfile,"st
93c0: 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73  dout");.    }els
93d0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  e{.      p->out 
93e0: 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
93f0: 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
9400: 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
9410: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
9420: 73 74 64 65 72 72 2c 22 63 61 6e 27 74 20 77 72  stderr,"can't wr
9430: 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
9440: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
9450: 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
9460: 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d 20 65 6c  dout;.      } el
9470: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 73 74  se {.         st
9480: 72 63 70 79 28 70 2d 3e 6f 75 74 66 69 6c 65 2c  rcpy(p->outfile,
9490: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
94a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
94b0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
94c0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
94d0: 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29  0], "prompt", n)
94e0: 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32 20  ==0 && (nArg==2 
94f0: 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20 20  || nArg==3)){.  
9500: 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29    if( nArg >= 2)
9510: 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
9520: 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72  (mainPrompt,azAr
9530: 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[1],(int)ArrayS
9540: 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d  ize(mainPrompt)-
9550: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
9560: 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20  ( nArg >= 3) {. 
9570: 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e       strncpy(con
9580: 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72  tinuePrompt,azAr
9590: 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[2],(int)ArrayS
95a0: 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  ize(continueProm
95b0: 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
95c0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
95d0: 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
95e0: 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c  zArg[0], "quit",
95f0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
9600: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
9610: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 73   if( c=='r' && s
9620: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
9630: 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26   "read", n)==0 &
9640: 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  & nArg==2 ){.   
9650: 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70   FILE *alt = fop
9660: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
9670: 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
9680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
9690: 6e 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27  ntf(stderr,"can'
96a0: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
96b0: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
96c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72   }else{.      pr
96d0: 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
96e0: 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
96f0: 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
9700: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
9710: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
9720: 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
9730: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
9740: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
9750: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
9760: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
9770: 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ;.    open_db(p)
9780: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
9790: 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
97a0: 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
97b0: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
97c0: 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
97d0: 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
97e0: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
97f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
9800: 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d  or(i=0; azArg[1]
9810: 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b  [i]; i++) azArg[
9820: 31 5d 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  1][i] = tolower(
9830: 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20 20  azArg[1][i]);.  
9840: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
9850: 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
9860: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
9870: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
9880: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
9890: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
98a0: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
98b0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69  REATE TABLE sqli
98c0: 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  te_master (\n". 
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
98f0: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
9900: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
9910: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
9940: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
9960: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
9970: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
9980: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
9990: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
99c0: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
99d0: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
99e0: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
99f0: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
9a00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
9a10: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
9a20: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
9a30: 6c 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lv);.      }else
9a40: 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
9a50: 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d  g[1],"sqlite_tem
9a60: 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  p_master")==0 ){
9a70: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
9a80: 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
9a90: 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
9aa0: 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
9ab0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
9ac0: 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  LE sqlite_temp_m
9ad0: 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20  aster (\n".     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
9b00: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
9b10: 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
9b20: 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9b40: 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
9b50: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
9b60: 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
9b70: 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
9b80: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
9b90: 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
9ba0: 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
9bc0: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
9bd0: 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
9be0: 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
9bf0: 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
9c00: 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
9c10: 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
9c20: 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
9c30: 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
9c40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9c50: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
9c60: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
9c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
9c80: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
9c90: 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
9ca0: 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20   FROM ".        
9cb0: 20 20 22 20 20 28 53 45 4c 45 43 54 20 2a 20 46    "  (SELECT * F
9cc0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9cd0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
9ce0: 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
9cf0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
9d00: 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
9d10: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
9d20: 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
9d30: 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20  ellstatic() AND 
9d40: 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
9d50: 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20   sql NOTNULL ". 
9d60: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
9d70: 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c 32  BY substr(type,2
9d80: 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20  ,1), name",.    
9d90: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
9da0: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
9db0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
9dc0: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9de0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
9df0: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
9e00: 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
9e10: 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  OM ".         " 
9e20: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
9e30: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
9e40: 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
9e50: 20 20 22 20 20 20 53 45 4c 45 43 54 20 2a 20 46    "   SELECT * F
9e60: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
9e70: 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20  master) ".      
9e80: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
9e90: 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
9ea0: 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
9eb0: 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
9ec0: 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f  _%'".         "O
9ed0: 52 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74  RDER BY substr(t
9ee0: 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c  ype,2,1), name",
9ef0: 0a 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  .         callba
9f00: 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
9f10: 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Msg.      );.   
9f20: 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
9f30: 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
9f40: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
9f50: 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
9f60: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
9f70: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
9f80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
9f90: 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
9fa0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
9fb0: 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20 6e  , "separator", n
9fc0: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
9fd0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70  ){.    sprintf(p
9fe0: 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 25 2e  ->separator, "%.
9ff0: 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
a000: 69 7a 65 28 70 2d 3e 73 65 70 61 72 61 74 6f 72  ize(p->separator
a010: 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
a020: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
a030: 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
a040: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77  (azArg[0], "show
a050: 22 2c 20 6e 29 3d 3d 30 29 7b 0a 20 20 20 20 69  ", n)==0){.    i
a060: 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e 74  nt i;.    fprint
a070: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
a080: 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70   %s\n","echo", p
a090: 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20  ->echoOn ? "on" 
a0a0: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
a0b0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
a0c0: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  .9s: %s\n","expl
a0d0: 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e  ain", p->explain
a0e0: 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e  Prev.valid ? "on
a0f0: 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66  " :"off");.    f
a100: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a110: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61  9.9s: %s\n","hea
a120: 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65  ders", p->showHe
a130: 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  ader ? "on" : "o
a140: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
a150: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
a160: 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
a170: 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
a180: 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
a190: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
a1a0: 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
a1b0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
a1c0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
a1d0: 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
a1e0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
a1f0: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
a200: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
a210: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  .9s: %s\n","outp
a220: 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
a250: 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75  outfile) ? p->ou
a260: 74 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22  tfile : "stdout"
a270: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
a280: 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c  ->out,"%9.9s: ",
a290: 20 22 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20   "separator");. 
a2a0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
a2b0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
a2c0: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
a2d0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
a2e0: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72  , "\n");.    fpr
a2f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
a300: 39 73 3a 20 22 2c 22 77 69 64 74 68 22 29 3b 0a  9s: ","width");.
a310: 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28      for (i=0;i<(
a320: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
a330: 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d  >colWidth) && p-
a340: 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20  >colWidth[i] != 
a350: 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66  0;i++) {.      f
a360: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a370: 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b  d ",p->colWidth[
a380: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
a390: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
a3a0: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
a3b0: 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
a3c0: 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
a3d0: 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c  rg[0], "tables",
a3e0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
a3f0: 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20  ar **azResult;. 
a400: 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 72 63 3b     int nRow, rc;
a410: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
a420: 73 67 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  sg;.    open_db(
a430: 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
a440: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
a450: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
a460: 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  ble(p->db,.     
a470: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
a480: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
a490: 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
a4a0: 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61  ERE type IN ('ta
a4b0: 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44  ble','view') AND
a4c0: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
a4d0: 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20  sqlite_%'".     
a4e0: 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
a4f0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
a500: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
a510: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20  _temp_master ". 
a520: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
a530: 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
a540: 76 69 65 77 27 29 20 22 0a 20 20 20 20 20 20 20  view') ".       
a550: 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20   "ORDER BY 1",. 
a560: 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c 74         &azResult
a570: 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45 72  , &nRow, 0, &zEr
a580: 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  rMsg.      );.  
a590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a5a0: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a  ShellStatic = az
a5b0: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63  Arg[1];.      rc
a5c0: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
a5d0: 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20  able(p->db,.    
a5e0: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
a5f0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
a600: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
a610: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
a620: 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e  able','view') AN
a630: 44 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 27 7c  D name LIKE '%'|
a640: 7c 73 68 65 6c 6c 73 74 61 74 69 63 28 29 7c 7c  |shellstatic()||
a650: 27 25 27 20 22 0a 20 20 20 20 20 20 20 20 22 55  '%' ".        "U
a660: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
a670: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
a680: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
a690: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
a6a0: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
a6b0: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
a6c0: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
a6d0: 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61 74 69 63  '%'||shellstatic
a6e0: 28 29 7c 7c 27 25 27 20 22 0a 20 20 20 20 20 20  ()||'%' ".      
a6f0: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
a700: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
a710: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
a720: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
a730: 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
a740: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
a750: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
a760: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
a770: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
a780: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
a790: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a7a0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  (zErrMsg);.    }
a7b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a7c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a7d0: 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20  int len, maxlen 
a7e0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
a7f0: 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  , j;.      int n
a800: 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74  PrintCol, nPrint
a810: 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Row;.      for(i
a820: 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b 2b  =1; i<=nRow; i++
a830: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
a840: 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29 20  zResult[i]==0 ) 
a850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a860: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61    len = strlen(a
a870: 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20  zResult[i]);.   
a880: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78       if( len>max
a890: 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
a8a0: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
a8b0: 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30    nPrintCol = 80
a8c0: 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20  /(maxlen+2);.   
a8d0: 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c     if( nPrintCol
a8e0: 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d  <1 ) nPrintCol =
a8f0: 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74   1;.      nPrint
a900: 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50  Row = (nRow + nP
a910: 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72  rintCol - 1)/nPr
a920: 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f  intCol;.      fo
a930: 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52  r(i=0; i<nPrintR
a940: 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
a950: 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 3d    for(j=i+1; j<=
a960: 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52  nRow; j+=nPrintR
a970: 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ow){.          c
a980: 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 3d 6e 50  har *zSp = j<=nP
a990: 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
a9a0: 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 70    ";.          p
a9b0: 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c 20  rintf("%s%-*s", 
a9c0: 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a 52  zSp, maxlen, azR
a9d0: 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73  esult[j] ? azRes
a9e0: 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20 20  ult[j] : "");.  
a9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aa00: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
aa10: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
aa20: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
aa30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
aa40: 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 7a 52 65  _free_table(azRe
aa50: 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  sult);.  }else..
aa60: 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
aa70: 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
aa80: 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75  zArg[0], "timeou
aa90: 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  t", n)==0 && nAr
aaa0: 67 3e 3d 32 20 29 7b 0a 20 20 20 20 6f 70 65 6e  g>=2 ){.    open
aab0: 5f 64 62 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  _db(p);.    sqli
aac0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
aad0: 28 70 2d 3e 64 62 2c 20 61 74 6f 69 28 61 7a 41  (p->db, atoi(azA
aae0: 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65 6c 73 65  rg[1]));.  }else
aaf0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26  ..  if( c=='w' &
ab00: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
ab10: 30 5d 2c 20 22 77 69 64 74 68 22 2c 20 6e 29 3d  0], "width", n)=
ab20: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  =0 ){.    int j;
ab30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72  .    assert( nAr
ab40: 67 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 41  g<=ArraySize(azA
ab50: 72 67 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a  rg) );.    for(j
ab60: 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a 3c  =1; j<nArg && j<
ab70: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
ab80: 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20  Width); j++){.  
ab90: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
aba0: 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41 72  j-1] = atoi(azAr
abb0: 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[j]);.    }.  }
abc0: 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66 70  else..  {.    fp
abd0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
abe0: 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
abf0: 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
ac00: 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
ac10: 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
ac20: 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
ac30: 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
ac40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ac50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ac60: 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 61 73   TRUE if the las
ac70: 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65  t non-whitespace
ac80: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b   character in z[
ac90: 5d 20 69 73 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  ] is a semicolon
aca0: 2e 0a 2a 2a 20 7a 5b 5d 20 69 73 20 4e 20 63 68  ..** z[] is N ch
acb0: 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 0a 2a  aracters long..*
acc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 65 6e  /.static int _en
acd0: 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c 6f  ds_with_semicolo
ace0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
acf0: 20 69 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c 65   int N){.  while
ad00: 28 20 4e 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( N>0 && isspace
ad10: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
ad20: 7a 5b 4e 2d 31 5d 29 20 29 7b 20 4e 2d 2d 3b 20  z[N-1]) ){ N--; 
ad30: 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3e 30 20 26  }.  return N>0 &
ad40: 26 20 7a 5b 4e 2d 31 5d 3d 3d 27 3b 27 3b 0a 7d  & z[N-1]==';';.}
ad50: 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
ad60: 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f  see if a line co
ad70: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
ad80: 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a  of whitespace..*
ad90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c  /.static int _al
ada0: 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e  l_whitespace(con
adb0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66  st char *z){.  f
adc0: 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  or(; *z; z++){. 
add0: 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 2a     if( isspace(*
ade0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
adf0: 7a 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  z) ) continue;. 
ae00: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
ae10: 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[1]=='*' ){. 
ae20: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
ae30: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
ae40: 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d  (*z!='*' || z[1]
ae50: 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d  !='/') ){ z++; }
ae60: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
ae70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ae80: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f     z++;.      co
ae90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
aea0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26    if( *z=='-' &&
aeb0: 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[1]=='-' ){.  
aec0: 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
aed0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
aee0: 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\n' ){ z++; 
aef0: 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
af00: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
af10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
af20: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
af30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
af40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
af50: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  n TRUE if the li
af60: 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61  ne typed in is a
af70: 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65  n SQL command te
af80: 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a  rminator other.*
af90: 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f  * than a semi-co
afa0: 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65  lon.  The SQL Se
afb0: 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20  rver style "go" 
afc0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72  command is under
afd0: 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74  stood.** as is t
afe0: 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a  he Oracle "/"..*
aff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69 73  /.static int _is
b000: 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61  _command_termina
b010: 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tor(const char *
b020: 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28  zLine){.  while(
b030: 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67   isspace(*(unsig
b040: 6e 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65 29  ned char*)zLine)
b050: 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a   ){ zLine++; };.
b060: 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
b070: 27 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74  '/' && _all_whit
b080: 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d  espace(&zLine[1]
b090: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  ) ) return 1;  /
b0a0: 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a 20 20 69 66  * Oracle */.  if
b0b0: 28 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65 5b  ( tolower(zLine[
b0c0: 30 5d 29 3d 3d 27 67 27 20 26 26 20 74 6f 6c 6f  0])=='g' && tolo
b0d0: 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27  wer(zLine[1])=='
b0e0: 6f 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f  o'.         && _
b0f0: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26  all_whitespace(&
b100: 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20  zLine[2]) ){.   
b110: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53   return 1;  /* S
b120: 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d  QL Server */.  }
b130: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b140: 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
b150: 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70 72   from *in and pr
b160: 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a 69  ocess it.  If *i
b170: 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74 0a  n==0 then input.
b180: 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69 76  ** is interactiv
b190: 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73 20  e - the user is 
b1a0: 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20 4f  typing it it.  O
b1b0: 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74 0a  therwise, input.
b1c0: 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
b1d0: 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76 69  m a file or devi
b1e0: 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69 73  ce.  A prompt is
b1f0: 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73 74   issued and hist
b200: 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64 20  ory.** is saved 
b210: 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69 73  only if input is
b220: 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20 41   interactive.  A
b230: 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67 6e  n interrupt sign
b240: 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73 65  al will.** cause
b250: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
b260: 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c   exit immediatel
b270: 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74 20  y, unless input 
b280: 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  is interactive..
b290: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
b2a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b2b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b2c0: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73   process_input(s
b2d0: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
b2e0: 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e  ata *p, FILE *in
b2f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
b300: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  ;.  char *zSql =
b310: 20 30 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d   0;.  int nSql =
b320: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
b330: 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
b340: 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b   int errCnt = 0;
b350: 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20  .  int lineno = 
b360: 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  0;.  int startli
b370: 6e 65 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ne = 0;..  while
b380: 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21  ( errCnt==0 || !
b390: 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c  bail_on_error ||
b3a0: 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e   (in==0 && stdin
b3b0: 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29  _is_interactive)
b3c0: 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70   ){.    fflush(p
b3d0: 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c 69 6e  ->out);.    zLin
b3e0: 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69  e = one_input_li
b3f0: 6e 65 28 7a 53 71 6c 2c 20 69 6e 29 3b 0a 20 20  ne(zSql, in);.  
b400: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
b410: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  {.      break;  
b420: 2f 2a 20 57 65 20 68 61 76 65 20 72 65 61 63 68  /* We have reach
b430: 65 64 20 45 4f 46 20 2a 2f 0a 20 20 20 20 7d 0a  ed EOF */.    }.
b440: 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
b450: 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
b460: 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
b470: 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
b480: 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
b490: 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  .    lineno++;. 
b4a0: 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f 6e     if( p->echoOn
b4b0: 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22   ) printf("%s\n"
b4c0: 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 69 66  , zLine);.    if
b4d0: 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20 7a 53  ( (zSql==0 || zS
b4e0: 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f 61 6c  ql[0]==0) && _al
b4f0: 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69  l_whitespace(zLi
b500: 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ne) ) continue;.
b510: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26 26      if( zLine &&
b520: 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26   zLine[0]=='.' &
b530: 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  & nSql==0 ){.   
b540: 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f     rc = do_meta_
b550: 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20 70  command(zLine, p
b560: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
b570: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
b580: 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  rc==2 ){.       
b590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
b5a0: 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20  lse if( rc ){.  
b5b0: 20 20 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a        errCnt++;.
b5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
b5d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
b5e0: 20 20 69 66 28 20 5f 69 73 5f 63 6f 6d 6d 61 6e    if( _is_comman
b5f0: 64 5f 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c 69  d_terminator(zLi
b600: 6e 65 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ne) ){.      str
b610: 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22 29 3b 0a  cpy(zLine,";");.
b620: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
b630: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ql==0 ){.      i
b640: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
b650: 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26  i=0; zLine[i] &&
b660: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
b670: 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d  ed char)zLine[i]
b680: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
b690: 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 21 3d 30 20  if( zLine[i]!=0 
b6a0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 71 6c 20  ){.        nSql 
b6b0: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
b6c0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
b6d0: 6d 61 6c 6c 6f 63 28 20 6e 53 71 6c 2b 31 20 29  malloc( nSql+1 )
b6e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ;.        if( zS
b6f0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ql==0 ){.       
b700: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b710: 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
b720: 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  y\n");.         
b730: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
b740: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72 63    }.        strc
b750: 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65 29 3b  py(zSql, zLine);
b760: 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 6c 69  .        startli
b770: 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20  ne = lineno;.   
b780: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
b790: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
b7a0: 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  strlen(zLine);. 
b7b0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c       zSql = real
b7c0: 6c 6f 63 28 20 7a 53 71 6c 2c 20 6e 53 71 6c 20  loc( zSql, nSql 
b7d0: 2b 20 6c 65 6e 20 2b 20 32 20 29 3b 0a 20 20 20  + len + 2 );.   
b7e0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
b7f0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
b800: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6f 75  f(stderr,"%s: ou
b810: 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c  t of memory!\n",
b820: 20 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20 20   Argv0);.       
b830: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
b840: 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  }.      strcpy(&
b850: 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 2c 20 22 5c  zSql[nSql++], "\
b860: 6e 22 29 3b 0a 20 20 20 20 20 20 73 74 72 63 70  n");.      strcp
b870: 79 28 26 7a 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a  y(&zSql[nSql], z
b880: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 6e 53 71  Line);.      nSq
b890: 6c 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  l += len;.    }.
b8a0: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
b8b0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 26 26  .    if( zSql &&
b8c0: 20 5f 65 6e 64 73 5f 77 69 74 68 5f 73 65 6d 69   _ends_with_semi
b8d0: 63 6f 6c 6f 6e 28 7a 53 71 6c 2c 20 6e 53 71 6c  colon(zSql, nSql
b8e0: 29 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d  ) && sqlite3_com
b8f0: 70 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20  plete(zSql) ){. 
b900: 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d 20 30 3b       p->cnt = 0;
b910: 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
b920: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
b930: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
b940: 2c 20 7a 53 71 6c 2c 20 63 61 6c 6c 62 61 63 6b  , zSql, callback
b950: 2c 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , p, &zErrMsg);.
b960: 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20        if( rc || 
b970: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
b980: 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b     char zPrefix[
b990: 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  100];.        if
b9a0: 28 20 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69  ( in!=0 || !stdi
b9b0: 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
b9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70   ){.          sp
b9d0: 72 69 6e 74 66 28 7a 50 72 65 66 69 78 2c 20 22  rintf(zPrefix, "
b9e0: 53 51 4c 20 65 72 72 6f 72 20 6e 65 61 72 20 6c  SQL error near l
b9f0: 69 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c  ine %d:", startl
ba00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ine);.        }e
ba10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
ba20: 70 72 69 6e 74 66 28 7a 50 72 65 66 69 78 2c 20  printf(zPrefix, 
ba30: 22 53 51 4c 20 65 72 72 6f 72 3a 22 29 3b 0a 20  "SQL error:");. 
ba40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba50: 20 69 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20   if( zErrMsg!=0 
ba60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
ba70: 6e 74 66 28 22 25 73 20 25 73 5c 6e 22 2c 20 7a  ntf("%s %s\n", z
ba80: 50 72 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29  Prefix, zErrMsg)
ba90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
baa0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
bab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72  );.          zEr
bac0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
bad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bae0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73     printf("%s %s
baf0: 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 73 71  \n", zPrefix, sq
bb00: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
bb10: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
bb20: 20 20 20 20 20 20 20 20 65 72 72 43 6e 74 2b 2b          errCnt++
bb30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb40: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
bb50: 20 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20    zSql = 0;.    
bb60: 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20    nSql = 0;.    
bb70: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c  }.  }.  if( zSql
bb80: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 5f 61 6c   ){.    if( !_al
bb90: 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71  l_whitespace(zSq
bba0: 6c 29 20 29 20 70 72 69 6e 74 66 28 22 49 6e 63  l) ) printf("Inc
bbb0: 6f 6d 70 6c 65 74 65 20 53 51 4c 3a 20 25 73 5c  omplete SQL: %s\
bbc0: 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n", zSql);.    f
bbd0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
bbe0: 20 72 65 74 75 72 6e 20 65 72 72 43 6e 74 3b 0a   return errCnt;.
bbf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bc00: 61 20 70 61 74 68 6e 61 6d 65 20 77 68 69 63 68  a pathname which
bc10: 20 69 73 20 74 68 65 20 75 73 65 72 27 73 20 68   is the user's h
bc20: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ome directory.  
bc30: 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e 20 69 6e  A.** 0 return in
bc40: 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72  dicates an error
bc50: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
bc60: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
bc70: 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 73  e.** resulting s
bc80: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
bc90: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
bca0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
bcb0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
bcc0: 20 66 72 65 65 20 74 68 65 20 72 65 73 75 6c 74   free the result
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
bce0: 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28   *find_home_dir(
bcf0: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 68  void){.  char *h
bd00: 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a  ome_dir = NULL;.
bd10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
bd20: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
bd30: 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  d(WIN32) && !def
bd40: 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f 29 20  ined(__MACOS__) 
bd50: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53  && !defined(__OS
bd60: 32 5f 5f 29 0a 20 20 73 74 72 75 63 74 20 70 61  2__).  struct pa
bd70: 73 73 77 64 20 2a 70 77 65 6e 74 3b 0a 20 20 75  sswd *pwent;.  u
bd80: 69 64 5f 74 20 75 69 64 20 3d 20 67 65 74 75 69  id_t uid = getui
bd90: 64 28 29 3b 0a 20 20 69 66 28 20 28 70 77 65 6e  d();.  if( (pwen
bda0: 74 3d 67 65 74 70 77 75 69 64 28 75 69 64 29 29  t=getpwuid(uid))
bdb0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
bdc0: 68 6f 6d 65 5f 64 69 72 20 3d 20 70 77 65 6e 74  home_dir = pwent
bdd0: 2d 3e 70 77 5f 64 69 72 3b 0a 20 20 7d 0a 23 65  ->pw_dir;.  }.#e
bde0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 4d  ndif..#ifdef __M
bdf0: 41 43 4f 53 5f 5f 0a 20 20 63 68 61 72 20 68 6f  ACOS__.  char ho
be00: 6d 65 5f 70 61 74 68 5b 5f 4d 41 58 5f 50 41 54  me_path[_MAX_PAT
be10: 48 2b 31 5d 3b 0a 20 20 68 6f 6d 65 5f 64 69 72  H+1];.  home_dir
be20: 20 3d 20 67 65 74 63 77 64 28 68 6f 6d 65 5f 70   = getcwd(home_p
be30: 61 74 68 2c 20 5f 4d 41 58 5f 50 41 54 48 29 3b  ath, _MAX_PATH);
be40: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
be50: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
be60: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 7c  defined(WIN32) |
be70: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f  | defined(__OS2_
be80: 5f 29 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64  _).  if (!home_d
be90: 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64  ir) {.    home_d
bea0: 69 72 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45  ir = getenv("USE
beb0: 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 7d 0a  RPROFILE");.  }.
bec0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 20 28 21 68  #endif..  if (!h
bed0: 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
bee0: 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
bef0: 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d 0a 0a 23  ("HOME");.  }..#
bf00: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
bf10: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
bf20: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
bf30: 5f 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21  __OS2__).  if (!
bf40: 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20  home_dir) {.    
bf50: 63 68 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a 7a  char *zDrive, *z
bf60: 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  Path;.    int n;
bf70: 0a 20 20 20 20 7a 44 72 69 76 65 20 3d 20 67 65  .    zDrive = ge
bf80: 74 65 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22  tenv("HOMEDRIVE"
bf90: 29 3b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 67  );.    zPath = g
bfa0: 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22  etenv("HOMEPATH"
bfb0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 72 69 76  );.    if( zDriv
bfc0: 65 20 26 26 20 7a 50 61 74 68 20 29 7b 0a 20 20  e && zPath ){.  
bfd0: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
bfe0: 44 72 69 76 65 29 20 2b 20 73 74 72 6c 65 6e 28  Drive) + strlen(
bff0: 7a 50 61 74 68 29 20 2b 20 31 3b 0a 20 20 20 20  zPath) + 1;.    
c000: 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 6d 61 6c    home_dir = mal
c010: 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 20 20  loc( n );.      
c020: 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20  if( home_dir==0 
c030: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
c040: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c050: 74 66 28 6e 2c 20 68 6f 6d 65 5f 64 69 72 2c 20  tf(n, home_dir, 
c060: 22 25 73 25 73 22 2c 20 7a 44 72 69 76 65 2c 20  "%s%s", zDrive, 
c070: 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65  zPath);.      re
c080: 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 20  turn home_dir;. 
c090: 20 20 20 7d 0a 20 20 20 20 68 6f 6d 65 5f 64 69     }.    home_di
c0a0: 72 20 3d 20 22 63 3a 5c 5c 22 3b 0a 20 20 7d 0a  r = "c:\\";.  }.
c0b0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 68 6f  #endif..  if( ho
c0c0: 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 63 68  me_dir ){.    ch
c0d0: 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20  ar *z = malloc( 
c0e0: 73 74 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29  strlen(home_dir)
c0f0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20  +1 );.    if( z 
c100: 29 20 73 74 72 63 70 79 28 7a 2c 20 68 6f 6d 65  ) strcpy(z, home
c110: 5f 64 69 72 29 3b 0a 20 20 20 20 68 6f 6d 65 5f  _dir);.    home_
c120: 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20  dir = z;.  }..  
c130: 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b  return home_dir;
c140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69  .}../*.** Read i
c150: 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
c160: 6c 65 20 67 69 76 65 6e 20 62 79 20 73 71 6c 69  le given by sqli
c170: 74 65 72 63 5f 6f 76 65 72 72 69 64 65 2e 20 20  terc_override.  
c180: 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a 20 70 61  Or if that.** pa
c190: 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c  rameter is NULL,
c1a0: 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
c1b0: 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a 2a 2f 0a   ~/.sqliterc.*/.
c1c0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63  static void proc
c1d0: 65 73 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20  ess_sqliterc(.  
c1e0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
c1f0: 64 61 74 61 20 2a 70 2c 20 20 20 20 20 20 20 20  data *p,        
c200: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
c210: 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74   data */.  const
c220: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f   char *sqliterc_
c230: 6f 76 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61  override   /* Na
c240: 6d 65 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c  me of config fil
c250: 65 2e 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64  e. NULL to use d
c260: 65 66 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63  efault */.){.  c
c270: 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20  har *home_dir = 
c280: 4e 55 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  NULL;.  const ch
c290: 61 72 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73  ar *sqliterc = s
c2a0: 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65  qliterc_override
c2b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d  ;.  char *zBuf =
c2c0: 20 30 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d   0;.  FILE *in =
c2d0: 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 73 71   NULL;..  if (sq
c2e0: 6c 69 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29 20  literc == NULL) 
c2f0: 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  {.    home_dir =
c300: 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29   find_home_dir()
c310: 3b 0a 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64  ;.    if( home_d
c320: 69 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ir==0 ){.      f
c330: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
c340: 73 3a 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65  s: cannot locate
c350: 20 79 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63   your home direc
c360: 74 6f 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29  tory!\n", Argv0)
c370: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
c380: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d      }.    zBuf =
c390: 20 6d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 68   malloc(strlen(h
c3a0: 6f 6d 65 5f 64 69 72 29 20 2b 20 31 35 29 3b 0a  ome_dir) + 15);.
c3b0: 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20      if( zBuf==0 
c3c0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
c3d0: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6f 75 74  (stderr,"%s: out
c3e0: 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20   of memory!\n", 
c3f0: 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20 65 78  Argv0);.      ex
c400: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
c410: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
c420: 73 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d  s/.sqliterc",hom
c430: 65 5f 64 69 72 29 3b 0a 20 20 20 20 66 72 65 65  e_dir);.    free
c440: 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20  (home_dir);.    
c450: 73 71 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e 73  sqliterc = (cons
c460: 74 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20  t char*)zBuf;.  
c470: 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73  }.  in = fopen(s
c480: 71 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20  qliterc,"rb");. 
c490: 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69   if( in ){.    i
c4a0: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
c4b0: 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  ractive ){.     
c4c0: 20 70 72 69 6e 74 66 28 22 4c 6f 61 64 69 6e 67   printf("Loading
c4d0: 20 72 65 73 6f 75 72 63 65 73 20 66 72 6f 6d 20   resources from 
c4e0: 25 73 5c 6e 22 2c 73 71 6c 69 74 65 72 63 29 3b  %s\n",sqliterc);
c4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 65  .    }.    proce
c500: 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a  ss_input(p,in);.
c510: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
c520: 20 20 7d 0a 20 20 66 72 65 65 28 7a 42 75 66 29    }.  free(zBuf)
c530: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
c540: 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c 61  *.** Show availa
c550: 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ble command line
c560: 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
c570: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4f  ic const char zO
c580: 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22 20  ptions[] = .  " 
c590: 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61 6d 65    -init filename
c5a0: 20 20 20 20 20 20 20 72 65 61 64 2f 70 72 6f 63         read/proc
c5b0: 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65 5c 6e  ess named file\n
c5c0: 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
c5e0: 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo
c5f0: 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a  re execution\n".
c600: 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65    "   -[no]heade
c610: 72 20 20 20 20 20 20 20 20 20 20 74 75 72 6e 20  r          turn 
c620: 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
c630: 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69 6c  f\n".  "   -bail
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  stop after hitti
c660: 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20  ng an error\n". 
c670: 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76   "   -interactiv
c680: 65 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20  e         force 
c690: 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c  interactive I/O\
c6a0: 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63 68 20  n".  "   -batch 
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
c6c0: 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22  rce batch I/O\n"
c6d0: 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20  .  "   -column  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
c6f0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
c700: 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20  column'\n".  "  
c710: 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20   -csv           
c720: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
c730: 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e   mode to 'csv'\n
c740: 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20 20 20  ".  "   -html   
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
c760: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
c770: 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  HTML\n".  "   -l
c780: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
c790: 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
c7a0: 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
c7b0: 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
c7c0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
c7d0: 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
c7e0: 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73  ist'\n".  "   -s
c7f0: 65 70 61 72 61 74 6f 72 20 27 78 27 20 20 20 20  eparator 'x'    
c800: 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 66 69     set output fi
c810: 65 6c 64 20 73 65 70 61 72 61 74 6f 72 20 28 7c  eld separator (|
c820: 29 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c  )\n".  "   -null
c830: 76 61 6c 75 65 20 27 74 65 78 74 27 20 20 20 20  value 'text'    
c840: 73 65 74 20 74 65 78 74 20 73 74 72 69 6e 67 20  set text string 
c850: 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c  for NULL values\
c860: 6e 22 0a 20 20 22 20 20 20 2d 76 65 72 73 69 6f  n".  "   -versio
c870: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68  n             sh
c880: 6f 77 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  ow SQLite versio
c890: 6e 5c 6e 22 0a 3b 0a 73 74 61 74 69 63 20 76 6f  n\n".;.static vo
c8a0: 69 64 20 75 73 61 67 65 28 69 6e 74 20 73 68 6f  id usage(int sho
c8b0: 77 44 65 74 61 69 6c 29 7b 0a 20 20 66 70 72 69  wDetail){.  fpri
c8c0: 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
c8d0: 20 20 22 55 73 61 67 65 3a 20 25 73 20 5b 4f 50    "Usage: %s [OP
c8e0: 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d 45 20  TIONS] FILENAME 
c8f0: 5b 53 51 4c 5d 5c 6e 22 20 20 0a 20 20 20 20 20  [SQL]\n"  .     
c900: 20 22 46 49 4c 45 4e 41 4d 45 20 69 73 20 74 68   "FILENAME is th
c910: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 53 51 4c  e name of an SQL
c920: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 41 20  ite database. A 
c930: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
c940: 63 72 65 61 74 65 64 5c 6e 22 0a 20 20 20 20 20  created\n".     
c950: 20 22 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f   "if the file do
c960: 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  es not previousl
c970: 79 20 65 78 69 73 74 2e 5c 6e 22 2c 20 41 72 67  y exist.\n", Arg
c980: 76 30 29 3b 0a 20 20 69 66 28 20 73 68 6f 77 44  v0);.  if( showD
c990: 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 66 70 72  etail ){.    fpr
c9a0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 50  intf(stderr, "OP
c9b0: 54 49 4f 4e 53 20 69 6e 63 6c 75 64 65 3a 5c 6e  TIONS include:\n
c9c0: 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b 0a  %s", zOptions);.
c9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
c9e0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
c9f0: 65 20 74 68 65 20 2d 68 65 6c 70 20 6f 70 74 69  e the -help opti
ca00: 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
ca10: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22  l information\n"
ca20: 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 31 29  );.  }.  exit(1)
ca30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ca40: 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 20  alize the state 
ca50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 64  information in d
ca60: 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ata.*/.static vo
ca70: 69 64 20 6d 61 69 6e 5f 69 6e 69 74 28 73 74 72  id main_init(str
ca80: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
ca90: 61 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65 6d  a *data) {.  mem
caa0: 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73 69 7a  set(data, 0, siz
cab0: 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20 20 64  eof(*data));.  d
cac0: 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45  ata->mode = MODE
cad0: 5f 4c 69 73 74 3b 0a 20 20 73 74 72 63 70 79 28  _List;.  strcpy(
cae0: 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f 72 2c  data->separator,
caf0: 22 7c 22 29 3b 0a 20 20 64 61 74 61 2d 3e 73 68  "|");.  data->sh
cb00: 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
cb10: 73 74 72 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70  strcpy(mainPromp
cb20: 74 2c 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20  t,"sqlite> ");. 
cb30: 20 73 74 72 63 70 79 28 63 6f 6e 74 69 6e 75 65   strcpy(continue
cb40: 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20  Prompt,"   ...> 
cb50: 22 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28  ");.}..int main(
cb60: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
cb70: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
cb80: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
cb90: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
cba0: 61 74 61 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73  ata data;.  cons
cbb0: 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c  t char *zInitFil
cbc0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  e = 0;.  char *z
cbd0: 46 69 72 73 74 43 6d 64 20 3d 20 30 3b 0a 20 20  FirstCmd = 0;.  
cbe0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
cbf0: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 4d  = 0;..#ifdef __M
cc00: 41 43 4f 53 5f 5f 0a 20 20 61 72 67 63 20 3d 20  ACOS__.  argc = 
cc10: 63 63 6f 6d 6d 61 6e 64 28 26 61 72 67 76 29 3b  ccommand(&argv);
cc20: 0a 23 65 6e 64 69 66 0a 0a 20 20 41 72 67 76 30  .#endif..  Argv0
cc30: 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6d 61   = argv[0];.  ma
cc40: 69 6e 5f 69 6e 69 74 28 26 64 61 74 61 29 3b 0a  in_init(&data);.
cc50: 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
cc60: 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79 28  active = isatty(
cc70: 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
cc80: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
cc90: 6c 69 64 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c  lid signal handl
cca0: 65 72 20 65 61 72 6c 79 2c 20 62 65 66 6f 72 65  er early, before
ccb0: 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 65   anything.  ** e
ccc0: 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  lse is done..  *
ccd0: 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  /.#ifdef SIGINT.
cce0: 20 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c    signal(SIGINT,
ccf0: 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c   interrupt_handl
cd00: 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  er);.#endif..  /
cd10: 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69 61 6c 20  * Do an initial 
cd20: 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65  pass through the
cd30: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
cd40: 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63 61 74 65  gument to locate
cd50: 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
cd60: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
cd70: 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6f 66  ile, the name of
cd80: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
cd90: 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 61  ion file,.  ** a
cda0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d  nd the first com
cdb0: 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65 2e  mand to execute.
cdc0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
cdd0: 20 69 3c 61 72 67 63 2d 31 3b 20 69 2b 2b 29 7b   i<argc-1; i++){
cde0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
cdf0: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d    if( argv[i][0]
ce00: 21 3d 27 2d 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='-' ) break;. 
ce10: 20 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a     z = argv[i];.
ce20: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
ce30: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29  ' && z[1]=='-' )
ce40: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74   z++;.    if( st
ce50: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 73  rcmp(argv[i],"-s
ce60: 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 7c 7c  eparator")==0 ||
ce70: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
ce80: 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30  "-nullvalue")==0
ce90: 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
cea0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
ceb0: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 69 6e  cmp(argv[i],"-in
cec0: 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  it")==0 ){.     
ced0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 49 6e 69   i++;.      zIni
cee0: 74 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 5d 3b  tFile = argv[i];
cef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
cf00: 20 69 3c 61 72 67 63 20 29 7b 0a 20 20 20 20 64   i<argc ){.    d
cf10: 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20  ata.zDbFilename 
cf20: 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d  = argv[i++];.  }
cf30: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
cf40: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
cf50: 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46  DB.    data.zDbF
cf60: 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
cf70: 72 79 3a 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ry:";.#else.    
cf80: 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
cf90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   = 0;.#endif.  }
cfa0: 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b  .  if( i<argc ){
cfb0: 0a 20 20 20 20 7a 46 69 72 73 74 43 6d 64 20 3d  .    zFirstCmd =
cfc0: 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a   argv[i++];.  }.
cfd0: 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64    data.out = std
cfe0: 6f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  out;..#ifdef SQL
cff0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
d000: 42 0a 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62  B.  if( data.zDb
d010: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
d020: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
d030: 72 2c 22 25 73 3a 20 6e 6f 20 64 61 74 61 62 61  r,"%s: no databa
d040: 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70 65 63  se filename spec
d050: 69 66 69 65 64 5c 6e 22 2c 20 61 72 67 76 5b 30  ified\n", argv[0
d060: 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ]);.    exit(1);
d070: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
d080: 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20 6f  * Go ahead and o
d090: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
d0a0: 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c 72 65   file if it alre
d0b0: 61 64 79 20 65 78 69 73 74 73 2e 20 20 49 66 20  ady exists.  If 
d0c0: 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f  the.  ** file do
d0d0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 64 65  es not exist, de
d0e0: 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20  lay opening it. 
d0f0: 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 65   This prevents e
d100: 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a 20 20  mpty database.  
d110: 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20 62 65  ** files from be
d120: 69 6e 67 20 63 72 65 61 74 65 64 20 69 66 20 61  ing created if a
d130: 20 75 73 65 72 20 6d 69 73 74 79 70 65 73 20 74   user mistypes t
d140: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
d150: 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74   argument.  ** t
d160: 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6d  o the sqlite com
d170: 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a  mand-line tool..
d180: 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63 65 73    */.  if( acces
d190: 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61  s(data.zDbFilena
d1a0: 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  me, 0)==0 ){.   
d1b0: 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b   open_db(&data);
d1c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
d1d0: 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ss the initializ
d1e0: 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74 68  ation file if th
d1f0: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
d200: 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e 0a  no -init option.
d210: 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f 6e    ** is given on
d220: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
d230: 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66 69  e, look for a fi
d240: 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c 69  le named ~/.sqli
d250: 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74 72  terc and.  ** tr
d260: 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74 2e  y to process it.
d270: 0a 20 20 2a 2f 0a 20 20 70 72 6f 63 65 73 73 5f  .  */.  process_
d280: 73 71 6c 69 74 65 72 63 28 26 64 61 74 61 2c 7a  sqliterc(&data,z
d290: 49 6e 69 74 46 69 6c 65 29 3b 0a 0a 20 20 2f 2a  InitFile);..  /*
d2a0: 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20 70   Make a second p
d2b0: 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
d2c0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
d2d0: 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a 20 20  ument and set.  
d2e0: 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68 69  ** options.  Thi
d2f0: 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20 69 73  s second pass is
d300: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 61   delayed until a
d310: 66 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c  fter the initial
d320: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c  ization.  ** fil
d330: 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 73  e is processed s
d340: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d 6d 61  o that the comma
d350: 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
d360: 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 0a  s will override.
d370: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 69 6e    ** settings in
d380: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
d390: 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ion file..  */. 
d3a0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
d3b0: 20 26 26 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d   && argv[i][0]==
d3c0: 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  '-'; i++){.    c
d3d0: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
d3e0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d  ;.    if( z[1]==
d3f0: 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  '-' ){ z++; }.  
d400: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
d410: 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -init")==0 ){.  
d420: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c      i++;.    }el
d430: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
d440: 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20  "-html")==0 ){. 
d450: 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d       data.mode =
d460: 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
d470: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
d480: 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30 20 29  (z,"-list")==0 )
d490: 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
d4a0: 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
d4b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
d4c0: 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d  cmp(z,"-line")==
d4d0: 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
d4e0: 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65  mode = MODE_Line
d4f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d500: 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d  strcmp(z,"-colum
d510: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
d520: 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
d530: 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c  _Column;.    }el
d540: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
d550: 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a 20 20  "-csv")==0 ){.  
d560: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
d570: 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
d580: 73 74 72 63 70 79 28 64 61 74 61 2e 73 65 70 61  strcpy(data.sepa
d590: 72 61 74 6f 72 2c 22 2c 22 29 3b 0a 20 20 20 20  rator,",");.    
d5a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
d5b0: 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29  (z,"-separator")
d5c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
d5d0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
d5e0: 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72 2c 22  data.separator,"
d5f0: 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f  %.*s",(int)sizeo
d600: 66 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  f(data.separator
d610: 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  )-1,argv[i]);.  
d620: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
d630: 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65  mp(z,"-nullvalue
d640: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
d650: 2b 2b 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  ++;.      sprint
d660: 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65  f(data.nullvalue
d670: 2c 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a  ,"%.*s",(int)siz
d680: 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  eof(data.nullval
d690: 75 65 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a  ue)-1,argv[i]);.
d6a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
d6b0: 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22  rcmp(z,"-header"
d6c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
d6d0: 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
d6e0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
d6f0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65   strcmp(z,"-nohe
d700: 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ader")==0 ){.   
d710: 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
d720: 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  er = 0;.    }els
d730: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
d740: 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  -echo")==0 ){.  
d750: 20 20 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e 20      data.echoOn 
d760: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
d770: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
d780: 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  il")==0 ){.     
d790: 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
d7a0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
d7b0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72  ( strcmp(z,"-ver
d7c0: 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
d7d0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22     printf("%s\n"
d7e0: 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  , sqlite3_libver
d7f0: 73 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 72  sion());.      r
d800: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
d810: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
d820: 22 2d 69 6e 74 65 72 61 63 74 69 76 65 22 29 3d  "-interactive")=
d830: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69  =0 ){.      stdi
d840: 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
d850: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
d860: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62  if( strcmp(z,"-b
d870: 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
d880: 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
d890: 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20  ractive = 0;.   
d8a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
d8b0: 70 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20  p(z,"-help")==0 
d8c0: 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 2d  || strcmp(z, "--
d8d0: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
d8e0: 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20     usage(1);.   
d8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
d900: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
d910: 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e  : unknown option
d920: 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20  : %s\n", Argv0, 
d930: 7a 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  z);.      fprint
d940: 66 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d 68  f(stderr,"Use -h
d950: 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20 6f  elp for a list o
d960: 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a  f options.\n");.
d970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d980: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d990: 20 7a 46 69 72 73 74 43 6d 64 20 29 7b 0a 20 20   zFirstCmd ){.  
d9a0: 20 20 2f 2a 20 52 75 6e 20 6a 75 73 74 20 74 68    /* Run just th
d9b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66  e command that f
d9c0: 6f 6c 6c 6f 77 73 20 74 68 65 20 64 61 74 61 62  ollows the datab
d9d0: 61 73 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a  ase name.    */.
d9e0: 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d      if( zFirstCm
d9f0: 64 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  d[0]=='.' ){.   
da00: 20 20 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61     do_meta_comma
da10: 6e 64 28 7a 46 69 72 73 74 43 6d 64 2c 20 26 64  nd(zFirstCmd, &d
da20: 61 74 61 29 3b 0a 20 20 20 20 20 20 65 78 69 74  ata);.      exit
da30: 28 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (0);.    }else{.
da40: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
da50: 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74      open_db(&dat
da60: 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
da70: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 61 74 61  qlite3_exec(data
da80: 2e 64 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20  .db, zFirstCmd, 
da90: 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
daa0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
dab0: 20 20 69 66 28 20 72 63 21 3d 30 20 26 26 20 7a    if( rc!=0 && z
dac0: 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20  ErrMsg!=0 ){.   
dad0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
dae0: 65 72 72 2c 22 53 51 4c 20 65 72 72 6f 72 3a 20  err,"SQL error: 
daf0: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
db00: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
db10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
db30: 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63  Run commands rec
db40: 65 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64  eived from stand
db50: 61 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f  ard input.    */
db60: 0a 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69  .    if( stdin_i
db70: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b  s_interactive ){
db80: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f  .      char *zHo
db90: 6d 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  me;.      char *
dba0: 7a 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20  zHistory = 0;.  
dbb0: 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20      printf(.    
dbc0: 20 20 20 20 22 53 51 4c 69 74 65 20 76 65 72 73      "SQLite vers
dbd0: 69 6f 6e 20 25 73 5c 6e 22 0a 20 20 20 20 20 20  ion %s\n".      
dbe0: 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70    "Enter \".help
dbf0: 5c 22 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69  \" for instructi
dc00: 6f 6e 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ons\n",.        
dc10: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
dc20: 6f 6e 28 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  on().      );.  
dc30: 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 69 6e 64      zHome = find
dc40: 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20  _home_dir();.   
dc50: 20 20 20 69 66 28 20 7a 48 6f 6d 65 20 26 26 20     if( zHome && 
dc60: 28 7a 48 69 73 74 6f 72 79 20 3d 20 6d 61 6c 6c  (zHistory = mall
dc70: 6f 63 28 73 74 72 6c 65 6e 28 7a 48 6f 6d 65 29  oc(strlen(zHome)
dc80: 2b 32 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +20))!=0 ){.    
dc90: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 48 69 73      sprintf(zHis
dca0: 74 6f 72 79 2c 22 25 73 2f 2e 73 71 6c 69 74 65  tory,"%s/.sqlite
dcb0: 5f 68 69 73 74 6f 72 79 22 2c 20 7a 48 6f 6d 65  _history", zHome
dcc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64  );.      }.#if d
dcd0: 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44  efined(HAVE_READ
dce0: 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45  LINE) && HAVE_RE
dcf0: 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 20 20 20 20  ADLINE==1.      
dd00: 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29 20 72  if( zHistory ) r
dd10: 65 61 64 5f 68 69 73 74 6f 72 79 28 7a 48 69 73  ead_history(zHis
dd20: 74 6f 72 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  tory);.#endif.  
dd30: 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73      rc = process
dd40: 5f 69 6e 70 75 74 28 26 64 61 74 61 2c 20 30 29  _input(&data, 0)
dd50: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69 73  ;.      if( zHis
dd60: 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tory ){.        
dd70: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 31  stifle_history(1
dd80: 30 30 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69  00);.        wri
dd90: 74 65 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74  te_history(zHist
dda0: 6f 72 79 29 3b 0a 20 20 20 20 20 20 20 20 66 72  ory);.        fr
ddb0: 65 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20  ee(zHistory);.  
ddc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
ddd0: 28 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  (zHome);.    }el
dde0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
ddf0: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61  rocess_input(&da
de00: 74 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20  ta, stdin);.    
de10: 7d 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c  }.  }.  set_tabl
de20: 65 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29  e_name(&data, 0)
de30: 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  ;.  if( db ){.  
de40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6c    if( sqlite3_cl
de50: 6f 73 65 28 64 62 29 21 3d 53 51 4c 49 54 45 5f  ose(db)!=SQLITE_
de60: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  OK ){.      fpri
de70: 6e 74 66 28 73 74 64 65 72 72 2c 22 65 72 72 6f  ntf(stderr,"erro
de80: 72 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61  r closing databa
de90: 73 65 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  se: %s\n", sqlit
dea0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
deb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
dec0: 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.