/ Hex Artifact Content
Login

Artifact 3b067edc098c45caca164bcad1fa79192c3ec5ae:


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 38 33 20 32 30  hell.c,v 1.83 20
0200: 30 33 2f 31 32 2f 30 34 20 32 30 3a 35 31 3a 34  03/12/04 20:51:4
0210: 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  1 drh Exp $.*/.#
0220: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0230: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0240: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0250: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0260: 64 65 20 22 73 71 6c 69 74 65 2e 68 22 0a 23 69  de "sqlite.h".#i
0270: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0280: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
0290: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
02a0: 65 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65  ed(WIN32) && !de
02b0: 66 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f 29  fined(__MACOS__)
02c0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e  .# include <sign
02d0: 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  al.h>.# include 
02e0: 3c 70 77 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  <pwd.h>.# includ
02f0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69  e <unistd.h>.# i
0300: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0310: 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  s.h>.#endif..#if
0320: 64 65 66 20 5f 5f 4d 41 43 4f 53 5f 5f 0a 23 20  def __MACOS__.# 
0330: 69 6e 63 6c 75 64 65 20 3c 63 6f 6e 73 6f 6c 65  include <console
0340: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0350: 69 67 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ignal.h>.# inclu
0360: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20  de <unistd.h>.# 
0370: 69 6e 63 6c 75 64 65 20 3c 65 78 74 72 61 73 2e  include <extras.
0380: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 46 69  h>.# include <Fi
0390: 6c 65 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  les.h>.# include
03a0: 20 3c 46 6f 6c 64 65 72 73 2e 68 3e 0a 23 65 6e   <Folders.h>.#en
03b0: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
03c0: 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20  (HAVE_READLINE) 
03d0: 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  && HAVE_READLINE
03e0: 3d 3d 31 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72  ==1.# include <r
03f0: 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65  eadline/readline
0400: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72  .h>.# include <r
0410: 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e  eadline/history.
0420: 68 3e 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h>.#else.# defin
0430: 65 20 72 65 61 64 6c 69 6e 65 28 70 29 20 6c 6f  e readline(p) lo
0440: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 70 2c 73 74  cal_getline(p,st
0450: 64 69 6e 29 0a 23 20 64 65 66 69 6e 65 20 61 64  din).# define ad
0460: 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  d_history(X).# d
0470: 65 66 69 6e 65 20 72 65 61 64 5f 68 69 73 74 6f  efine read_histo
0480: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 77  ry(X).# define w
0490: 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a  rite_history(X).
04a0: 23 20 64 65 66 69 6e 65 20 73 74 69 66 6c 65 5f  # define stifle_
04b0: 68 69 73 74 6f 72 79 28 58 29 0a 23 65 6e 64 69  history(X).#endi
04c0: 66 0a 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  f../* Make sure 
04d0: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
04e0: 72 6f 74 6f 74 79 70 65 2e 0a 2a 2f 0a 65 78 74  rototype..*/.ext
04f0: 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28 29  ern int isatty()
0500: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
0510: 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70  lowing is the op
0520: 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  en SQLite databa
0530: 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70  se.  We make a p
0540: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69  ointer.** to thi
0550: 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61  s database a sta
0560: 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20  tic variable so 
0570: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61  that it can be a
0580: 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68  ccessed.** by th
0590: 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72  e SIGINT handler
05a0: 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61   to interrupt da
05b0: 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e  tabase processin
05c0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  g..*/.static sql
05d0: 69 74 65 20 2a 64 62 20 3d 20 30 3b 0a 0a 2f 2a  ite *db = 0;../*
05e0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
05f0: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
0600: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
0610: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
0620: 63 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72  c int seenInterr
0630: 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  upt = 0;../*.** 
0640: 54 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65  This is the name
0650: 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e   of our program.
0660: 20 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61   It is set in ma
0670: 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e  in(), used.** in
0680: 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68   a number of oth
0690: 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c  er places, mostl
06a0: 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  y for error mess
06b0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
06c0: 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a  char *Argv0;../*
06d0: 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e  .** Prompt strin
06e0: 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  gs. Initialized 
06f0: 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c  in main. Settabl
0700: 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f  e with.**   .pro
0710: 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75  mpt main continu
0720: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
0730: 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b   mainPrompt[20];
0740: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69       /* First li
0750: 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  ne prompt. defau
0760: 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f  lt: "sqlite> "*/
0770: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e  .static char con
0780: 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b  tinuePrompt[20];
0790: 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e   /* Continuation
07a0: 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74   prompt. default
07b0: 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a  : "   ...> " */.
07c0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
07d0: 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20 69  es if a string i
07e0: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  s a number of no
07f0: 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  t..*/.extern int
0800: 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28   sqliteIsNumber(
0810: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 2f  const char*);../
0820: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0830: 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f  e reads a line o
0840: 66 20 74 65 78 74 20 66 72 6f 6d 20 73 74 61 6e  f text from stan
0850: 64 61 72 64 20 69 6e 70 75 74 2c 20 73 74 6f 72  dard input, stor
0860: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
0870: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
0880: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
0890: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
08a0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
08b0: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
08c0: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
08d0: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
08e0: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
08f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
0900: 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65  face is like "re
0910: 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63  adline" but no c
0920: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74  ommand-line edit
0930: 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a  ing.** is done..
0940: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
0950: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
0960: 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c  ar *zPrompt, FIL
0970: 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  E *in){.  char *
0980: 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69  zLine;.  int nLi
0990: 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  ne;.  int n;.  i
09a0: 6e 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20 7a  nt eol;..  if( z
09b0: 50 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f 6d  Prompt && *zProm
09c0: 70 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  pt ){.    printf
09d0: 28 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b 0a  ("%s",zPrompt);.
09e0: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
09f0: 74 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65 20  t);.  }.  nLine 
0a00: 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d  = 100;.  zLine =
0a10: 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29   malloc( nLine )
0a20: 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30  ;.  if( zLine==0
0a30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
0a40: 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b   = 0;.  eol = 0;
0a50: 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29  .  while( !eol )
0a60: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
0a70: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
0a80: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
0a90: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
0aa0: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
0ab0: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
0ac0: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
0ad0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
0ae0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
0af0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
0b00: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
0b10: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
0b20: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
0b30: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
0b40: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
0b50: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
0b60: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
0b70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0b80: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
0b90: 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b  zLine[n] ){ n++;
0ba0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
0bb0: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
0bc0: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
0bd0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
0be0: 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d  = 0;.      eol =
0bf0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
0c00: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
0c10: 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20   zLine, n+1 );. 
0c20: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
0c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
0c40: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
0c50: 66 20 69 6e 70 75 74 20 74 65 78 74 2e 20 20 22  f input text.  "
0c60: 69 73 61 74 74 79 22 20 69 73 20 74 72 75 65 20  isatty" is true 
0c70: 69 66 20 74 65 78 74 0a 2a 2a 20 69 73 20 63 6f  if text.** is co
0c80: 6d 69 6e 67 20 66 72 6f 6d 20 61 20 74 65 72 6d  ming from a term
0c90: 69 6e 61 6c 2e 20 20 49 6e 20 74 68 61 74 20 63  inal.  In that c
0ca0: 61 73 65 2c 20 77 65 20 69 73 73 75 65 20 61 20  ase, we issue a 
0cb0: 70 72 6f 6d 70 74 20 61 6e 64 0a 2a 2a 20 61 74  prompt and.** at
0cc0: 74 65 6d 70 74 20 74 6f 20 75 73 65 20 22 72 65  tempt to use "re
0cd0: 61 64 6c 69 6e 65 22 20 66 6f 72 20 63 6f 6d 6d  adline" for comm
0ce0: 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67  and-line editing
0cf0: 2e 20 20 49 66 20 22 69 73 61 74 74 79 22 0a 2a  .  If "isatty".*
0d00: 2a 20 69 73 20 66 61 6c 73 65 2c 20 75 73 65 20  * is false, use 
0d10: 22 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 22 20  "local_getline" 
0d20: 69 6e 73 74 65 61 64 20 6f 66 20 22 72 65 61 64  instead of "read
0d30: 6c 69 6e 65 22 20 61 6e 64 20 69 73 73 75 65 20  line" and issue 
0d40: 6e 6f 20 70 72 6f 6d 70 74 2e 0a 2a 2a 0a 2a 2a  no prompt..**.**
0d50: 20 7a 50 72 69 6f 72 20 69 73 20 61 20 73 74 72   zPrior is a str
0d60: 69 6e 67 20 6f 66 20 70 72 69 6f 72 20 74 65 78  ing of prior tex
0d70: 74 20 72 65 74 72 69 65 76 65 64 2e 20 20 49 66  t retrieved.  If
0d80: 20 6e 6f 74 20 74 68 65 20 65 6d 70 74 79 0a 2a   not the empty.*
0d90: 2a 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 69  * string, then i
0da0: 73 73 75 65 20 61 20 63 6f 6e 74 69 6e 75 61 74  ssue a continuat
0db0: 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a 2a 2f 0a 73  ion prompt..*/.s
0dc0: 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f  tatic char *one_
0dd0: 69 6e 70 75 74 5f 6c 69 6e 65 28 63 6f 6e 73 74  input_line(const
0de0: 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 46   char *zPrior, F
0df0: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
0e00: 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61   *zPrompt;.  cha
0e10: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66  r *zResult;.  if
0e20: 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( in!=0 ){.    r
0e30: 65 74 75 72 6e 20 6c 6f 63 61 6c 5f 67 65 74 6c  eturn local_getl
0e40: 69 6e 65 28 30 2c 20 69 6e 29 3b 0a 20 20 7d 0a  ine(0, in);.  }.
0e50: 20 20 69 66 28 20 7a 50 72 69 6f 72 20 26 26 20    if( zPrior && 
0e60: 7a 50 72 69 6f 72 5b 30 5d 20 29 7b 0a 20 20 20  zPrior[0] ){.   
0e70: 20 7a 50 72 6f 6d 70 74 20 3d 20 63 6f 6e 74 69   zPrompt = conti
0e80: 6e 75 65 50 72 6f 6d 70 74 3b 0a 20 20 7d 65 6c  nuePrompt;.  }el
0e90: 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20  se{.    zPrompt 
0ea0: 3d 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 20 20  = mainPrompt;.  
0eb0: 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20 72 65  }.  zResult = re
0ec0: 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b  adline(zPrompt);
0ed0: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 29  .  if( zResult )
0ee0: 20 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52 65   add_history(zRe
0ef0: 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
0f00: 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 73 74 72 75  zResult;.}..stru
0f10: 63 74 20 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65  ct previous_mode
0f20: 5f 64 61 74 61 20 7b 0a 20 20 69 6e 74 20 76 61  _data {.  int va
0f30: 6c 69 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 49  lid;        /* I
0f40: 73 20 74 68 65 72 65 20 6c 65 67 69 74 20 64 61  s there legit da
0f50: 74 61 20 69 6e 20 68 65 72 65 3f 20 2a 2f 0a 20  ta in here? */. 
0f60: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 69 6e 74   int mode;.  int
0f70: 20 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 69   showHeader;.  i
0f80: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
0f90: 3b 0a 7d 3b 0a 2f 2a 0a 2a 2a 20 41 6e 20 70 6f  ;.};./*.** An po
0fa0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
0fb0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0fc0: 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65 64  ucture is passed
0fd0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6d 61 69   from.** the mai
0fe0: 6e 20 70 72 6f 67 72 61 6d 20 74 6f 20 74 68 65  n program to the
0ff0: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
1000: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
1010: 75 6e 69 63 61 74 65 0a 2a 2a 20 73 74 61 74 65  unicate.** state
1020: 20 61 6e 64 20 6d 6f 64 65 20 69 6e 66 6f 72 6d   and mode inform
1030: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ation..*/.struct
1040: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 7b   callback_data {
1050: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 20 20  .  sqlite *db;  
1060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1070: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1080: 6e 74 20 65 63 68 6f 4f 6e 3b 20 20 20 20 20 20  nt echoOn;      
1090: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
10a0: 20 65 63 68 6f 20 69 6e 70 75 74 20 63 6f 6d 6d   echo input comm
10b0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ands */.  int cn
10c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
10e0: 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20  cords displayed 
10f0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45  so far */.  FILE
1100: 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20   *out;          
1110: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
1120: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
1130: 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  t mode;         
1140: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75       /* An outpu
1150: 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a  t mode setting *
1160: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
1170: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  er;        /* Tr
1180: 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d  ue to show colum
1190: 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20  n names in List 
11a0: 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a  or Column mode *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
11c0: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
11d0: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
11e0: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
11f0: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
1200: 61 72 20 73 65 70 61 72 61 74 6f 72 5b 32 30 5d  ar separator[20]
1210: 3b 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f  ;    /* Separato
1220: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
1230: 4d 4f 44 45 5f 4c 69 73 74 20 2a 2f 0a 20 20 69  MODE_List */.  i
1240: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
1250: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
1260: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
1270: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
1280: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
1290: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
12a0: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
12b0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
12c0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
12d0: 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b 20 20  nullvalue[20];  
12e0: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
12f0: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
1300: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
1310: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
1320: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1330: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1340: 20 73 74 72 75 63 74 20 70 72 65 76 69 6f 75 73   struct previous
1350: 5f 6d 6f 64 65 5f 64 61 74 61 20 65 78 70 6c 61  _mode_data expla
1360: 69 6e 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  inPrev;.        
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20 6d 6f   /* Holds the mo
1390: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6a  de information j
13a0: 75 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  ust before.     
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 2a 2a 20 2e 65 78 70 6c 61 69 6e 20      ** .explain 
13d0: 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74  ON */.  char out
13e0: 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41  file[FILENAME_MA
13f0: 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  X]; /* Filename 
1400: 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f  for *out */.  co
1410: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c  nst char *zDbFil
1420: 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d  ename;    /* nam
1430: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1440: 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e file */.};../*
1450: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
1460: 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e  e allowed modes.
1470: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45  .*/.#define MODE
1480: 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20  _Line     0  /* 
1490: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c  One column per l
14a0: 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65  ine.  Blank line
14b0: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73   between records
14c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
14d0: 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20  _Column   1  /* 
14e0: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
14f0: 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75  ine in neat colu
1500: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mns */.#define M
1510: 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20  ODE_List     2  
1520: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
1530: 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65  r line with a se
1540: 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  parator */.#defi
1550: 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20  ne MODE_Semi    
1560: 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d   3  /* Same as M
1570: 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70  ODE_List but app
1580: 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20  end ";" to each 
1590: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
15a0: 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20  MODE_Html     4 
15b0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20   /* Generate an 
15c0: 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23  XHTML table */.#
15d0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65  define MODE_Inse
15e0: 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72  rt   5  /* Gener
15f0: 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22  ate SQL "insert"
1600: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23   statements */.#
1610: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4e 55 4d 5f  define MODE_NUM_
1620: 4f 46 20 20 20 36 20 20 2f 2a 20 54 68 65 20 6e  OF   6  /* The n
1630: 75 6d 62 65 72 20 6f 66 20 6d 6f 64 65 73 20 28  umber of modes (
1640: 6e 6f 74 20 61 20 6d 6f 64 65 20 69 74 73 65 6c  not a mode itsel
1650: 66 29 20 2a 2f 0a 0a 63 68 61 72 20 2a 6d 6f 64  f) */..char *mod
1660: 65 44 65 73 63 72 5b 4d 4f 44 45 5f 4e 55 4d 5f  eDescr[MODE_NUM_
1670: 4f 46 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22  OF] = {.  "line"
1680: 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20  ,.  "column",.  
1690: 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22  "list",.  "semi"
16a0: 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69  ,.  "html",.  "i
16b0: 6e 73 65 72 74 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nsert".};../*.**
16c0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
16d0: 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  nts in an array.
16e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79  */.#define Array
16f0: 53 69 7a 65 28 58 29 20 20 28 73 69 7a 65 6f 66  Size(X)  (sizeof
1700: 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29  (X)/sizeof(X[0])
1710: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  )../*.** Output 
1720: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
1730: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
1740: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
1750: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
1760: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1770: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
1780: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
1790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
17a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
17b0: 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20 20   nSingle = 0;.  
17c0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
17d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
17e0: 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67 6c  ]=='\'' ) nSingl
17f0: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  e++;.  }.  if( n
1800: 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Single==0 ){.   
1810: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25   fprintf(out,"'%
1820: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
1830: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1840: 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65  ,"'");.    while
1850: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
1860: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a  r(i=0; z[i] && z
1870: 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  [i]!='\''; i++){
1880: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  }.      if( i==0
1890: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18a0: 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a 20  ntf(out,"''");. 
18b0: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
18c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
18d0: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
18e0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
18f0: 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20 20  .*s''",i,z);.   
1900: 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20       z += i+1;. 
1910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1920: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1930: 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20  "%s",z);.       
1940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1950: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1960: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d 0a  f(out,"'");.  }.
1970: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
1980: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
1990: 20 77 69 74 68 20 63 68 61 72 61 63 74 65 72 73   with characters
19a0: 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 61   that are specia
19b0: 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63  l to.** HTML esc
19c0: 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aped..*/.static 
19d0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c  void output_html
19e0: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
19f0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1a00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 77 68  ){.  int i;.  wh
1a10: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66  ile( *z ){.    f
1a20: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
1a30: 7a 5b 69 5d 21 3d 27 3c 27 20 26 26 20 7a 5b 69  z[i]!='<' && z[i
1a40: 5d 21 3d 27 26 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]!='&'; i++){}. 
1a50: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
1a60: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a70: 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20  "%.*s",i,z);.   
1a80: 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d   }.    if( z[i]=
1a90: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 66 70  ='<' ){.      fp
1aa0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22  rintf(out,"&lt;"
1ab0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1ac0: 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20   z[i]=='&' ){.  
1ad0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ae0: 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65  "&amp;");.    }e
1af0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
1b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d  ;.    }.    z +=
1b10: 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f   i + 1;.  }.}../
1b20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b30: 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20  e runs when the 
1b40: 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72  user presses Ctr
1b50: 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  l-C.*/.static vo
1b60: 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e  id interrupt_han
1b70: 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64  dler(int NotUsed
1b80: 29 7b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75  ){.  seenInterru
1b90: 70 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 64 62  pt = 1;.  if( db
1ba0: 20 29 20 73 71 6c 69 74 65 5f 69 6e 74 65 72 72   ) sqlite_interr
1bb0: 75 70 74 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  upt(db);.}../*.*
1bc0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
1bd0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
1be0: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
1bf0: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
1c00: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
1c10: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
1c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c30: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
1c40: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
1c50: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
1c60: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
1c70: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
1c80: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
1c90: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
1ca0: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  k_data*)pArg;.  
1cb0: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
1cc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
1cd0: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
1ce0: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
1cf0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
1d00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
1d10: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
1d20: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
1d30: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 43 6f  en = strlen(azCo
1d40: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  l[i]);.        i
1d50: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
1d60: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
1d70: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
1d80: 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
1d90: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  t,"\n");.      f
1da0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
1db0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
1dc0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a  rintf(p->out,"%*
1dd0: 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20 61 7a  s = %s\n", w, az
1de0: 43 6f 6c 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  Col[i], .       
1df0: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
1e00: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
1e10: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
1e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1e30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e40: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
1e50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
1e60: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
1e70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
1e80: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
1e90: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
1ea0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
1eb0: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
1ec0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
1ed0: 20 20 20 20 77 20 3d 20 70 2d 3e 63 6f 6c 57 69      w = p->colWi
1ee0: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
1ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f00: 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20        w = 0;.   
1f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f20: 20 20 20 69 66 28 20 77 3c 3d 30 20 29 7b 0a 20     if( w<=0 ){. 
1f30: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73             w = s
1f40: 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 20 3f  trlen(azCol[i] ?
1f50: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
1f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f70: 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a   w<10 ) w = 10;.
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1f90: 73 74 72 6c 65 6e 28 61 7a 41 72 67 20 26 26 20  strlen(azArg && 
1fa0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
1fb0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
1fc0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
1fd0: 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e   if( w<n ) w = n
1fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ff0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
2000: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
2010: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
2020: 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c         p->actual
2030: 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20  Width[i] = w;.  
2040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2050: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
2060: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
2070: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
2080: 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77  out,"%-*.*s%s",w
2090: 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d  ,w,azCol[i], i==
20a0: 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22  nArg-1 ? "\n": "
20b0: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
20c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20d0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
20e0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
20f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
2100: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2110: 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20        int w;.   
2120: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
2130: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
2140: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
2150: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
2160: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d  ->actualWidth[i]
2170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2180: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2190: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
21a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
21c0: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
21d0: 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  w,w,"-----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20  --------".      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20  --------",.     
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2260: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a  ==nArg-1 ? "\n":
2270: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
2280: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2290: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22a0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
22b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
22c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
22d0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
22e0: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
22f0: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
2300: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
2310: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
2320: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
2330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2340: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
2350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2360: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
2370: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20  -*.*s%s",w,w,.  
2380: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2390: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
23a0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20 69 3d  p->nullvalue, i=
23b0: 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20  =nArg-1 ? "\n": 
23c0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "  ");.      }. 
23d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23e0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
23f0: 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65 20 4d  Semi:.    case M
2400: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
2410: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
2420: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
2430: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
2440: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
2450: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
2460: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
2470: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69  s%s",azCol[i], i
2480: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 20  ==nArg-1 ? "\n" 
2490: 3a 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  : p->separator);
24a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
24c0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
24d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24e0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
24f0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
2500: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
2510: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
2520: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 3b 0a 20 20 20  ->nullvalue;.   
2530: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
2540: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
2550: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
2560: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
2570: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
2580: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
2590: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tor);.        }e
25a0: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d  lse if( p->mode=
25b0: 3d 4d 4f 44 45 5f 53 65 6d 69 20 29 7b 0a 20 20  =MODE_Semi ){.  
25c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
25d0: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
25e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25f0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
2600: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
2610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2620: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2630: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
2640: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
2650: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
2660: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
2670: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  r ){.        fpr
2680: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
2690: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  >");.        for
26a0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
26b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  +){.          fp
26c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
26d0: 48 3e 25 73 3c 2f 54 48 3e 22 2c 61 7a 43 6f 6c  H>%s</TH>",azCol
26e0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
26f0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2700: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
2710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2720: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
2730: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72  break;.      fpr
2740: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
2750: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
2760: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
2770: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
2780: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29  f(p->out,"<TD>")
2790: 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  ;.        output
27a0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
27b0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
27c0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
27d0: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
27e0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
27f0: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
2800: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
2810: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
2820: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
2830: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2840: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
2850: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
2860: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2870: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
2880: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
2890: 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e 7a 44  s VALUES(",p->zD
28a0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
28b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
28c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28d0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69 3e 30  char *zSep = i>0
28e0: 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20 20 20   ? ",": "";.    
28f0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
2900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2910: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
2920: 22 25 73 4e 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a  "%sNULL",zSep);.
2930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2940: 28 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72  ( sqliteIsNumber
2950: 28 61 7a 41 72 67 5b 69 5d 29 20 29 7b 0a 20 20  (azArg[i]) ){.  
2960: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2970: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53  p->out,"%s%s",zS
2980: 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ep, azArg[i]);. 
2990: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 70          if( zSep
29b0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d  [0] ) fprintf(p-
29c0: 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b  >out,"%s",zSep);
29d0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
29e0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
29f0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
2a00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a10: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
2a20: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
2a30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
2a60: 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  et the destinati
2a70: 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f  on table field o
2a80: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 5f 64  f the callback_d
2a90: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 6f  ata structure to
2aa0: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
2ab0: 74 68 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e  the table given.
2ac0: 20 20 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f    Escape any quo
2ad0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  te characters in
2ae0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61   the.** table na
2af0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
2b00: 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d  id set_table_nam
2b10: 65 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  e(struct callbac
2b20: 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74  k_data *p, const
2b30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
2b40: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74   int i, n;.  int
2b50: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 63 68   needQuote;.  ch
2b60: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
2b70: 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
2b80: 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
2b90: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
2ba0: 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
2bb0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
2bc0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 65  0 ) return;.  ne
2bd0: 65 64 51 75 6f 74 65 20 3d 20 21 69 73 61 6c 70  edQuote = !isalp
2be0: 68 61 28 2a 7a 4e 61 6d 65 29 20 26 26 20 2a 7a  ha(*zName) && *z
2bf0: 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20 66 6f 72  Name!='_';.  for
2c00: 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  (i=n=0; zName[i]
2c10: 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20  ; i++, n++){.   
2c20: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 4e   if( !isalnum(zN
2c30: 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61 6d 65  ame[i]) && zName
2c40: 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20 20 20  [i]!='_' ){.    
2c50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 31 3b    needQuote = 1;
2c60: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
2c70: 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b  [i]=='\'' ) n++;
2c80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2c90: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e 20 2b   needQuote ) n +
2ca0: 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  = 2;.  z = p->zD
2cb0: 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
2cc0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
2cd0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
2ce0: 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
2cf0: 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 0a  of memory!\n");.
2d00: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
2d10: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  n = 0;.  if( 
2d20: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  needQuote ) z[n+
2d30: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72  +] = '\'';.  for
2d40: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
2d50: 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
2d60: 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
2d70: 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27   if( zName[i]=='
2d80: 5c 27 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27  \'' ) z[n++] = '
2d90: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
2da0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  eedQuote ) z[n++
2db0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e 5d  ] = '\'';.  z[n]
2dc0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
2dd0: 68 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65  his is a differe
2de0: 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  nt callback rout
2df0: 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d  ine used for dum
2e00: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
2e10: 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72  e..** Each row r
2e20: 65 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20  eceived by this 
2e30: 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  callback consist
2e40: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  s of a table nam
2e50: 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  e,.** the table 
2e60: 74 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72  type ("index" or
2e70: 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51   "table") and SQ
2e80: 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  L to create the 
2e90: 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72  table..** This r
2ea0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72  outine should pr
2eb0: 69 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69  int text suffici
2ec0: 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ent to recreate 
2ed0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
2ee0: 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61  atic int dump_ca
2ef0: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
2f00: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
2f10: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
2f20: 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 73 74 72 75  **azCol){.  stru
2f30: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
2f40: 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63 61   *p = (struct ca
2f50: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29 70 41  llback_data *)pA
2f60: 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  rg;.  if( nArg!=
2f70: 33 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  3 ) return 1;.  
2f80: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
2f90: 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 32  "%s;\n", azArg[2
2fa0: 5d 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ]);.  if( strcmp
2fb0: 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 6c 65  (azArg[1],"table
2fc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ")==0 ){.    str
2fd0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
2fe0: 61 20 64 32 3b 0a 20 20 20 20 64 32 20 3d 20 2a  a d2;.    d2 = *
2ff0: 70 3b 0a 20 20 20 20 64 32 2e 6d 6f 64 65 20 3d  p;.    d2.mode =
3000: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
3010: 20 20 64 32 2e 7a 44 65 73 74 54 61 62 6c 65 20    d2.zDestTable 
3020: 3d 20 30 3b 0a 20 20 20 20 73 65 74 5f 74 61 62  = 0;.    set_tab
3030: 6c 65 5f 6e 61 6d 65 28 26 64 32 2c 20 61 7a 41  le_name(&d2, azA
3040: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69  rg[0]);.    sqli
3050: 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 70  te_exec_printf(p
3060: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45  ->db,.       "SE
3070: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
3080: 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ",.       callba
3090: 63 6b 2c 20 26 64 32 2c 20 30 2c 20 61 7a 41 72  ck, &d2, 0, azAr
30a0: 67 5b 30 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20  g[0].    );.    
30b0: 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26  set_table_name(&
30c0: 64 32 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  d2, 0);.  }.  re
30d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
30e0: 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20   Text of a help 
30f0: 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69  message.*/.stati
3100: 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d  c char zHelp[] =
3110: 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20  .  ".databases  
3120: 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
3130: 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
3140: 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
3150: 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 75 6d  bases\n".  ".dum
3160: 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
3170: 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61     Dump the data
3180: 62 61 73 65 20 69 6e 20 61 20 74 65 78 74 20 66  base in a text f
3190: 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 2e 65 63 68  ormat\n".  ".ech
31a0: 6f 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  o ON|OFF        
31b0: 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20     Turn command 
31c0: 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  echo on or off\n
31d0: 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20 20  ".  ".exit      
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
31f0: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22   this program\n"
3200: 0a 20 20 22 2e 65 78 70 6c 61 69 6e 20 4f 4e 7c  .  ".explain ON|
3210: 4f 46 46 20 20 20 20 20 20 20 20 54 75 72 6e 20  OFF        Turn 
3220: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 75 69 74  output mode suit
3230: 61 62 6c 65 20 66 6f 72 20 45 58 50 4c 41 49 4e  able for EXPLAIN
3240: 20 6f 6e 20 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20   on or off.\n". 
3250: 20 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e 7c   ".header(s) ON|
3260: 4f 46 46 20 20 20 20 20 20 54 75 72 6e 20 64 69  OFF      Turn di
3270: 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73  splay of headers
3280: 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
3290: 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20  ".help          
32a0: 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69          Show thi
32b0: 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22  s message\n".  "
32c0: 2e 69 6e 64 69 63 65 73 20 54 41 42 4c 45 20 20  .indices TABLE  
32d0: 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65         Show name
32e0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
32f0: 20 6f 6e 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22   on TABLE\n".  "
3300: 2e 6d 6f 64 65 20 4d 4f 44 45 20 20 20 20 20 20  .mode MODE      
3310: 20 20 20 20 20 20 20 53 65 74 20 6d 6f 64 65 20         Set mode 
3320: 74 6f 20 6f 6e 65 20 6f 66 20 5c 22 6c 69 6e 65  to one of \"line
3330: 28 73 29 5c 22 2c 20 5c 22 63 6f 6c 75 6d 6e 28  (s)\", \"column(
3340: 73 29 5c 22 2c 20 5c 6e 22 0a 20 20 22 20 20 20  s)\", \n".  "   
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 5c 22 69 6e 73 65 72 74 5c 22 2c 20      \"insert\", 
3370: 5c 22 6c 69 73 74 5c 22 2c 20 6f 72 20 5c 22 68  \"list\", or \"h
3380: 74 6d 6c 5c 22 5c 6e 22 0a 20 20 22 2e 6d 6f 64  tml\"\n".  ".mod
3390: 65 20 69 6e 73 65 72 74 20 54 41 42 4c 45 20 20  e insert TABLE  
33a0: 20 20 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20     Generate SQL 
33b0: 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  insert statement
33c0: 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20  s for TABLE\n". 
33d0: 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
33e0: 49 4e 47 20 20 20 20 20 20 50 72 69 6e 74 20 53  ING      Print S
33f0: 54 52 49 4e 47 20 69 6e 73 74 65 61 64 20 6f 66  TRING instead of
3400: 20 6e 6f 74 68 69 6e 67 20 66 6f 72 20 4e 55 4c   nothing for NUL
3410: 4c 20 64 61 74 61 5c 6e 22 0a 20 20 22 2e 6f 75  L data\n".  ".ou
3420: 74 70 75 74 20 46 49 4c 45 4e 41 4d 45 20 20 20  tput FILENAME   
3430: 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
3440: 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20  to FILENAME\n". 
3450: 20 22 2e 6f 75 74 70 75 74 20 73 74 64 6f 75 74   ".output stdout
3460: 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
3470: 74 70 75 74 20 74 6f 20 74 68 65 20 73 63 72 65  tput to the scre
3480: 65 6e 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74  en\n".  ".prompt
3490: 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20   MAIN CONTINUE  
34a0: 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e  Replace the stan
34b0: 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a  dard prompts\n".
34c0: 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
34d0: 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
34e0: 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20  his program\n". 
34f0: 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45   ".read FILENAME
3500: 20 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65           Execute
3510: 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45   SQL in FILENAME
3520: 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f  \n".  ".schema ?
3530: 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68  TABLE?        Sh
3540: 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ow the CREATE st
3550: 61 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e  atements\n".  ".
3560: 73 65 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47  separator STRING
3570: 20 20 20 20 20 20 43 68 61 6e 67 65 20 73 65 70        Change sep
3580: 61 72 61 74 6f 72 20 73 74 72 69 6e 67 20 66 6f  arator string fo
3590: 72 20 5c 22 6c 69 73 74 5c 22 20 6d 6f 64 65 5c  r \"list\" mode\
35a0: 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20  n".  ".show     
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
35c0: 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
35d0: 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
35e0: 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22   settings\n".  "
35f0: 2e 74 61 62 6c 65 73 20 3f 50 41 54 54 45 52 4e  .tables ?PATTERN
3600: 3f 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65  ?      List name
3610: 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63  s of tables matc
3620: 68 69 6e 67 20 61 20 70 61 74 74 65 72 6e 5c 6e  hing a pattern\n
3630: 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53  ".  ".timeout MS
3640: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20              Try 
3650: 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74  opening locked t
3660: 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c  ables for MS mil
3670: 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22  liseconds\n".  "
3680: 2e 77 69 64 74 68 20 4e 55 4d 20 4e 55 4d 20 2e  .width NUM NUM .
3690: 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d  ..     Set colum
36a0: 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63  n widths for \"c
36b0: 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a  olumn\" mode\n".
36c0: 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;../* Forward re
36d0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
36e0: 63 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 69  c void process_i
36f0: 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
3700: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
3710: 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
3720: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
3730: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
3740: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
3750: 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
3760: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
3770: 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
3780: 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
3790: 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
37a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37b0: 6f 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63  open_db(struct c
37c0: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
37d0: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
37e0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
37f0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 70  rrMsg = 0;.    p
3800: 2d 3e 64 62 20 3d 20 64 62 20 3d 20 73 71 6c 69  ->db = db = sqli
3810: 74 65 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  te_open(p->zDbFi
3820: 6c 65 6e 61 6d 65 2c 20 30 36 36 36 2c 20 26 7a  lename, 0666, &z
3830: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
3840: 20 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   db==0 ){.      
3850: 70 2d 3e 64 62 20 3d 20 64 62 20 3d 20 73 71 6c  p->db = db = sql
3860: 69 74 65 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  ite_open(p->zDbF
3870: 69 6c 65 6e 61 6d 65 2c 20 30 34 34 34 2c 20 26  ilename, 0444, &
3880: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
3890: 69 66 28 20 64 62 3d 3d 30 20 29 7b 0a 20 20 20  if( db==0 ){.   
38a0: 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
38b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
38c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
38d0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
38e0: 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
38f0: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
3900: 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
3910: 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e, zErrMsg);.   
3920: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3930: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
3940: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
3950: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 25 73  open database %s
3960: 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  \n", p->zDbFilen
3970: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
3980: 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
3990: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
39a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
39b0: 64 65 72 72 2c 22 44 61 74 61 62 61 73 65 20 5c  derr,"Database \
39c0: 22 25 73 5c 22 20 6f 70 65 6e 65 64 20 52 45 41  "%s\" opened REA
39d0: 44 20 4f 4e 4c 59 21 5c 6e 22 2c 20 70 2d 3e 7a  D ONLY!\n", p->z
39e0: 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
39f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
3a00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ../*.** If an in
3a10: 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20  put line begins 
3a20: 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e  with "." then in
3a30: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
3a40: 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20  e to.** process 
3a50: 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
3a60: 20 52 65 74 75 72 6e 20 31 20 74 6f 20 65 78 69   Return 1 to exi
3a70: 74 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69  t and 0 to conti
3a80: 6e 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nue..*/.static i
3a90: 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61  nt do_meta_comma
3aa0: 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  nd(char *zLine, 
3ab0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
3ac0: 64 61 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74 20  data *p){.  int 
3ad0: 69 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72  i = 1;.  int nAr
3ae0: 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20  g = 0;.  int n, 
3af0: 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  c;.  int rc = 0;
3b00: 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35  .  char *azArg[5
3b10: 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  0];..  /* Parse 
3b20: 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69  the input line i
3b30: 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  nto tokens..  */
3b40: 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b  .  while( zLine[
3b50: 69 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79  i] && nArg<Array
3b60: 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20  Size(azArg) ){. 
3b70: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
3b80: 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  e(zLine[i]) ){ i
3b90: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c  ++; }.    if( zL
3ba0: 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27 20 7c 7c 20  ine[i]=='\'' || 
3bb0: 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22 27 20 29 7b  zLine[i]=='"' ){
3bc0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  .      int delim
3bd0: 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b 0a 20   = zLine[i++];. 
3be0: 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
3bf0: 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a  +] = &zLine[i];.
3c00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
3c10: 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69  ne[i] && zLine[i
3c20: 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 69 2b 2b 3b  ]!=delim ){ i++;
3c30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
3c40: 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a  ne[i]==delim ){.
3c50: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b          zLine[i+
3c60: 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  +] = 0;.      }.
3c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c80: 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
3c90: 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20   &zLine[i];.    
3ca0: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69    while( zLine[i
3cb0: 5d 20 26 26 20 21 69 73 73 70 61 63 65 28 7a 4c  ] && !isspace(zL
3cc0: 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  ine[i]) ){ i++; 
3cd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
3ce0: 65 5b 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b  e[i] ) zLine[i++
3cf0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
3d00: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
3d10: 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
3d20: 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
3d30: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
3d40: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41 72   n = strlen(azAr
3d50: 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41  g[0]);.  c = azA
3d60: 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69 66 28 20  rg[0][0];.  if( 
3d70: 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
3d80: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
3d90: 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
3da0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  n)==0 ){.    str
3db0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
3dc0: 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  a data;.    char
3dd0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
3de0: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
3df0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
3e00: 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
3e10: 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
3e20: 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
3e30: 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
3e40: 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  _Column;.    sql
3e50: 69 74 65 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ite_exec(p->db, 
3e60: 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65  "PRAGMA database
3e70: 5f 6c 69 73 74 3b 20 22 2c 20 63 61 6c 6c 62 61  _list; ", callba
3e80: 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
3e90: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
3ea0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66  rrMsg ){.      f
3eb0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
3ec0: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
3ed0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
3ee0: 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a 45 72 72  ite_freemem(zErr
3ef0: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Msg);.    }.  }e
3f00: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
3f10: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
3f20: 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
3f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
3f40: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
3f50: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
3f60: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
3f70: 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
3f80: 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
3f90: 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
3fa0: 20 20 20 20 20 73 71 6c 69 74 65 5f 65 78 65 63       sqlite_exec
3fb0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
3fc0: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
3fd0: 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
3fe0: 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
3ff0: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
4000: 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
4010: 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20 20 20 20   NOT NULL ".    
4020: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 73 75      "ORDER BY su
4030: 62 73 74 72 28 74 79 70 65 2c 32 2c 31 29 2c 20  bstr(type,2,1), 
4040: 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 64  name",.        d
4050: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
4060: 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
4070: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4080: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4090: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
40a0: 20 26 26 20 7a 45 72 72 4d 73 67 3d 3d 30 3b 20   && zErrMsg==0; 
40b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
40c0: 6c 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66  lite_exec_printf
40d0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
40e0: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
40f0: 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
4100: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
4110: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
4120: 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 27 25  tbl_name LIKE '%
4130: 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 6d 65  q' AND type!='me
4140: 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20  ta' AND sql NOT 
4150: 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20  NULL ".         
4160: 20 22 4f 52 44 45 52 20 42 59 20 73 75 62 73 74   "ORDER BY subst
4170: 72 28 74 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d  r(type,2,1), nam
4180: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 75  e",.          du
4190: 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  mp_callback, p, 
41a0: 26 7a 45 72 72 4d 73 67 2c 20 61 7a 41 72 67 5b  &zErrMsg, azArg[
41b0: 69 5d 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  i].        );.  
41c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
41d0: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
41e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
41f0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
4200: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
4210: 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65     sqlite_freeme
4220: 6d 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  m(zErrMsg);.    
4230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
4240: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 43 4f  intf(p->out, "CO
4250: 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  MMIT;\n");.    }
4260: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
4270: 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
4280: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68  p(azArg[0], "ech
4290: 6f 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  o", n)==0 && nAr
42a0: 67 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  g>1 ){.    int j
42b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
42c0: 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e  azArg[1];.    in
42d0: 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a 41  t val = atoi(azA
42e0: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28  rg[1]);.    for(
42f0: 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b  j=0; z[j]; j++){
4300: 0a 20 20 20 20 20 20 69 66 28 20 69 73 75 70 70  .      if( isupp
4310: 65 72 28 7a 5b 6a 5d 29 20 29 20 7a 5b 6a 5d 20  er(z[j]) ) z[j] 
4320: 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b 6a 5d 29 3b  = tolower(z[j]);
4330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
4340: 74 72 63 6d 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30  trcmp(z,"on")==0
4350: 20 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20   ){.      val = 
4360: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
4370: 20 73 74 72 63 6d 70 28 7a 2c 22 79 65 73 22 29   strcmp(z,"yes")
4380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 61 6c  ==0 ){.      val
4390: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
43a0: 70 2d 3e 65 63 68 6f 4f 6e 20 3d 20 76 61 6c 3b  p->echoOn = val;
43b0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
43c0: 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
43d0: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69  p(azArg[0], "exi
43e0: 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
43f0: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65   rc = 1;.  }else
4400: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
4410: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
4420: 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e  0], "explain", n
4430: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
4440: 6a 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  j;.    char *z =
4450: 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
4460: 5b 31 5d 20 3a 20 22 31 22 3b 0a 20 20 20 20 69  [1] : "1";.    i
4470: 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 7a 29  nt val = atoi(z)
4480: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  ;.    for(j=0; z
4490: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  [j]; j++){.     
44a0: 20 69 66 28 20 69 73 75 70 70 65 72 28 7a 5b 6a   if( isupper(z[j
44b0: 5d 29 20 29 20 7a 5b 6a 5d 20 3d 20 74 6f 6c 6f  ]) ) z[j] = tolo
44c0: 77 65 72 28 7a 5b 6a 5d 29 3b 0a 20 20 20 20 7d  wer(z[j]);.    }
44d0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
44e0: 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  z,"on")==0 ){.  
44f0: 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20      val = 1;.   
4500: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
4510: 70 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  p(z,"yes")==0 ){
4520: 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  .      val = 1;.
4530: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 76 61 6c      }.    if(val
4540: 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69   == 1) {.      i
4550: 66 28 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65  f(!p->explainPre
4560: 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20 20 20  v.valid) {.     
4570: 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65     p->explainPre
4580: 76 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  v.valid = 1;.   
4590: 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50       p->explainP
45a0: 72 65 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  rev.mode = p->mo
45b0: 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  de;.        p->e
45c0: 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48  xplainPrev.showH
45d0: 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48  eader = p->showH
45e0: 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  eader;.        m
45f0: 65 6d 63 70 79 28 70 2d 3e 65 78 70 6c 61 69 6e  emcpy(p->explain
4600: 50 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70 2d  Prev.colWidth,p-
4610: 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  >colWidth,sizeof
4620: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
4630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
4640: 20 57 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68   We could put th
4650: 69 73 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68  is code under th
4660: 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c  e !p->explainVal
4670: 69 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64  id.      ** cond
4680: 69 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ition so that it
4690: 20 64 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74   does not execut
46a0: 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  e if we are alre
46b0: 61 64 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ady in.      ** 
46c0: 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f  explain mode. Ho
46d0: 77 65 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78  wever, always ex
46e0: 65 63 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77  ecuting it allow
46f0: 73 20 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20  s us an easy.   
4700: 20 20 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73     ** was to res
4710: 65 74 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f  et to explain mo
4720: 64 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 75  de in case the u
4730: 73 65 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ser previously. 
4740: 20 20 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e       ** did an .
4750: 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64  explain followed
4760: 20 62 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d   by a .width, .m
4770: 6f 64 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20  ode or .header. 
4780: 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e       ** command.
4790: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
47a0: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
47b0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 2d 3e  olumn;.      p->
47c0: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a  showHeader = 1;.
47d0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e        memset(p->
47e0: 63 6f 6c 57 69 64 74 68 2c 30 2c 41 72 72 61 79  colWidth,0,Array
47f0: 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
4800: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  ));.      p->col
4810: 57 69 64 74 68 5b 30 5d 20 3d 20 34 3b 0a 20 20  Width[0] = 4;.  
4820: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
4830: 31 5d 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 70  1] = 12;.      p
4840: 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20  ->colWidth[2] = 
4850: 31 30 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  10;.      p->col
4860: 57 69 64 74 68 5b 33 5d 20 3d 20 31 30 3b 0a 20  Width[3] = 10;. 
4870: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
4880: 5b 34 5d 20 3d 20 33 35 3b 0a 20 20 20 20 7d 65  [4] = 35;.    }e
4890: 6c 73 65 20 69 66 20 28 70 2d 3e 65 78 70 6c 61  lse if (p->expla
48a0: 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a  inPrev.valid) {.
48b0: 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e        p->explain
48c0: 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 30 3b 0a  Prev.valid = 0;.
48d0: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
48e0: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d  p->explainPrev.m
48f0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ode;.      p->sh
4900: 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 65 78  owHeader = p->ex
4910: 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65  plainPrev.showHe
4920: 61 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ader;.      memc
4930: 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70  py(p->colWidth,p
4940: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f  ->explainPrev.co
4950: 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d  lWidth,sizeof(p-
4960: 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20  >colWidth));.   
4970: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
4980: 28 20 63 3d 3d 27 68 27 20 26 26 20 28 73 74 72  ( c=='h' && (str
4990: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
49a0: 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d 30 0a 20  header", n)==0. 
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
49d0: 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72      strncmp(azAr
49e0: 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c  g[0], "headers",
49f0: 20 6e 29 3d 3d 30 20 29 26 26 20 6e 41 72 67 3e   n)==0 )&& nArg>
4a00: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  1 ){.    int j;.
4a10: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
4a20: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[1];.    int 
4a30: 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  val = atoi(azArg
4a40: 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  [1]);.    for(j=
4a50: 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  0; z[j]; j++){. 
4a60: 20 20 20 20 20 69 66 28 20 69 73 75 70 70 65 72       if( isupper
4a70: 28 7a 5b 6a 5d 29 20 29 20 7a 5b 6a 5d 20 3d 20  (z[j]) ) z[j] = 
4a80: 74 6f 6c 6f 77 65 72 28 7a 5b 6a 5d 29 3b 0a 20  tolower(z[j]);. 
4a90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
4aa0: 63 6d 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29  cmp(z,"on")==0 )
4ab0: 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b  {.      val = 1;
4ac0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
4ad0: 74 72 63 6d 70 28 7a 2c 22 79 65 73 22 29 3d 3d  trcmp(z,"yes")==
4ae0: 30 20 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d  0 ){.      val =
4af0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   1;.    }.    p-
4b00: 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 76 61  >showHeader = va
4b10: 6c 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  l;.  }else..  if
4b20: 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
4b30: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
4b40: 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  elp", n)==0 ){. 
4b50: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
4b60: 72 2c 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73  r,zHelp);.  }els
4b70: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  e..  if( c=='i' 
4b80: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
4b90: 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22 2c 20  [0], "indices", 
4ba0: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20  n)==0 && nArg>1 
4bb0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 61  ){.    struct ca
4bc0: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61  llback_data data
4bd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
4be0: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65  Msg = 0;.    ope
4bf0: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d  n_db(p);.    mem
4c00: 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
4c10: 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
4c20: 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
4c30: 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d   = 0;.    data.m
4c40: 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
4c50: 0a 20 20 20 20 73 71 6c 69 74 65 5f 65 78 65 63  .    sqlite_exec
4c60: 5f 70 72 69 6e 74 66 28 70 2d 3e 64 62 2c 0a 20  _printf(p->db,. 
4c70: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
4c80: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
4c90: 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57 48  ster ".      "WH
4ca0: 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
4cb0: 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
4cc0: 4b 45 20 27 25 71 27 20 22 0a 20 20 20 20 20 20  KE '%q' ".      
4cd0: 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20  "UNION ALL ".   
4ce0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
4cf0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
4d00: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
4d10: 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
4d20: 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
4d30: 20 4c 49 4b 45 20 27 25 71 27 20 22 0a 20 20 20   LIKE '%q' ".   
4d40: 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c     "ORDER BY 1",
4d50: 0a 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c  .      callback,
4d60: 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
4d70: 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 61 7a 41 72  , azArg[1], azAr
4d80: 67 5b 31 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20  g[1].    );.    
4d90: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
4da0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
4db0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
4dc0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
4dd0: 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65     sqlite_freeme
4de0: 6d 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  m(zErrMsg);.    
4df0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
4e00: 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63   c=='m' && strnc
4e10: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f  mp(azArg[0], "mo
4e20: 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  de", n)==0 && nA
4e30: 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  rg>=2 ){.    int
4e40: 20 6e 32 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41   n2 = strlen(azA
4e50: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
4e60: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
4e70: 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d 3d 30 0a 20  ,"line",n2)==0. 
4e80: 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20         ||.      
4e90: 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b    strncmp(azArg[
4ea0: 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d  1],"lines",n2)==
4eb0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
4ec0: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a  de = MODE_Line;.
4ed0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
4ee0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
4ef0: 63 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 0a 20  column",n2)==0. 
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 0a               ||.
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
4f20: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
4f30: 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
4f40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
4f50: 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
4f60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
4f70: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
4f80: 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
4f90: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
4fa0: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
4fb0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
4fc0: 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22  (azArg[1],"html"
4fd0: 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
4fe0: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
4ff0: 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Html;.    }else 
5000: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
5010: 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32  g[1],"insert",n2
5020: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
5030: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  >mode = MODE_Ins
5040: 65 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ert;.      if( n
5050: 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
5060: 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
5070: 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  (p, azArg[2]);. 
5080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5090: 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61      set_table_na
50a0: 6d 65 28 70 2c 20 22 74 61 62 6c 65 22 29 3b 0a  me(p, "table");.
50b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
50c0: 65 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  e {.      fprint
50d0: 66 28 73 74 64 65 72 72 2c 22 6d 6f 64 65 20 73  f(stderr,"mode s
50e0: 68 6f 75 6c 64 20 62 65 20 6f 6e 20 6f 66 3a 20  hould be on of: 
50f0: 63 6f 6c 75 6d 6e 20 68 74 6d 6c 20 69 6e 73 65  column html inse
5100: 72 74 20 6c 69 6e 65 20 6c 69 73 74 5c 6e 22 29  rt line list\n")
5110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
5120: 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26  .  if( c=='n' &&
5130: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
5140: 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20  ], "nullvalue", 
5150: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32  n)==0 && nArg==2
5160: 20 29 20 7b 0a 20 20 20 20 73 70 72 69 6e 74 66   ) {.    sprintf
5170: 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20 22  (p->nullvalue, "
5180: 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
5190: 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 76 61 6c  ySize(p->nullval
51a0: 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29  ue)-1, azArg[1])
51b0: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
51c0: 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63   c=='o' && strnc
51d0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75  mp(azArg[0], "ou
51e0: 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20  tput", n)==0 && 
51f0: 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69  nArg==2 ){.    i
5200: 66 28 20 70 2d 3e 6f 75 74 21 3d 73 74 64 6f 75  f( p->out!=stdou
5210: 74 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73  t ){.      fclos
5220: 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7d  e(p->out);.    }
5230: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
5240: 61 7a 41 72 67 5b 31 5d 2c 22 73 74 64 6f 75 74  azArg[1],"stdout
5250: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
5260: 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
5270: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 2d 3e        strcpy(p->
5280: 6f 75 74 66 69 6c 65 2c 22 73 74 64 6f 75 74 22  outfile,"stdout"
5290: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
52a0: 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 66 6f 70      p->out = fop
52b0: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22  en(azArg[1], "w"
52c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
52d0: 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
52e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
52f0: 2c 22 63 61 6e 27 74 20 77 72 69 74 65 20 74 6f  ,"can't write to
5300: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
5310: 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  g[1]);.        p
5320: 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
5330: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
5340: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
5350: 2d 3e 6f 75 74 66 69 6c 65 2c 61 7a 41 72 67 5b  ->outfile,azArg[
5360: 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
5370: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
5380: 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e  ( c=='p' && strn
5390: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
53a0: 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 26 26  rompt", n)==0 &&
53b0: 20 28 6e 41 72 67 3d 3d 32 20 7c 7c 20 6e 41 72   (nArg==2 || nAr
53c0: 67 3d 3d 33 29 29 7b 0a 20 20 20 20 69 66 28 20  g==3)){.    if( 
53d0: 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20  nArg >= 2) {.   
53e0: 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50     strncpy(mainP
53f0: 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28  rompt,azArg[1],(
5400: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61  int)ArraySize(ma
5410: 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20  inPrompt)-1);.  
5420: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
5430: 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73   >= 3) {.      s
5440: 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50  trncpy(continueP
5450: 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28  rompt,azArg[2],(
5460: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f  int)ArraySize(co
5470: 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29  ntinuePrompt)-1)
5480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
5490: 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26  .  if( c=='q' &&
54a0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
54b0: 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30  ], "quit", n)==0
54c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64   ){.    if( p->d
54d0: 62 20 29 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65  b ) sqlite_close
54e0: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 65 78 69  (p->db);.    exi
54f0: 74 28 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  t(0);.  }else.. 
5500: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 73   if( c=='r' && s
5510: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
5520: 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26   "read", n)==0 &
5530: 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  & nArg==2 ){.   
5540: 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70   FILE *alt = fop
5550: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 22  en(azArg[1], "r"
5560: 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d  );.    if( alt==
5570: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
5580: 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27 74  tf(stderr,"can't
5590: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
55a0: 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
55b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 6f  }else{.      pro
55c0: 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c  cess_input(p, al
55d0: 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  t);.      fclose
55e0: 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (alt);.    }.  }
55f0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
5600: 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
5610: 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22  Arg[0], "schema"
5620: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
5630: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
5640: 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ata data;.    ch
5650: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
5660: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
5670: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
5680: 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
5690: 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
56a0: 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
56b0: 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
56c0: 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28  DE_Semi;.    if(
56d0: 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20   nArg>1 ){.     
56e0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
56f0: 74 65 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20  teStrICmp(const 
5700: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
5710: 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  *);.      if( sq
5720: 6c 69 74 65 53 74 72 49 43 6d 70 28 61 7a 41 72  liteStrICmp(azAr
5730: 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 6d 61 73  g[1],"sqlite_mas
5740: 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ter")==0 ){.    
5750: 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72      char *new_ar
5760: 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76  gv[2], *new_colv
5770: 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  [2];.        new
5780: 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41  _argv[0] = "CREA
5790: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
57a0: 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20  master (\n".    
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c    "  type text,\
57d0: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
57e0: 20 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65           "  name
57f0: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74  "  tbl_name text
5820: 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
5830: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f             "  ro
5840: 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c  otpage integer,\
5850: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
5860: 20 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20           "  sql 
5870: 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  text\n".        
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
5890: 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ";.        new_a
58a0: 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  rgv[1] = 0;.    
58b0: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20      new_colv[0] 
58c0: 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20  = "sql";.       
58d0: 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30   new_colv[1] = 0
58e0: 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ;.        callba
58f0: 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77  ck(&data, 1, new
5900: 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29  _argv, new_colv)
5910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5920: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
5930: 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65  azArg[1],"sqlite
5940: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d  _temp_master")==
5950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
5960: 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
5970: 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
5980: 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
5990: 5d 20 3d 20 22 43 52 45 41 54 45 20 54 45 4d 50  ] = "CREATE TEMP
59a0: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65   TABLE sqlite_te
59b0: 6d 70 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  mp_master (\n". 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
59e0: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
5a00: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
5a30: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
5a50: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
5a60: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
5a80: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
5ab0: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
5ac0: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
5ad0: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
5ae0: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
5af0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
5b00: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
5b10: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
5b20: 6c 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lv);.      }else
5b30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5b40: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 70 2d 3e  _exec_printf(p->
5b50: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  db,.          "S
5b60: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22  ELECT sql FROM "
5b70: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53  .          "  (S
5b80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
5b90: 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e  ite_master UNION
5ba0: 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20   ALL".          
5bb0: 22 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  "   SELECT * FRO
5bc0: 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  M sqlite_temp_ma
5bd0: 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20  ster) ".        
5be0: 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d    "WHERE tbl_nam
5bf0: 65 20 4c 49 4b 45 20 27 25 71 27 20 41 4e 44 20  e LIKE '%q' AND 
5c00: 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
5c10: 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20   sql NOTNULL ". 
5c20: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
5c30: 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c 32  BY substr(type,2
5c40: 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20  ,1), name",.    
5c50: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
5c60: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 2c  &data, &zErrMsg,
5c70: 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
5c80: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5c90: 20 20 20 20 20 73 71 6c 69 74 65 5f 65 78 65 63       sqlite_exec
5ca0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
5cb0: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
5cc0: 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  M ".         "  
5cd0: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
5ce0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
5cf0: 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20  ON ALL".        
5d00: 20 22 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52   "   SELECT * FR
5d10: 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
5d20: 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
5d30: 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
5d40: 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
5d50: 54 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20 20  TNULL ".        
5d60: 20 22 4f 52 44 45 52 20 42 59 20 73 75 62 73 74   "ORDER BY subst
5d70: 72 28 74 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d  r(type,2,1), nam
5d80: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 63 61 6c  e",.         cal
5d90: 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
5da0: 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a  ErrMsg.      );.
5db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
5dc0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66  rrMsg ){.      f
5dd0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
5de0: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
5df0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
5e00: 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a 45 72 72  ite_freemem(zErr
5e10: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Msg);.    }.  }e
5e20: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
5e30: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
5e40: 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f  rg[0], "separato
5e50: 72 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  r", n)==0 && nAr
5e60: 67 3d 3d 32 20 29 7b 0a 20 20 20 20 73 70 72 69  g==2 ){.    spri
5e70: 6e 74 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72  ntf(p->separator
5e80: 2c 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41  , "%.*s", (int)A
5e90: 72 72 61 79 53 69 7a 65 28 70 2d 3e 73 65 70 61  rraySize(p->sepa
5ea0: 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b  rator)-1, azArg[
5eb0: 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  1]);.  }else..  
5ec0: 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
5ed0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
5ee0: 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 29 7b 0a  "show", n)==0){.
5ef0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5f00: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5f10: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68  9.9s: %s\n","ech
5f20: 6f 22 2c 20 70 2d 3e 65 63 68 6f 4f 6e 20 3f 20  o", p->echoOn ? 
5f30: 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  "on" : "off");. 
5f40: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5f50: 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c  t,"%9.9s: %s\n",
5f60: 22 65 78 70 6c 61 69 6e 22 2c 20 70 2d 3e 65 78  "explain", p->ex
5f70: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
5f80: 3f 20 22 6f 6e 22 20 3a 22 6f 66 66 22 29 3b 0a  ? "on" :"off");.
5f90: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5fa0: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
5fb0: 2c 22 68 65 61 64 65 72 73 22 2c 20 70 2d 3e 73  ,"headers", p->s
5fc0: 68 6f 77 48 65 61 64 65 72 20 3f 20 22 6f 6e 22  howHeader ? "on"
5fd0: 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66   : "off");.    f
5fe0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5ff0: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64  9.9s: %s\n","mod
6000: 65 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d  e", modeDescr[p-
6010: 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 66 70 72  >mode]);.    fpr
6020: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
6030: 39 73 3a 20 25 73 5c 6e 22 2c 22 6e 75 6c 6c 76  9s: %s\n","nullv
6040: 61 6c 75 65 22 2c 20 70 2d 3e 6e 75 6c 6c 76 61  alue", p->nullva
6050: 6c 75 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  lue);.    fprint
6060: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
6070: 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c   %s\n","output",
6080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 73 74 72 6c 65 6e 28 70 2d 3e 6f 75 74 66    strlen(p->outf
60b0: 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
60c0: 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
60d0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
60e0: 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c  t,"%9.9s: %s\n",
60f0: 22 73 65 70 61 72 61 74 6f 72 22 2c 20 70 2d 3e  "separator", p->
6100: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
6110: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
6120: 25 39 2e 39 73 3a 20 22 2c 22 77 69 64 74 68 22  %9.9s: ","width"
6130: 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b  );.    for (i=0;
6140: 69 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  i<(int)ArraySize
6150: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26  (p->colWidth) &&
6160: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20   p->colWidth[i] 
6170: 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20  != 0;i++) {.    
6180: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
6190: 75 74 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c 57  ut,"%d ",p->colW
61a0: 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  idth[i]);.    }.
61b0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
61c0: 75 74 2c 22 5c 6e 5c 6e 22 29 3b 0a 20 20 7d 65  ut,"\n\n");.  }e
61d0: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74  lse..  if( c=='t
61e0: 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
61f0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
6200: 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  ables", n)==0 ){
6210: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  .    char **azRe
6220: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52  sult;.    int nR
6230: 6f 77 2c 20 72 63 3b 0a 20 20 20 20 63 68 61 72  ow, rc;.    char
6240: 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 6f   *zErrMsg;.    o
6250: 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 69  pen_db(p);.    i
6260: 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
6270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f      rc = sqlite_
6280: 67 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c  get_table(p->db,
6290: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
62a0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
62b0: 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
62c0: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49     "WHERE type I
62d0: 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
62e0: 27 29 20 22 0a 20 20 20 20 20 20 20 20 22 55 4e  ') ".        "UN
62f0: 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20  ION ALL ".      
6300: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
6310: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
6320: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
6330: 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e 20   "WHERE type IN 
6340: 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29  ('table','view')
6350: 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45   ".        "ORDE
6360: 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20  R BY 1",.       
6370: 20 26 61 7a 52 65 73 75 6c 74 2c 20 26 6e 52 6f   &azResult, &nRo
6380: 77 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 0a 20  w, 0, &zErrMsg. 
6390: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
63a0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
63b0: 6c 69 74 65 5f 67 65 74 5f 74 61 62 6c 65 5f 70  lite_get_table_p
63c0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 0a 20 20 20  rintf(p->db,.   
63d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
63e0: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
63f0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
6400: 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27  WHERE type IN ('
6410: 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41  table','view') A
6420: 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 25  ND name LIKE '%%
6430: 25 71 25 25 27 20 22 0a 20 20 20 20 20 20 20 20  %q%%' ".        
6440: 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20  "UNION ALL ".   
6450: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
6460: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65  e FROM sqlite_te
6470: 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  mp_master ".    
6480: 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20      "WHERE type 
6490: 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
64a0: 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  w') AND name LIK
64b0: 45 20 27 25 25 25 71 25 25 27 20 22 0a 20 20 20  E '%%%q%%' ".   
64c0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31       "ORDER BY 1
64d0: 22 2c 0a 20 20 20 20 20 20 20 20 26 61 7a 52 65  ",.        &azRe
64e0: 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20  sult, &nRow, 0, 
64f0: 26 7a 45 72 72 4d 73 67 2c 20 61 7a 41 72 67 5b  &zErrMsg, azArg[
6500: 31 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20  1], azArg[1].   
6510: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
6520: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
6530: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
6540: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
6550: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
6560: 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65     sqlite_freeme
6570: 6d 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  m(zErrMsg);.    
6580: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
6590: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
65a0: 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e   int len, maxlen
65b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
65c0: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, j;.      int 
65d0: 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e  nPrintCol, nPrin
65e0: 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28  tRow;.      for(
65f0: 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b  i=1; i<=nRow; i+
6600: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6610: 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29  azResult[i]==0 )
6620: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6630: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
6640: 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20  azResult[i]);.  
6650: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61        if( len>ma
6660: 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
6670: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
6680: 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38     nPrintCol = 8
6690: 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20  0/(maxlen+2);.  
66a0: 20 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f      if( nPrintCo
66b0: 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20  l<1 ) nPrintCol 
66c0: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e  = 1;.      nPrin
66d0: 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e  tRow = (nRow + n
66e0: 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50  PrintCol - 1)/nP
66f0: 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66  rintCol;.      f
6700: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74  or(i=0; i<nPrint
6710: 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Row; i++){.     
6720: 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
6730: 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74  =nRow; j+=nPrint
6740: 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Row){.          
6750: 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 3d 6e  char *zSp = j<=n
6760: 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20  PrintRow ? "" : 
6770: 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20  "  ";.          
6780: 70 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c  printf("%s%-*s",
6790: 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a   zSp, maxlen, az
67a0: 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65  Result[j] ? azRe
67b0: 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20  sult[j] : "");. 
67c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
67d0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
67e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
67f0: 20 73 71 6c 69 74 65 5f 66 72 65 65 5f 74 61 62   sqlite_free_tab
6800: 6c 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  le(azResult);.  
6810: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
6820: 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
6830: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
6840: 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30  "timeout", n)==0
6850: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
6860: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
6870: 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 74     sqlite_busy_t
6880: 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 61 74  imeout(p->db, at
6890: 6f 69 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a 20  oi(azArg[1]));. 
68a0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
68b0: 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='w' && strncmp(
68c0: 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64 74 68  azArg[0], "width
68d0: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
68e0: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
68f0: 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a 3c  =1; j<nArg && j<
6900: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
6910: 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20  Width); j++){.  
6920: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
6930: 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41 72  j-1] = atoi(azAr
6940: 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[j]);.    }.  }
6950: 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66 70  else..  {.    fp
6960: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
6970: 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
6980: 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
6990: 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
69a0: 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
69b0: 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
69c0: 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
69d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
69e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
69f0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 61 73   TRUE if the las
6a00: 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65  t non-whitespace
6a10: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b   character in z[
6a20: 5d 20 69 73 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  ] is a semicolon
6a30: 2e 0a 2a 2a 20 7a 5b 5d 20 69 73 20 4e 20 63 68  ..** z[] is N ch
6a40: 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 0a 2a  aracters long..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 65 6e  /.static int _en
6a60: 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c 6f  ds_with_semicolo
6a70: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
6a80: 20 69 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c 65   int N){.  while
6a90: 28 20 4e 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( N>0 && isspace
6aa0: 28 7a 5b 4e 2d 31 5d 29 20 29 7b 20 4e 2d 2d 3b  (z[N-1]) ){ N--;
6ab0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3e 30 20   }.  return N>0 
6ac0: 26 26 20 7a 5b 4e 2d 31 5d 3d 3d 27 3b 27 3b 0a  && z[N-1]==';';.
6ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  }../*.** Test to
6ae0: 20 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63   see if a line c
6af0: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
6b00: 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a   of whitespace..
6b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61  */.static int _a
6b20: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f  ll_whitespace(co
6b30: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
6b40: 66 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  for(; *z; z++){.
6b50: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
6b60: 2a 7a 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  *z) ) continue;.
6b70: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
6b80: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
6b90: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
6ba0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
6bb0: 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31   (*z!='*' || z[1
6bc0: 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20  ]!='/') ){ z++; 
6bd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
6be0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6bf0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63      z++;.      c
6c00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6c10: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26     if( *z=='-' &
6c20: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
6c30: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
6c40: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
6c50: 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b  *z!='\n' ){ z++;
6c60: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d   }.      if( *z=
6c70: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
6c80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6c90: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
6ca0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6cb0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
6cc0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c  rn TRUE if the l
6cd0: 69 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20  ine typed in is 
6ce0: 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74  an SQL command t
6cf0: 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a  erminator other.
6d00: 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63  ** than a semi-c
6d10: 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53  olon.  The SQL S
6d20: 65 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22  erver style "go"
6d30: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65   command is unde
6d40: 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20  rstood.** as is 
6d50: 74 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a  the Oracle "/"..
6d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69  */.static int _i
6d70: 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e  s_command_termin
6d80: 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
6d90: 2a 7a 4c 69 6e 65 29 7b 0a 20 20 65 78 74 65 72  *zLine){.  exter
6da0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 53 74 72 4e  n int sqliteStrN
6db0: 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 2a  ICmp(const char*
6dc0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
6dd0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  );.  while( issp
6de0: 61 63 65 28 2a 7a 4c 69 6e 65 29 20 29 7b 20 7a  ace(*zLine) ){ z
6df0: 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28  Line++; };.  if(
6e00: 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26   zLine[0]=='/' &
6e10: 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  & _all_whitespac
6e20: 65 28 26 7a 4c 69 6e 65 5b 31 5d 29 20 29 20 72  e(&zLine[1]) ) r
6e30: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
6e40: 63 6c 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  cle */.  if( sql
6e50: 69 74 65 53 74 72 4e 49 43 6d 70 28 7a 4c 69 6e  iteStrNICmp(zLin
6e60: 65 2c 22 67 6f 22 2c 32 29 3d 3d 30 20 26 26 20  e,"go",2)==0 && 
6e70: 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28  _all_whitespace(
6e80: 26 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20  &zLine[2]) ){.  
6e90: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
6ea0: 53 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20  SQL Server */.  
6eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6ec0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
6ed0: 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70  t from *in and p
6ee0: 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a  rocess it.  If *
6ef0: 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74  in==0 then input
6f00: 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69  .** is interacti
6f10: 76 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73  ve - the user is
6f20: 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20   typing it it.  
6f30: 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74  Otherwise, input
6f40: 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  .** is coming fr
6f50: 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76  om a file or dev
6f60: 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69  ice.  A prompt i
6f70: 73 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73  s issued and his
6f80: 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64  tory.** is saved
6f90: 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69   only if input i
6fa0: 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20  s interactive.  
6fb0: 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67  An interrupt sig
6fc0: 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  nal will.** caus
6fd0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
6fe0: 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  o exit immediate
6ff0: 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74  ly, unless input
7000: 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
7010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7020: 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74  process_input(st
7030: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
7040: 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  ta *p, FILE *in)
7050: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b  {.  char *zLine;
7060: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  .  char *zSql = 
7070: 30 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20  0;.  int nSql = 
7080: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  0;.  char *zErrM
7090: 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
70a0: 77 68 69 6c 65 28 20 66 66 6c 75 73 68 28 70 2d  while( fflush(p-
70b0: 3e 6f 75 74 29 2c 20 28 7a 4c 69 6e 65 20 3d 20  >out), (zLine = 
70c0: 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a  one_input_line(z
70d0: 53 71 6c 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  Sql, in))!=0 ){.
70e0: 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
70f0: 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
7100: 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
7110: 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
7120: 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
7130: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f  .    if( p->echo
7140: 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c  On ) printf("%s\
7150: 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n", zLine);.    
7160: 69 66 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20  if( (zSql==0 || 
7170: 7a 53 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f  zSql[0]==0) && _
7180: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
7190: 4c 69 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Line) ) continue
71a0: 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20  ;.    if( zLine 
71b0: 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  && zLine[0]=='.'
71c0: 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20   && nSql==0 ){. 
71d0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 6f       int rc = do
71e0: 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c  _meta_command(zL
71f0: 69 6e 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 66  ine, p);.      f
7200: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
7210: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
7220: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
7230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7240: 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d  _is_command_term
7250: 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 29 7b  inator(zLine) ){
7260: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 4c  .      strcpy(zL
7270: 69 6e 65 2c 22 3b 22 29 3b 0a 20 20 20 20 7d 0a  ine,";");.    }.
7280: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
7290: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
72a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
72b0: 4c 69 6e 65 5b 69 5d 20 26 26 20 69 73 73 70 61  Line[i] && isspa
72c0: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
72d0: 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +){}.      if( z
72e0: 4c 69 6e 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20  Line[i]!=0 ){.  
72f0: 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 73 74 72        nSql = str
7300: 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
7310: 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
7320: 63 28 20 6e 53 71 6c 2b 31 20 29 3b 0a 20 20 20  c( nSql+1 );.   
7330: 20 20 20 20 20 73 74 72 63 70 79 28 7a 53 71 6c       strcpy(zSql
7340: 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , zLine);.      
7350: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7360: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
7370: 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
7380: 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63    zSql = realloc
7390: 28 20 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20 6c  ( zSql, nSql + l
73a0: 65 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  en + 2 );.      
73b0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
73c0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
73d0: 74 64 65 72 72 2c 22 25 73 3a 20 6f 75 74 20 6f  tderr,"%s: out o
73e0: 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20 41 72  f memory!\n", Ar
73f0: 67 76 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78  gv0);.        ex
7400: 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
7410: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 71       strcpy(&zSq
7420: 6c 5b 6e 53 71 6c 2b 2b 5d 2c 20 22 5c 6e 22 29  l[nSql++], "\n")
7430: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
7440: 7a 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c 69 6e  zSql[nSql], zLin
7450: 65 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b  e);.      nSql +
7460: 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  = len;.    }.   
7470: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
7480: 20 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f 65    if( zSql && _e
7490: 6e 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c  nds_with_semicol
74a0: 6f 6e 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 26  on(zSql, nSql) &
74b0: 26 20 73 71 6c 69 74 65 5f 63 6f 6d 70 6c 65 74  & sqlite_complet
74c0: 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  e(zSql) ){.     
74d0: 20 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20   p->cnt = 0;.   
74e0: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
74f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7500: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
7510: 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  l, callback, p, 
7520: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
7530: 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
7540: 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  sg ){.        if
7550: 28 20 69 6e 21 3d 30 20 26 26 20 21 70 2d 3e 65  ( in!=0 && !p->e
7560: 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22  choOn ) printf("
7570: 25 73 5c 6e 22 2c 7a 53 71 6c 29 3b 0a 20 20 20  %s\n",zSql);.   
7580: 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
7590: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
75a0: 20 70 72 69 6e 74 66 28 22 53 51 4c 20 65 72 72   printf("SQL err
75b0: 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
75c0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  sg);.          s
75d0: 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a 45  qlite_freemem(zE
75e0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
75f0: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
7600: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7610: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
7620: 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
7630: 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73  , sqlite_error_s
7640: 74 72 69 6e 67 28 72 63 29 29 3b 0a 20 20 20 20  tring(rc));.    
7650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7660: 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
7670: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a        zSql = 0;.
7680: 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a        nSql = 0;.
7690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
76a0: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  zSql ){.    if( 
76b0: 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65  !_all_whitespace
76c0: 28 7a 53 71 6c 29 20 29 20 70 72 69 6e 74 66 28  (zSql) ) printf(
76d0: 22 49 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a  "Incomplete SQL:
76e0: 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20   %s\n", zSql);. 
76f0: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
7700: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
7710: 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77 68  rn a pathname wh
7720: 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72 27  ich is the user'
7730: 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  s home directory
7740: 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e  .  A.** 0 return
7750: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72   indicates an er
7760: 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ror of some kind
7770: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
7780: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e   the.** resultin
7790: 67 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  g string is obta
77a0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
77b0: 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ().  The calling
77c0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  .** function sho
77d0: 75 6c 64 20 66 72 65 65 20 74 68 65 20 72 65 73  uld free the res
77e0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ult..*/.static c
77f0: 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64  har *find_home_d
7800: 69 72 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ir(void){.  char
7810: 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c   *home_dir = NUL
7820: 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  L;..#if !defined
7830: 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
7840: 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21  ined(WIN32) && !
7850: 64 65 66 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f  defined(__MACOS_
7860: 5f 29 0a 20 20 73 74 72 75 63 74 20 70 61 73 73  _).  struct pass
7870: 77 64 20 2a 70 77 65 6e 74 3b 0a 20 20 75 69 64  wd *pwent;.  uid
7880: 5f 74 20 75 69 64 20 3d 20 67 65 74 75 69 64 28  _t uid = getuid(
7890: 29 3b 0a 20 20 69 66 28 20 28 70 77 65 6e 74 3d  );.  if( (pwent=
78a0: 67 65 74 70 77 75 69 64 28 75 69 64 29 29 20 21  getpwuid(uid)) !
78b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f  = NULL) {.    ho
78c0: 6d 65 5f 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e  me_dir = pwent->
78d0: 70 77 5f 64 69 72 3b 0a 20 20 7d 0a 23 65 6e 64  pw_dir;.  }.#end
78e0: 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 4d 41 43  if..#ifdef __MAC
78f0: 4f 53 5f 5f 0a 20 20 63 68 61 72 20 68 6f 6d 65  OS__.  char home
7900: 5f 70 61 74 68 5b 5f 4d 41 58 5f 50 41 54 48 2b  _path[_MAX_PATH+
7910: 31 5d 3b 0a 20 20 68 6f 6d 65 5f 64 69 72 20 3d  1];.  home_dir =
7920: 20 67 65 74 63 77 64 28 68 6f 6d 65 5f 70 61 74   getcwd(home_pat
7930: 68 2c 20 5f 4d 41 58 5f 50 41 54 48 29 3b 0a 23  h, _MAX_PATH);.#
7940: 65 6e 64 69 66 0a 0a 20 20 69 66 20 28 21 68 6f  endif..  if (!ho
7950: 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f  me_dir) {.    ho
7960: 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28  me_dir = getenv(
7970: 22 48 4f 4d 45 22 29 3b 0a 20 20 20 20 69 66 20  "HOME");.    if 
7980: 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20  (!home_dir) {.  
7990: 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
79a0: 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22  etenv("HOMEPATH"
79b0: 29 3b 20 2f 2a 20 57 69 6e 64 6f 77 73 3f 20 2a  ); /* Windows? *
79c0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  /.    }.  }..#if
79d0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
79e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
79f0: 32 29 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64  2).  if (!home_d
7a00: 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64  ir) {.    home_d
7a10: 69 72 20 3d 20 22 63 3a 22 3b 0a 20 20 7d 0a 23  ir = "c:";.  }.#
7a20: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 68 6f 6d  endif..  if( hom
7a30: 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 63 68 61  e_dir ){.    cha
7a40: 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  r *z = malloc( s
7a50: 74 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29 2b  trlen(home_dir)+
7a60: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  1 );.    if( z )
7a70: 20 73 74 72 63 70 79 28 7a 2c 20 68 6f 6d 65 5f   strcpy(z, home_
7a80: 64 69 72 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64  dir);.    home_d
7a90: 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72  ir = z;.  }..  r
7aa0: 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a  eturn home_dir;.
7ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e  }../*.** Read in
7ac0: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  put from the fil
7ad0: 65 20 67 69 76 65 6e 20 62 79 20 73 71 6c 69 74  e given by sqlit
7ae0: 65 72 63 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f  erc_override.  O
7af0: 72 20 69 66 20 74 68 61 74 0a 2a 2a 20 70 61 72  r if that.** par
7b00: 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20  ameter is NULL, 
7b10: 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 20  take input from 
7b20: 7e 2f 2e 73 71 6c 69 74 65 72 63 0a 2a 2f 0a 73  ~/.sqliterc.*/.s
7b30: 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63 65  tatic void proce
7b40: 73 73 5f 73 71 6c 69 74 65 72 63 28 73 74 72 75  ss_sqliterc(stru
7b50: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
7b60: 20 2a 70 2c 20 63 68 61 72 20 2a 73 71 6c 69 74   *p, char *sqlit
7b70: 65 72 63 5f 6f 76 65 72 72 69 64 65 29 7b 0a 20  erc_override){. 
7b80: 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20   char *home_dir 
7b90: 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 2a  = NULL;.  char *
7ba0: 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74  sqliterc = sqlit
7bb0: 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20  erc_override;.  
7bc0: 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b  FILE *in = NULL;
7bd0: 0a 0a 20 20 69 66 20 28 73 71 6c 69 74 65 72 63  ..  if (sqliterc
7be0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   == NULL) {.    
7bf0: 68 6f 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f  home_dir = find_
7c00: 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20  home_dir();.    
7c10: 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20  if( home_dir==0 
7c20: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
7c30: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e  (stderr,"%s: can
7c40: 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20  not locate your 
7c50: 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 21 5c  home directory!\
7c60: 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20  n", Argv0);.    
7c70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7c80: 20 20 20 20 73 71 6c 69 74 65 72 63 20 3d 20 6d      sqliterc = m
7c90: 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 68 6f 6d  alloc(strlen(hom
7ca0: 65 5f 64 69 72 29 20 2b 20 31 35 29 3b 0a 20 20  e_dir) + 15);.  
7cb0: 20 20 69 66 28 20 73 71 6c 69 74 65 72 63 3d 3d    if( sqliterc==
7cc0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
7cd0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6f  tf(stderr,"%s: o
7ce0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22  ut of memory!\n"
7cf0: 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20  , Argv0);.      
7d00: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
7d10: 20 20 20 73 70 72 69 6e 74 66 28 73 71 6c 69 74     sprintf(sqlit
7d20: 65 72 63 2c 22 25 73 2f 2e 73 71 6c 69 74 65 72  erc,"%s/.sqliter
7d30: 63 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20  c",home_dir);.  
7d40: 20 20 66 72 65 65 28 68 6f 6d 65 5f 64 69 72 29    free(home_dir)
7d50: 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70  ;.  }.  in = fop
7d60: 65 6e 28 73 71 6c 69 74 65 72 63 2c 22 72 22 29  en(sqliterc,"r")
7d70: 3b 0a 20 20 69 66 28 69 6e 20 26 26 20 69 73 61  ;.  if(in && isa
7d80: 74 74 79 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75  tty(fileno(stdou
7d90: 74 29 29 29 20 7b 0a 20 20 20 20 70 72 69 6e 74  t))) {.    print
7da0: 66 28 22 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75  f("Loading resou
7db0: 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c  rces from %s\n",
7dc0: 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 70  sqliterc);.    p
7dd0: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69  rocess_input(p,i
7de0: 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
7df0: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
7e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  ;.}../*.** Show 
7e10: 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e  available comman
7e20: 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a  d line options.*
7e30: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
7e40: 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d  har zOptions[] =
7e50: 20 0a 20 20 22 20 20 20 2d 69 6e 69 74 20 66 69   .  "   -init fi
7e60: 6c 65 6e 61 6d 65 20 20 20 20 20 20 20 72 65 61  lename       rea
7e70: 64 2f 70 72 6f 63 65 73 73 20 6e 61 6d 65 64 20  d/process named 
7e80: 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20 20 2d 65  file\n".  "   -e
7e90: 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  cho             
7ea0: 20 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64     print command
7eb0: 73 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69  s before executi
7ec0: 6f 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f  on\n".  "   -[no
7ed0: 5d 68 65 61 64 65 72 20 20 20 20 20 20 20 20 20  ]header         
7ee0: 20 74 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e   turn headers on
7ef0: 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 20 20   or off\n".  "  
7f00: 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20   -column        
7f10: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
7f20: 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c 75 6d 6e   mode to 'column
7f30: 27 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c  '\n".  "   -html
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
7f60: 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20  to HTML\n".  "  
7f70: 20 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20   -line          
7f80: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
7f90: 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c   mode to 'line'\
7fa0: 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20  n".  "   -list  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
7fc0: 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
7fd0: 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20   'list'\n".  "  
7fe0: 20 2d 73 65 70 61 72 61 74 6f 72 20 27 78 27 20   -separator 'x' 
7ff0: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
8000: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
8010: 20 28 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d 6e   (|)\n".  "   -n
8020: 75 6c 6c 76 61 6c 75 65 20 27 74 65 78 74 27 20  ullvalue 'text' 
8030: 20 20 20 73 65 74 20 74 65 78 74 20 73 74 72 69     set text stri
8040: 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  ng for NULL valu
8050: 65 73 5c 6e 22 0a 20 20 22 20 20 20 2d 76 65 72  es\n".  "   -ver
8060: 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  sion            
8070: 20 73 68 6f 77 20 53 51 4c 69 74 65 20 76 65 72   show SQLite ver
8080: 73 69 6f 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 68  sion\n".  "   -h
8090: 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20  elp             
80a0: 20 20 20 73 68 6f 77 20 74 68 69 73 20 74 65 78     show this tex
80b0: 74 2c 20 61 6c 73 6f 20 73 68 6f 77 20 64 6f 74  t, also show dot
80c0: 2d 63 6f 6d 6d 61 6e 64 73 5c 6e 22 0a 3b 0a 73  -commands\n".;.s
80d0: 74 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65  tatic void usage
80e0: 28 69 6e 74 20 73 68 6f 77 44 65 74 61 69 6c 29  (int showDetail)
80f0: 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  {.  fprintf(stde
8100: 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 5b  rr, "Usage: %s [
8110: 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d  OPTIONS] FILENAM
8120: 45 20 5b 53 51 4c 5d 5c 6e 22 2c 20 41 72 67 76  E [SQL]\n", Argv
8130: 30 29 3b 0a 20 20 69 66 28 20 73 68 6f 77 44 65  0);.  if( showDe
8140: 74 61 69 6c 20 29 7b 0a 20 20 20 20 66 70 72 69  tail ){.    fpri
8150: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 70 74  ntf(stderr, "Opt
8160: 69 6f 6e 73 20 61 72 65 3a 5c 6e 25 73 22 2c 20  ions are:\n%s", 
8170: 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c  zOptions);.  }el
8180: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
8190: 73 74 64 65 72 72 2c 20 22 55 73 65 20 74 68 65  stderr, "Use the
81a0: 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66 6f   -help option fo
81b0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
81c0: 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  ormation\n");.  
81d0: 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  }.  exit(1);.}..
81e0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
81f0: 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72   the state infor
8200: 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a 2a  mation in data.*
8210: 2f 0a 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74  /.void main_init
8220: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
8230: 5f 64 61 74 61 20 2a 64 61 74 61 29 20 7b 0a 20  _data *data) {. 
8240: 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c   memset(data, 0,
8250: 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b   sizeof(*data));
8260: 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20  .  data->mode = 
8270: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 73 74 72  MODE_List;.  str
8280: 63 70 79 28 64 61 74 61 2d 3e 73 65 70 61 72 61  cpy(data->separa
8290: 74 6f 72 2c 22 7c 22 29 3b 0a 20 20 64 61 74 61  tor,"|");.  data
82a0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
82b0: 3b 0a 20 20 73 74 72 63 70 79 28 6d 61 69 6e 50  ;.  strcpy(mainP
82c0: 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20 22  rompt,"sqlite> "
82d0: 29 3b 0a 20 20 73 74 72 63 70 79 28 63 6f 6e 74  );.  strcpy(cont
82e0: 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20 2e  inuePrompt,"   .
82f0: 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  ..> ");.}..int m
8300: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
8310: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68  ar **argv){.  ch
8320: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
8330: 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
8340: 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20  ck_data data;.  
8350: 69 6e 74 20 6f 72 69 67 41 72 67 63 20 3d 20 61  int origArgc = a
8360: 72 67 63 3b 0a 20 20 63 68 61 72 20 2a 2a 6f 72  rgc;.  char **or
8370: 69 67 41 72 67 76 20 3d 20 61 72 67 76 3b 0a 20  igArgv = argv;. 
8380: 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e   int i;.  extern
8390: 20 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 69 6c   int sqliteOsFil
83a0: 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68  eExists(const ch
83b0: 61 72 2a 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f  ar*);..#ifdef __
83c0: 4d 41 43 4f 53 5f 5f 0a 20 20 61 72 67 63 20 3d  MACOS__.  argc =
83d0: 20 63 63 6f 6d 6d 61 6e 64 28 26 61 72 67 76 29   ccommand(&argv)
83e0: 3b 0a 20 20 6f 72 69 67 41 72 67 63 20 3d 20 61  ;.  origArgc = a
83f0: 72 67 63 3b 0a 20 20 6f 72 69 67 41 72 67 76 20  rgc;.  origArgv 
8400: 3d 20 61 72 67 76 3b 0a 23 65 6e 64 69 66 0a 0a  = argv;.#endif..
8410: 20 20 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30    Argv0 = argv[0
8420: 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26  ];.  main_init(&
8430: 64 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  data);..  /* Mak
8440: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
8450: 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61   valid signal ha
8460: 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66  ndler early, bef
8470: 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  ore anything.  *
8480: 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a  * else is done..
8490: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49    */.#ifdef SIGI
84a0: 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49  NT.  signal(SIGI
84b0: 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61  NT, interrupt_ha
84c0: 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  ndler);.#endif..
84d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
84e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
84f0: 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  base file.  */. 
8500: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
8510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8520: 61 72 67 76 5b 69 5d 5b 30 5d 21 3d 27 2d 27 20  argv[i][0]!='-' 
8530: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
8540: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
8550: 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30  "-separator")==0
8560: 20 7c 7c 20 73 74 72 63 6d 70 28 61 72 67 76 5b   || strcmp(argv[
8570: 69 5d 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29  i],"-nullvalue")
8580: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
8590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 61  ;.    }.  }.  da
85a0: 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  ta.zDbFilename =
85b0: 20 69 3c 61 72 67 63 20 3f 20 61 72 67 76 5b 69   i<argc ? argv[i
85c0: 5d 20 3a 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a  ] : ":memory:";.
85d0: 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64    data.out = std
85e0: 6f 75 74 3b 0a 0a 20 20 2f 2a 20 47 6f 20 61 68  out;..  /* Go ah
85f0: 65 61 64 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  ead and open the
8600: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
8610: 66 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  f it already exi
8620: 73 74 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  sts.  If the.  *
8630: 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  * file does not 
8640: 65 78 69 73 74 2c 20 64 65 6c 61 79 20 6f 70 65  exist, delay ope
8650: 6e 69 6e 67 20 69 74 2e 20 20 54 68 69 73 20 70  ning it.  This p
8660: 72 65 76 65 6e 74 73 20 65 6d 70 74 79 20 64 61  revents empty da
8670: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
8680: 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 72 65  s from being cre
8690: 61 74 65 64 20 69 66 20 61 20 75 73 65 72 20 6d  ated if a user m
86a0: 69 73 74 79 70 65 73 20 74 68 65 20 64 61 74 61  istypes the data
86b0: 62 61 73 65 20 6e 61 6d 65 20 61 72 67 75 6d 65  base name argume
86c0: 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  nt.  ** to the s
86d0: 71 6c 69 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  qlite command-li
86e0: 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20  ne tool..  */.  
86f0: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
8700: 45 78 69 73 74 73 28 64 61 74 61 2e 7a 44 62 46  Exists(data.zDbF
8710: 69 6c 65 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ilename) ){.    
8720: 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b 0a  open_db(&data);.
8730: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
8740: 73 20 74 68 65 20 7e 2f 2e 73 71 6c 69 74 65 72  s the ~/.sqliter
8750: 63 20 66 69 6c 65 2c 20 69 66 20 74 68 65 72 65  c file, if there
8760: 20 69 73 20 6f 6e 65 0a 20 20 2a 2f 0a 20 20 70   is one.  */.  p
8770: 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28  rocess_sqliterc(
8780: 26 64 61 74 61 2c 4e 55 4c 4c 29 3b 0a 0a 20 20  &data,NULL);..  
8790: 2f 2a 20 50 72 6f 63 65 73 73 20 63 6f 6d 6d 61  /* Process comma
87a0: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a  nd-line options.
87b0: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72    */.  while( ar
87c0: 67 63 3e 3d 32 20 26 26 20 61 72 67 76 5b 31 5d  gc>=2 && argv[1]
87d0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
87e0: 69 66 28 20 61 72 67 63 3e 3d 33 20 26 26 20 73  if( argc>=3 && s
87f0: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d  trcmp(argv[1],"-
8800: 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  init")==0 ){.   
8810: 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
8820: 61 20 2d 69 6e 69 74 20 74 6f 20 64 6f 2c 20 77  a -init to do, w
8830: 65 20 68 61 76 65 20 74 6f 20 70 72 65 74 65 6e  e have to preten
8840: 64 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  d that.      ** 
8850: 69 74 20 72 65 70 6c 61 63 65 64 20 74 68 65 20  it replaced the 
8860: 2e 73 71 6c 69 74 65 72 63 20 66 69 6c 65 2e 20  .sqliterc file. 
8870: 53 6f 6f 6f 6f 2c 20 69 6e 20 6f 72 64 65 72 20  Soooo, in order 
8880: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 74  to.      ** do t
8890: 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hat we need to s
88a0: 74 61 72 74 20 66 72 6f 6d 20 73 63 72 61 74 63  tart from scratc
88b0: 68 2e 2e 2e 2a 2f 0a 20 20 20 20 20 20 6d 61 69  h...*/.      mai
88c0: 6e 5f 69 6e 69 74 28 26 64 61 74 61 29 3b 0a 0a  n_init(&data);..
88d0: 20 20 20 20 20 20 2f 2a 20 74 72 65 61 74 20 74        /* treat t
88e0: 68 69 73 20 66 69 6c 65 20 61 73 20 74 68 65 20  his file as the 
88f0: 73 71 6c 69 74 65 72 63 2e 2e 2e 20 2a 2f 0a 20  sqliterc... */. 
8900: 20 20 20 20 20 70 72 6f 63 65 73 73 5f 73 71 6c       process_sql
8910: 69 74 65 72 63 28 26 64 61 74 61 2c 61 72 67 76  iterc(&data,argv
8920: 5b 32 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [2]);..      /* 
8930: 66 69 78 20 75 70 20 74 68 65 20 63 6f 6d 6d 61  fix up the comma
8940: 6e 64 20 6c 69 6e 65 20 73 6f 20 77 65 20 64 6f  nd line so we do
8950: 20 6e 6f 74 20 72 65 2d 72 65 61 64 0a 20 20 20   not re-read.   
8960: 20 20 20 2a 2a 20 74 68 65 20 6f 70 74 69 6f 6e     ** the option
8970: 20 6e 65 78 74 20 74 69 6d 65 20 61 72 6f 75 6e   next time aroun
8980: 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  d... */.      {.
8990: 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
89a0: 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
89b0: 3d 31 3b 69 3c 3d 61 72 67 63 2d 32 3b 69 2b 2b  =1;i<=argc-2;i++
89c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 72  ) {.          ar
89d0: 67 76 5b 69 5d 20 3d 20 61 72 67 76 5b 69 2b 32  gv[i] = argv[i+2
89e0: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
89f0: 20 20 20 7d 0a 20 20 20 20 20 20 6f 72 69 67 41     }.      origA
8a00: 72 67 63 2d 3d 32 3b 0a 0a 20 20 20 20 20 20 2f  rgc-=2;..      /
8a10: 2a 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  * and reset the 
8a20: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
8a30: 69 6f 6e 73 20 74 6f 20 62 65 20 72 65 2d 72 65  ions to be re-re
8a40: 61 64 2e 2a 2f 0a 20 20 20 20 20 20 61 72 67 76  ad.*/.      argv
8a50: 20 3d 20 6f 72 69 67 41 72 67 76 3b 0a 20 20 20   = origArgv;.   
8a60: 20 20 20 61 72 67 63 20 3d 20 6f 72 69 67 41 72     argc = origAr
8a70: 67 63 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69  gc;..    }else i
8a80: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31  f( strcmp(argv[1
8a90: 5d 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  ],"-html")==0 ){
8aa0: 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
8ab0: 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
8ac0: 20 20 20 20 61 72 67 63 2d 2d 3b 0a 20 20 20 20      argc--;.    
8ad0: 20 20 61 72 67 76 2b 2b 3b 0a 20 20 20 20 7d 65    argv++;.    }e
8ae0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
8af0: 72 67 76 5b 31 5d 2c 22 2d 6c 69 73 74 22 29 3d  rgv[1],"-list")=
8b00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
8b10: 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
8b20: 74 3b 0a 20 20 20 20 20 20 61 72 67 63 2d 2d 3b  t;.      argc--;
8b30: 0a 20 20 20 20 20 20 61 72 67 76 2b 2b 3b 0a 20  .      argv++;. 
8b40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8b50: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 6c 69  cmp(argv[1],"-li
8b60: 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ne")==0 ){.     
8b70: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
8b80: 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 61 72  E_Line;.      ar
8b90: 67 63 2d 2d 3b 0a 20 20 20 20 20 20 61 72 67 76  gc--;.      argv
8ba0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
8bb0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
8bc0: 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d 3d 30 20 29  ,"-column")==0 )
8bd0: 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
8be0: 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b  e = MODE_Column;
8bf0: 0a 20 20 20 20 20 20 61 72 67 63 2d 2d 3b 0a 20  .      argc--;. 
8c00: 20 20 20 20 20 61 72 67 76 2b 2b 3b 0a 20 20 20       argv++;.   
8c10: 20 7d 65 6c 73 65 20 69 66 28 20 61 72 67 63 3e   }else if( argc>
8c20: 3d 33 20 26 26 20 73 74 72 63 6d 70 28 61 72 67  =3 && strcmp(arg
8c30: 76 5b 31 5d 2c 22 2d 73 65 70 61 72 61 74 6f 72  v[1],"-separator
8c40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
8c50: 70 72 69 6e 74 66 28 64 61 74 61 2e 73 65 70 61  printf(data.sepa
8c60: 72 61 74 6f 72 2c 22 25 2e 2a 73 22 2c 28 69 6e  rator,"%.*s",(in
8c70: 74 29 73 69 7a 65 6f 66 28 64 61 74 61 2e 73 65  t)sizeof(data.se
8c80: 70 61 72 61 74 6f 72 29 2d 31 2c 61 72 67 76 5b  parator)-1,argv[
8c90: 32 5d 29 3b 0a 20 20 20 20 20 20 61 72 67 63 20  2]);.      argc 
8ca0: 2d 3d 20 32 3b 0a 20 20 20 20 20 20 61 72 67 76  -= 2;.      argv
8cb0: 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
8cc0: 20 69 66 28 20 61 72 67 63 3e 3d 33 20 26 26 20   if( argc>=3 && 
8cd0: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
8ce0: 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20  -nullvalue")==0 
8cf0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
8d00: 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 2c  (data.nullvalue,
8d10: 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65  "%.*s",(int)size
8d20: 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75  of(data.nullvalu
8d30: 65 29 2d 31 2c 61 72 67 76 5b 32 5d 29 3b 0a 20  e)-1,argv[2]);. 
8d40: 20 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a       argc -= 2;.
8d50: 20 20 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b        argv += 2;
8d60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8d70: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d  trcmp(argv[1],"-
8d80: 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20  header")==0 ){. 
8d90: 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65       data.showHe
8da0: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
8db0: 61 72 67 63 2d 2d 3b 0a 20 20 20 20 20 20 61 72  argc--;.      ar
8dc0: 67 76 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  gv++;.    }else 
8dd0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
8de0: 31 5d 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d  1],"-noheader")=
8df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
8e00: 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
8e10: 0a 20 20 20 20 20 20 61 72 67 63 2d 2d 3b 0a 20  .      argc--;. 
8e20: 20 20 20 20 20 61 72 67 76 2b 2b 3b 0a 20 20 20       argv++;.   
8e30: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
8e40: 70 28 61 72 67 76 5b 31 5d 2c 22 2d 65 63 68 6f  p(argv[1],"-echo
8e50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
8e60: 61 74 61 2e 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a  ata.echoOn = 1;.
8e70: 20 20 20 20 20 20 61 72 67 63 2d 2d 3b 0a 20 20        argc--;.  
8e80: 20 20 20 20 61 72 67 76 2b 2b 3b 0a 20 20 20 20      argv++;.    
8e90: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
8ea0: 28 61 72 67 76 5b 31 5d 2c 22 2d 76 65 72 73 69  (argv[1],"-versi
8eb0: 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
8ec0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
8ed0: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 29 3b  sqlite_version);
8ee0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8ef0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8f00: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d  trcmp(argv[1],"-
8f10: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
8f20: 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20     usage(1);.   
8f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
8f40: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
8f50: 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e  : unknown option
8f60: 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20  : %s\n", Argv0, 
8f70: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
8f80: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
8f90: 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20  Use -help for a 
8fa0: 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e  list of options.
8fb0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
8fc0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8fd0: 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 7b  .  if( argc<2 ){
8fe0: 0a 20 20 20 20 75 73 61 67 65 28 30 29 3b 0a 20  .    usage(0);. 
8ff0: 20 7d 65 6c 73 65 20 69 66 28 20 61 72 67 63 3d   }else if( argc=
9000: 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e  =3 ){.    /* Run
9010: 20 6a 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e   just the comman
9020: 64 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  d that follows t
9030: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
9040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9050: 61 72 67 76 5b 32 5d 5b 30 5d 3d 3d 27 2e 27 20  argv[2][0]=='.' 
9060: 29 7b 0a 20 20 20 20 20 20 64 6f 5f 6d 65 74 61  ){.      do_meta
9070: 5f 63 6f 6d 6d 61 6e 64 28 61 72 67 76 5b 32 5d  _command(argv[2]
9080: 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20  , &data);.      
9090: 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 65 6c  exit(0);.    }el
90a0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
90b0: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28  ;.      open_db(
90c0: 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63  &data);.      rc
90d0: 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64   = sqlite_exec(d
90e0: 62 2c 20 61 72 67 76 5b 32 5d 2c 20 63 61 6c 6c  b, argv[2], call
90f0: 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
9100: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
9110: 28 20 72 63 21 3d 30 20 26 26 20 7a 45 72 72 4d  ( rc!=0 && zErrM
9120: 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sg!=0 ){.       
9130: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
9140: 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
9150: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
9160: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
9170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9180: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20  lse{.    /* Run 
9190: 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65 69 76 65  commands receive
91a0: 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
91b0: 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20 20  input.    */.   
91c0: 20 69 66 28 20 69 73 61 74 74 79 28 66 69 6c 65   if( isatty(file
91d0: 6e 6f 28 73 74 64 6f 75 74 29 29 20 26 26 20 69  no(stdout)) && i
91e0: 73 61 74 74 79 28 66 69 6c 65 6e 6f 28 73 74 64  satty(fileno(std
91f0: 69 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68  in)) ){.      ch
9200: 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20  ar *zHome;.     
9210: 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20   char *zHistory 
9220: 3d 20 30 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  = 0;.      print
9230: 66 28 0a 20 20 20 20 20 20 20 20 22 53 51 4c 69  f(.        "SQLi
9240: 74 65 20 76 65 72 73 69 6f 6e 20 25 73 5c 6e 22  te version %s\n"
9250: 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20  .        "Enter 
9260: 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 69 6e  \".help\" for in
9270: 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 2c 0a 20  structions\n",. 
9280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 76 65         sqlite_ve
9290: 72 73 69 6f 6e 0a 20 20 20 20 20 20 29 3b 0a 20  rsion.      );. 
92a0: 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 69 6e       zHome = fin
92b0: 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20  d_home_dir();.  
92c0: 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20 26 26      if( zHome &&
92d0: 20 28 7a 48 69 73 74 6f 72 79 20 3d 20 6d 61 6c   (zHistory = mal
92e0: 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 48 6f 6d 65  loc(strlen(zHome
92f0: 29 2b 32 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+20))!=0 ){.   
9300: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 48 69       sprintf(zHi
9310: 73 74 6f 72 79 2c 22 25 73 2f 2e 73 71 6c 69 74  story,"%s/.sqlit
9320: 65 5f 68 69 73 74 6f 72 79 22 2c 20 7a 48 6f 6d  e_history", zHom
9330: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9340: 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29    if( zHistory )
9350: 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 7a 48   read_history(zH
9360: 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 70  istory);.      p
9370: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61  rocess_input(&da
9380: 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ta, 0);.      if
9390: 28 20 7a 48 69 73 74 6f 72 79 20 29 7b 0a 20 20  ( zHistory ){.  
93a0: 20 20 20 20 20 20 73 74 69 66 6c 65 5f 68 69 73        stifle_his
93b0: 74 6f 72 79 28 31 30 30 29 3b 0a 20 20 20 20 20  tory(100);.     
93c0: 20 20 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79     write_history
93d0: 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  (zHistory);.    
93e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
93f0: 20 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e 70       process_inp
9400: 75 74 28 26 64 61 74 61 2c 20 73 74 64 69 6e 29  ut(&data, stdin)
9410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
9420: 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26 64 61  t_table_name(&da
9430: 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  ta, 0);.  if( db
9440: 20 29 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28   ) sqlite_close(
9450: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  db);.  return 0;
9460: 0a 7d 0a                                         .}.