System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c9f596d5b2fff3bd7a68ea2191d0a8d72c881a83:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 73  es..**.** $Id: s
01f0: 68 65 6c 6c 2e 63 2c 76 20 31 2e 31 2e 31 2e 31  hell.c,v 1.1.1.1
0200: 20 32 30 30 35 2f 30 33 2f 30 31 20 31 36 3a 30   2005/03/01 16:0
0210: 34 3a 33 35 20 72 6d 73 69 6d 70 73 6f 6e 20 45  4:35 rmsimpson E
0220: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0230: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0240: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0250: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0260: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0270: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0280: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
0290: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
02a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
02b0: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
02c0: 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  (WIN32) && !defi
02d0: 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f 29 0a 23  ned(__MACOS__).#
02e0: 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c   include <signal
02f0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70  .h>.# include <p
0300: 77 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  wd.h>.# include 
0310: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63  <unistd.h>.# inc
0320: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0330: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  h>.#endif..#ifde
0340: 66 20 5f 5f 4d 41 43 4f 53 5f 5f 0a 23 20 69 6e  f __MACOS__.# in
0350: 63 6c 75 64 65 20 3c 63 6f 6e 73 6f 6c 65 2e 68  clude <console.h
0360: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69 67  >.# include <sig
0370: 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  nal.h>.# include
0380: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e   <unistd.h>.# in
0390: 63 6c 75 64 65 20 3c 65 78 74 72 61 73 2e 68 3e  clude <extras.h>
03a0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 46 69 6c 65  .# include <File
03b0: 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  s.h>.# include <
03c0: 46 6f 6c 64 65 72 73 2e 68 3e 0a 23 65 6e 64 69  Folders.h>.#endi
03d0: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  f..#if defined(H
03e0: 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26  AVE_READLINE) &&
03f0: 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d   HAVE_READLINE==
0400: 31 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61  1.# include <rea
0410: 64 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68  dline/readline.h
0420: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61  >.# include <rea
0430: 64 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e  dline/history.h>
0440: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0450: 72 65 61 64 6c 69 6e 65 28 70 29 20 6c 6f 63 61  readline(p) loca
0460: 6c 5f 67 65 74 6c 69 6e 65 28 70 2c 73 74 64 69  l_getline(p,stdi
0470: 6e 29 0a 23 20 64 65 66 69 6e 65 20 61 64 64 5f  n).# define add_
0480: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
0490: 69 6e 65 20 72 65 61 64 5f 68 69 73 74 6f 72 79  ine read_history
04a0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 77 72 69  (X).# define wri
04b0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  te_history(X).# 
04c0: 64 65 66 69 6e 65 20 73 74 69 66 6c 65 5f 68 69  define stifle_hi
04d0: 73 74 6f 72 79 28 58 29 0a 23 65 6e 64 69 66 0a  story(X).#endif.
04e0: 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 73  ./* Make sure is
04f0: 61 74 74 79 28 29 20 68 61 73 20 61 20 70 72 6f  atty() has a pro
0500: 74 6f 74 79 70 65 2e 0a 2a 2f 0a 65 78 74 65 72  totype..*/.exter
0510: 6e 20 69 6e 74 20 69 73 61 74 74 79 28 29 3b 0a  n int isatty();.
0520: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
0530: 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65 6e  wing is the open
0540: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0550: 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f 69  .  We make a poi
0560: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20  nter.** to this 
0570: 64 61 74 61 62 61 73 65 20 61 20 73 74 61 74 69  database a stati
0580: 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  c variable so th
0590: 61 74 20 69 74 20 63 61 6e 20 62 65 20 61 63 63  at it can be acc
05a0: 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  essed.** by the 
05b0: 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20 74  SIGINT handler t
05c0: 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61 74 61  o interrupt data
05d0: 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  base processing.
05e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
05f0: 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 2f 2a 0a  e3 *db = 0;../*.
0600: 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69 6e  ** True if an in
0610: 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f 6c  terrupt (Control
0620: 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65 63  -C) has been rec
0630: 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eived..*/.static
0640: 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72 75   int seenInterru
0650: 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  pt = 0;../*.** T
0660: 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65 20  his is the name 
0670: 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20  of our program. 
0680: 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61 69  It is set in mai
0690: 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n(), used.** in 
06a0: 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65  a number of othe
06b0: 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79  r places, mostly
06c0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
06d0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
06e0: 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a  har *Argv0;../*.
06f0: 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e 67  ** Prompt string
0700: 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 69  s. Initialized i
0710: 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c 65  n main. Settable
0720: 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d   with.**   .prom
0730: 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65  pt main continue
0740: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
0750: 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  mainPrompt[20]; 
0760: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e      /* First lin
0770: 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  e prompt. defaul
0780: 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a  t: "sqlite> "*/.
0790: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 74  static char cont
07a0: 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  inuePrompt[20]; 
07b0: 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  /* Continuation 
07c0: 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a  prompt. default:
07d0: 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a   "   ...> " */..
07e0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
07f0: 73 20 69 66 20 61 20 73 74 72 69 6e 67 20 69 73  s if a string is
0800: 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74   a number of not
0810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0820: 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 75  isNumber(const u
0830: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c  nsigned char *z,
0840: 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a   int *realnum){.
0850: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c    if( *z=='-' ||
0860: 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a   *z=='+' ) z++;.
0870: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
0880: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0890: 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20   0;.  }.  z++;. 
08a0: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
08b0: 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77  realnum = 0;.  w
08c0: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a  hile( isdigit(*z
08d0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66  ) ){ z++; }.  if
08e0: 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  ( *z=='.' ){.   
08f0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69   z++;.    if( !i
0900: 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sdigit(*z) ) ret
0910: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
0920: 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  ( isdigit(*z) ){
0930: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
0940: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
0950: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  um = 1;.  }.  if
0960: 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d  ( *z=='e' || *z=
0970: 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  ='E' ){.    z++;
0980: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27  .    if( *z=='+'
0990: 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b   || *z=='-' ) z+
09a0: 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69  +;.    if( !isdi
09b0: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
09c0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
09d0: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sdigit(*z) ){ z+
09e0: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  +; }.    if( rea
09f0: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
0a00: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
0a10: 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n *z==0;.}../*.*
0a20: 2a 20 41 20 67 6c 6f 62 61 6c 20 63 68 61 72 2a  * A global char*
0a30: 20 61 6e 64 20 61 6e 20 53 51 4c 20 66 75 6e 63   and an SQL func
0a40: 74 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20 69  tion to access i
0a50: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
0a60: 20 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e   .** from within
0a70: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
0a80: 74 2e 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20  t. This program 
0a90: 75 73 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  used to use the 
0aa0: 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 5f  .** sqlite_exec_
0ab0: 70 72 69 6e 74 66 28 29 20 41 50 49 20 74 6f 20  printf() API to 
0ac0: 73 75 62 73 74 69 74 75 65 20 61 20 73 74 72 69  substitue a stri
0ad0: 6e 67 20 69 6e 74 6f 20 61 6e 20 53 51 4c 20 73  ng into an SQL s
0ae0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65  tatement..** The
0af0: 20 63 6f 72 72 65 63 74 20 77 61 79 20 74 6f 20   correct way to 
0b00: 64 6f 20 74 68 69 73 20 77 69 74 68 20 73 71 6c  do this with sql
0b10: 69 74 65 33 20 69 73 20 74 6f 20 75 73 65 20 74  ite3 is to use t
0b20: 68 65 20 62 69 6e 64 20 41 50 49 2c 20 62 75 74  he bind API, but
0b30: 0a 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73 68  .** since the sh
0b40: 65 6c 6c 20 69 73 20 62 75 69 6c 74 20 61 72 6f  ell is built aro
0b50: 75 6e 64 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  und the callback
0b60: 20 70 61 72 61 64 69 67 6d 20 69 74 20 77 6f 75   paradigm it wou
0b70: 6c 64 20 62 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f  ld be a lot.** o
0b80: 66 20 77 6f 72 6b 2e 20 49 6e 73 74 65 61 64 20  f work. Instead 
0b90: 6a 75 73 74 20 75 73 65 20 74 68 69 73 20 68 61  just use this ha
0ba0: 63 6b 2c 20 77 68 69 63 68 20 69 73 20 71 75 69  ck, which is qui
0bb0: 74 65 20 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f 0a  te harmless..*/.
0bc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0bd0: 72 20 2a 7a 53 68 65 6c 6c 53 74 61 74 69 63 20  r *zShellStatic 
0be0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  = 0;.static void
0bf0: 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e 63   shellstaticFunc
0c00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0c10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
0c20: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
0c30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0c40: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  .){.  assert( 0=
0c50: 3d 61 72 67 63 20 29 3b 0a 20 20 61 73 73 65 72  =argc );.  asser
0c60: 74 28 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20  t( zShellStatic 
0c70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
0c80: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
0c90: 2c 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c 20  , zShellStatic, 
0ca0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
0cb0: 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  C);.}.../*.** Th
0cc0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
0cd0: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
0ce0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
0cf0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
0d00: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
0d10: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
0d20: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
0d30: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
0d40: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
0d50: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
0d60: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
0d70: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
0d80: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
0d90: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
0da0: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
0db0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
0dc0: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
0dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0de0: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
0df0: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
0e00: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
0e10: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
0e20: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Line;.  int n;. 
0e30: 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28   int eol;..  if(
0e40: 20 7a 50 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72   zPrompt && *zPr
0e50: 6f 6d 70 74 20 29 7b 0a 20 20 20 20 70 72 69 6e  ompt ){.    prin
0e60: 74 66 28 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29  tf("%s",zPrompt)
0e70: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64  ;.    fflush(std
0e80: 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e  out);.  }.  nLin
0e90: 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65  e = 100;.  zLine
0ea0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65   = malloc( nLine
0eb0: 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d   );.  if( zLine=
0ec0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0ed0: 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20   n = 0;.  eol = 
0ee0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c  0;.  while( !eol
0ef0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30   ){.    if( n+10
0f00: 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20  0>nLine ){.     
0f10: 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32   nLine = nLine*2
0f20: 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c   + 100;.      zL
0f30: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c  ine = realloc(zL
0f40: 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20  ine, nLine);.   
0f50: 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
0f60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
0f70: 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28  }.    if( fgets(
0f80: 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65  &zLine[n], nLine
0f90: 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a   - n, in)==0 ){.
0fa0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
0fb0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  {.        free(z
0fc0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Line);.        r
0fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
0fe0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
0ff0: 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d  = 0;.      eol =
1000: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
1010: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1020: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b  ( zLine[n] ){ n+
1030: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30  +; }.    if( n>0
1040: 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d   && zLine[n-1]==
1050: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d  '\n' ){.      n-
1060: 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e  -;.      zLine[n
1070: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
1080: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1090: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
10a0: 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b  c( zLine, n+1 );
10b0: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b  .  return zLine;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
10d0: 76 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65  ve a single line
10e0: 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 20   of input text. 
10f0: 20 22 69 73 61 74 74 79 22 20 69 73 20 74 72 75   "isatty" is tru
1100: 65 20 69 66 20 74 65 78 74 0a 2a 2a 20 69 73 20  e if text.** is 
1110: 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 74 65  coming from a te
1120: 72 6d 69 6e 61 6c 2e 20 20 49 6e 20 74 68 61 74  rminal.  In that
1130: 20 63 61 73 65 2c 20 77 65 20 69 73 73 75 65 20   case, we issue 
1140: 61 20 70 72 6f 6d 70 74 20 61 6e 64 0a 2a 2a 20  a prompt and.** 
1150: 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 22  attempt to use "
1160: 72 65 61 64 6c 69 6e 65 22 20 66 6f 72 20 63 6f  readline" for co
1170: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
1180: 6e 67 2e 20 20 49 66 20 22 69 73 61 74 74 79 22  ng.  If "isatty"
1190: 0a 2a 2a 20 69 73 20 66 61 6c 73 65 2c 20 75 73  .** is false, us
11a0: 65 20 22 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  e "local_getline
11b0: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 72 65  " instead of "re
11c0: 61 64 6c 69 6e 65 22 20 61 6e 64 20 69 73 73 75  adline" and issu
11d0: 65 20 6e 6f 20 70 72 6f 6d 70 74 2e 0a 2a 2a 0a  e no prompt..**.
11e0: 2a 2a 20 7a 50 72 69 6f 72 20 69 73 20 61 20 73  ** zPrior is a s
11f0: 74 72 69 6e 67 20 6f 66 20 70 72 69 6f 72 20 74  tring of prior t
1200: 65 78 74 20 72 65 74 72 69 65 76 65 64 2e 20 20  ext retrieved.  
1210: 49 66 20 6e 6f 74 20 74 68 65 20 65 6d 70 74 79  If not the empty
1220: 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 74 68 65 6e  .** string, then
1230: 20 69 73 73 75 65 20 61 20 63 6f 6e 74 69 6e 75   issue a continu
1240: 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a 2a 2f  ation prompt..*/
1250: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e  .static char *on
1260: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 63 6f 6e  e_input_line(con
1270: 73 74 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c  st char *zPrior,
1280: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
1290: 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63  ar *zPrompt;.  c
12a0: 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20  har *zResult;.  
12b0: 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20  if( in!=0 ){.   
12c0: 20 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f 67 65   return local_ge
12d0: 74 6c 69 6e 65 28 30 2c 20 69 6e 29 3b 0a 20 20  tline(0, in);.  
12e0: 7d 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 20 26  }.  if( zPrior &
12f0: 26 20 7a 50 72 69 6f 72 5b 30 5d 20 29 7b 0a 20  & zPrior[0] ){. 
1300: 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 63 6f 6e     zPrompt = con
1310: 74 69 6e 75 65 50 72 6f 6d 70 74 3b 0a 20 20 7d  tinuePrompt;.  }
1320: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
1330: 74 20 3d 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a  t = mainPrompt;.
1340: 20 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20    }.  zResult = 
1350: 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74  readline(zPrompt
1360: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  );.#if defined(H
1370: 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26  AVE_READLINE) &&
1380: 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d   HAVE_READLINE==
1390: 31 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20  1.  if( zResult 
13a0: 29 20 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52  ) add_history(zR
13b0: 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a 20  esult);.#endif. 
13c0: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b   return zResult;
13d0: 0a 7d 0a 0a 73 74 72 75 63 74 20 70 72 65 76 69  .}..struct previ
13e0: 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61 20 7b 0a  ous_mode_data {.
13f0: 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20    int valid;    
1400: 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20      /* Is there 
1410: 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65  legit data in he
1420: 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  re? */.  int mod
1430: 65 3b 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61  e;.  int showHea
1440: 64 65 72 3b 0a 20 20 69 6e 74 20 63 6f 6c 57 69  der;.  int colWi
1450: 64 74 68 5b 31 30 30 5d 3b 0a 7d 3b 0a 2f 2a 0a  dth[100];.};./*.
1460: 2a 2a 20 41 6e 20 70 6f 69 6e 74 65 72 20 74 6f  ** An pointer to
1470: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1480: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
1490: 73 20 70 61 73 73 65 64 20 66 72 6f 6d 0a 2a 2a  s passed from.**
14a0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
14b0: 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
14c0: 6b 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  k.  This is used
14d0: 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 0a   to communicate.
14e0: 2a 2a 20 73 74 61 74 65 20 61 6e 64 20 6d 6f 64  ** state and mod
14f0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  e information..*
1500: 2f 0a 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  /.struct callbac
1510: 6b 5f 64 61 74 61 20 7b 0a 20 20 73 71 6c 69 74  k_data {.  sqlit
1520: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1530: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1540: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f  se */.  int echo
1550: 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  On;            /
1560: 2a 20 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69  * True to echo i
1570: 6e 70 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f  nput commands */
1580: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
1590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
15b0: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
15c0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
15e0: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
15f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b  e */.  int mode;
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1610: 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20   An output mode 
1620: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  setting */.  int
1630: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
1640: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
1650: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
1660: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
1670: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 63 68 61  mn mode */.  cha
1680: 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20  r *zDestTable;  
1690: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
16a0: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
16b0: 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72   when MODE_Inser
16c0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 73 65 70 61  t */.  char sepa
16d0: 72 61 74 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a  rator[20];    /*
16e0: 20 53 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   Separator chara
16f0: 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69  cter for MODE_Li
1700: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57  st */.  int colW
1710: 69 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f  idth[100];     /
1720: 2a 20 52 65 71 75 65 73 74 65 64 20 77 69 64 74  * Requested widt
1730: 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  h of each column
1740: 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20   when in column 
1750: 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74  mode*/.  int act
1760: 75 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  ualWidth[100];  
1770: 2f 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68 20  /* Actual width 
1780: 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a  of each column *
1790: 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c 76 61 6c  /.  char nullval
17a0: 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68  ue[20];    /* Th
17b0: 65 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74 20  e text to print 
17c0: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
17d0: 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20  s back from.    
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1800: 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  base */.  struct
1810: 20 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64   previous_mode_d
1820: 61 74 61 20 65 78 70 6c 61 69 6e 50 72 65 76 3b  ata explainPrev;
1830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 6c            /* Hol
1850: 64 73 20 74 68 65 20 6d 6f 64 65 20 69 6e 66 6f  ds the mode info
1860: 72 6d 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  rmation just bef
1870: 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1890: 2e 65 78 70 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20  .explain ON */. 
18a0: 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49   char outfile[FI
18b0: 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20  LENAME_MAX]; /* 
18c0: 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75  Filename for *ou
18d0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
18e0: 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20  r *zDbFilename; 
18f0: 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
1900: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1910: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b  */.  char *zKey;
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 2f 2a 20 45 6e 63 72 79 70 74 69 6f 6e 20 6b   /* Encryption k
1940: 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ey */.};../*.** 
1950: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
1960: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
1970: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
1980: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
1990: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
19a0: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
19b0: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
19c0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
19d0: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
19e0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
19f0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
1a00: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
1a10: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
1a20: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
1a30: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
1a40: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
1a50: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
1a60: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
1a70: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
1a80: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
1a90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
1aa0: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
1ab0: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
1ac0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
1ad0: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
1ae0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
1af0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
1b00: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
1b10: 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20  ne MODE_Tcl     
1b20: 20 36 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   6  /* Generate 
1b30: 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75  ANSI-C or TCL qu
1b40: 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  oted elements */
1b50: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73  .#define MODE_Cs
1b60: 76 20 20 20 20 20 20 37 20 20 2f 2a 20 51 75 6f  v      7  /* Quo
1b70: 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62  te strings, numb
1b80: 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f  ers are plain */
1b90: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4e 55  .#define MODE_NU
1ba0: 4d 5f 4f 46 20 20 20 38 20 20 2f 2a 20 54 68 65  M_OF   8  /* The
1bb0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 64 65 73   number of modes
1bc0: 20 28 6e 6f 74 20 61 20 6d 6f 64 65 20 69 74 73   (not a mode its
1bd0: 65 6c 66 29 20 2a 2f 0a 0a 63 68 61 72 20 2a 6d  elf) */..char *m
1be0: 6f 64 65 44 65 73 63 72 5b 4d 4f 44 45 5f 4e 55  odeDescr[MODE_NU
1bf0: 4d 5f 4f 46 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e  M_OF] = {.  "lin
1c00: 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a  e",.  "column",.
1c10: 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d    "list",.  "sem
1c20: 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20  i",.  "html",.  
1c30: 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 74 63 6c  "insert",.  "tcl
1c40: 22 2c 0a 20 20 22 63 73 76 22 2c 0a 7d 3b 0a 0a  ",.  "csv",.};..
1c50: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
1c60: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
1c70: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
1c80: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 73  ArraySize(X)  (s
1c90: 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28  izeof(X)/sizeof(
1ca0: 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 75  X[0]))../*.** Ou
1cb0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
1cc0: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
1cd0: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
1ce0: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
1cf0: 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntions..*/.stati
1d00: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
1d10: 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  oted_string(FILE
1d20: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
1d30: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
1d40: 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20    int nSingle = 
1d50: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  0;.  for(i=0; z[
1d60: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
1d70: 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  ( z[i]=='\'' ) n
1d80: 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20  Single++;.  }.  
1d90: 69 66 28 20 6e 53 69 6e 67 6c 65 3d 3d 30 20 29  if( nSingle==0 )
1da0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1db0: 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d  t,"'%s'",z);.  }
1dc0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
1dd0: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 20 20  f(out,"'");.    
1de0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
1df0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
1e00: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20   && z[i]!='\''; 
1e10: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
1e20: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i==0 ){.       
1e30: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 27   fprintf(out,"''
1e40: 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b  ");.        z++;
1e50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e60: 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20   z[i]=='\'' ){. 
1e70: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1e80: 75 74 2c 22 25 2e 2a 73 27 27 22 2c 69 2c 7a 29  ut,"%.*s''",i,z)
1e90: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
1ea0: 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1eb0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1ec0: 28 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a 20 20  (out,"%s",z);.  
1ed0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ee0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1ef0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b  printf(out,"'");
1f00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  .  }.}../*.** Ou
1f10: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
1f20: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
1f30: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43  d according to C
1f40: 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20   or TCL quoting 
1f50: 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rules..*/.static
1f60: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73   void output_c_s
1f70: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
1f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
1fa0: 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20  c;.  fputc('"', 
1fb0: 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  out);.  while( (
1fc0: 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29  c = *(z++))!=0 )
1fd0: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c  {.    if( c=='\\
1fe0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
1ff0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
2000: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
2010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
2020: 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\t' ){.      fp
2030: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
2040: 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c        fputc('t',
2050: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
2060: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
2070: 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27        fputc('\\'
2080: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
2090: 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20  utc('n', out);. 
20a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
20b0: 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\r' ){.      fp
20c0: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
20d0: 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c        fputc('r',
20e0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
20f0: 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 29   if( !isprint(c)
2100: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
2110: 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c  f(out, "\\%03o",
2120: 20 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   c);.    }else{.
2130: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
2140: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
2150: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
2160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
2170: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
2180: 6e 67 20 77 69 74 68 20 63 68 61 72 61 63 74 65  ng with characte
2190: 72 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  rs that are spec
21a0: 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65  ial to.** HTML e
21b0: 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  scaped..*/.stati
21c0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74  c void output_ht
21d0: 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ml_string(FILE *
21e0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
21f0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
2200: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2210: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26   for(i=0; z[i] &
2220: 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 26 26 20 7a  & z[i]!='<' && z
2230: 5b 69 5d 21 3d 27 26 27 3b 20 69 2b 2b 29 7b 7d  [i]!='&'; i++){}
2240: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
2250: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
2260: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
2270: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
2280: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
2290: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74  fprintf(out,"&lt
22a0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
22b0: 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a  f( z[i]=='&' ){.
22c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
22d0: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
22e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
22f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
2300: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
2310: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20  ./*.** Output a 
2320: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43  single term of C
2330: 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70  SV.  Actually, p
2340: 2d 3e 73 65 70 61 72 61 74 6f 72 20 69 73 20 75  ->separator is u
2350: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
2360: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
2370: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
2380: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
2390: 75 6c 6c 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullvalue is.** t
23a0: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
23b0: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
23c0: 65 64 20 75 73 69 6e 67 20 41 4e 53 49 2d 43 20  ed using ANSI-C 
23d0: 72 75 6c 65 73 2e 20 20 4e 75 6d 62 65 72 73 0a  rules.  Numbers.
23e0: 2a 2a 20 61 70 70 65 61 72 20 6f 75 74 73 69 64  ** appear outsid
23f0: 65 20 6f 66 20 71 75 6f 74 65 73 2e 0a 2a 2f 0a  e of quotes..*/.
2400: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
2410: 75 74 5f 63 73 76 28 73 74 72 75 63 74 20 63 61  ut_csv(struct ca
2420: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20  llback_data *p, 
2430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
2440: 6e 74 20 62 53 65 70 29 7b 0a 20 20 69 66 28 20  nt bSep){.  if( 
2450: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
2460: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
2470: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
2480: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
2490: 62 65 72 28 7a 2c 20 30 29 20 29 7b 0a 20 20 20  ber(z, 0) ){.   
24a0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
24b0: 22 25 73 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  "%s",z);.  }else
24c0: 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73  {.    output_c_s
24d0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 7a 29  tring(p->out, z)
24e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70  ;.  }.  if( bSep
24f0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
2500: 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70 61 72  p->out, p->separ
2510: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  ator);.  }.}..#i
2520: 66 64 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a  fdef SIGINT./*.*
2530: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2540: 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73 65  uns when the use
2550: 72 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43  r presses Ctrl-C
2560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2570: 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65  interrupt_handle
2580: 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a  r(int NotUsed){.
2590: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
25a0: 3d 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29 20  = 1;.  if( db ) 
25b0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
25c0: 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t(db);.}.#endif.
25d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
25e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
25f0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
2600: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
2610: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
2620: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
2630: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
2640: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
2650: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
2660: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
2670: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
2680: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2690: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
26a0: 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63 61   *p = (struct ca
26b0: 6c 6c 62 61 63 6b 5f 64 61 74 61 2a 29 70 41 72  llback_data*)pAr
26c0: 67 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  g;.  switch( p->
26d0: 6d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  mode ){.    case
26e0: 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20   MODE_Line: {.  
26f0: 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20      int w = 5;. 
2700: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
2710: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
2720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
2730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2740: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
2750: 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  (azCol[i]);.    
2760: 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20      if( len>w ) 
2770: 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  w = len;.      }
2780: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
2790: 74 2b 2b 3e 30 20 29 20 66 70 72 69 6e 74 66 28  t++>0 ) fprintf(
27a0: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
27b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
27d0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
27e0: 74 2c 22 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20  t,"%*s = %s\n", 
27f0: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 0a 20 20  w, azCol[i], .  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
2810: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
2820: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  ] : p->nullvalue
2830: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2850: 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75    case MODE_Colu
2860: 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  mn: {.      if( 
2870: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20  p->cnt++==0 ){. 
2880: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2890: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
28a0: 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e          int w, n
28b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28c0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63  i<ArraySize(p->c
28d0: 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  olWidth) ){.    
28e0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
28f0: 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  colWidth[i];.   
2900: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2910: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
2920: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2930: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 3d 30          if( w<=0
2940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2950: 77 20 3d 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c  w = strlen(azCol
2960: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
2970: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
2980: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
2990: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
29a0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41 72   n = strlen(azAr
29b0: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
29c0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
29d0: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
29e0: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
29f0: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
2a00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2a10: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
2a20: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
2a40: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
2a50: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
2a60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
2a70: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
2a80: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2a90: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
2aa0: 25 73 22 2c 77 2c 77 2c 61 7a 43 6f 6c 5b 69 5d  %s",w,w,azCol[i]
2ab0: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c  , i==nArg-1 ? "\
2ac0: 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  n": "  ");.     
2ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2af0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
2b00: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2b10: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
2b20: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
2b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b40: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
2b50: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
2b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b70: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
2b80: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
2b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ba0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2bc0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2bd0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
2be0: 73 25 73 22 2c 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d  s%s",w,w,"------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
2c80: 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20  "\n": "  ");.   
2c90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2cb0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
2cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
2cd0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
2ce0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2cf0: 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  w;.        if( i
2d00: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
2d10: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
2d20: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
2d30: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
2d40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d50: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
2d60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d70: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
2d80: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
2d90: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  w,.            a
2da0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
2db0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  i] : p->nullvalu
2dc0: 65 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22  e, i==nArg-1 ? "
2dd0: 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  \n": "  ");.    
2de0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
2df0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e00: 4d 4f 44 45 5f 53 65 6d 69 3a 0a 20 20 20 20 63  MODE_Semi:.    c
2e10: 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b  ase MODE_List: {
2e20: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
2e30: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
2e40: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
2e50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
2e60: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2e70: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
2e80: 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b  ut,"%s%s",azCol[
2e90: 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  i], i==nArg-1 ? 
2ea0: 22 5c 6e 22 20 3a 20 70 2d 3e 73 65 70 61 72 61  "\n" : p->separa
2eb0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
2ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ed0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
2ee0: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
2ef0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
2f00: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2f10: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
2f20: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
2f30: 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  z = p->nullvalue
2f40: 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
2f50: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
2f60: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
2f70: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
2f80: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
2f90: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
2fa0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
2fb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2fc0: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 53 65 6d 69 20  mode==MODE_Semi 
2fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
2fe0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
2ff0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n");.        }el
3000: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
3010: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
3020: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
3030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3040: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3050: 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a  se MODE_Html: {.
3060: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
3070: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
3080: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
3090: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
30a0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
30b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
30c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
30d0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
30e0: 74 2c 22 3c 54 48 3e 25 73 3c 2f 54 48 3e 22 2c  t,"<TH>%s</TH>",
30f0: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
3100: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
3110: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
3120: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
3130: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
3140: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3150: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3160: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
3170: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
3180: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
3190: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
31a0: 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f  TD>");.        o
31b0: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
31c0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
31d0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
31e0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
31f0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
3200: 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29  ->out,"</TD>\n")
3210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3220: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
3230: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
3240: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3250: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
3260: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
3270: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
3280: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
3290: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
32a0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
32b0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
32c0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
32d0: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
32e0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
32f0: 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72  , "%s", p->separ
3300: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
3310: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
3320: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
3330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3340: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
3350: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
3360: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
3370: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
3380: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
3390: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
33a0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
33b0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ue);.        fpr
33c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
33d0: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
33e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33f0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
3400: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
3410: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3420: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
3430: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
3440: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
3450: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
3460: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
3470: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
3480: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
3490: 7a 43 6f 6c 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d  zCol[i], i<nArg-
34a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
34b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
34c0: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
34d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
34e0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
34f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3500: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
3510: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
3520: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
3530: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Arg-1);.      }.
3540: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
3550: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
3560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3570: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73     case MODE_Ins
3580: 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ert: {.      if(
3590: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
35a0: 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  k;.      fprintf
35b0: 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20  (p->out,"INSERT 
35c0: 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 28 22  INTO %s VALUES("
35d0: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
35e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
35f0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
3600: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70        char *zSep
3610: 20 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20 22 22   = i>0 ? ",": ""
3620: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
3630: 41 72 67 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Arg[i]==0 ){.   
3640: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
3650: 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c 22 2c 7a  ->out,"%sNULL",z
3660: 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Sep);.        }e
3670: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
3680: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
3690: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
36a0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
36b0: 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29  ,zSep, azArg[i])
36c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
36d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
36e0: 53 65 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66  Sep[0] ) fprintf
36f0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65  (p->out,"%s",zSe
3700: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  p);.          ou
3710: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
3720: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
3730: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
3740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
3750: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
3760: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
3770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
3780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3790: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
37a0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
37b0: 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63  d of the callbac
37c0: 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75 72 65  k_data structure
37d0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
37e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
37f0: 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
3800: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
3810: 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
3820: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
3830: 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
3840: 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61 6c 6c  name(struct call
3850: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f  back_data *p, co
3860: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
3870: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
3880: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20  int needQuote;. 
3890: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
38a0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
38b0: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
38c0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
38d0: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
38e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
38f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
3900: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73   needQuote = !is
3910: 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20  alpha((unsigned 
3920: 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26 20  char)*zName) && 
3930: 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20 66  *zName!='_';.  f
3940: 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65 5b  or(i=n=0; zName[
3950: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
3960: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
3970: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
3980: 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61 6d  Name[i]) && zNam
3990: 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20 20  e[i]!='_' ){.   
39a0: 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 31     needQuote = 1
39b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
39c0: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b  e[i]=='\'' ) n++
39d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
39e0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e 20  ( needQuote ) n 
39f0: 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a  += 2;.  z = p->z
3a00: 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
3a10: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
3a20: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   z==0 ){.    fpr
3a30: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
3a40: 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b   of memory!\n");
3a50: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
3a60: 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  }.  n = 0;.  if(
3a70: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e   needQuote ) z[n
3a80: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
3a90: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
3aa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b   i++){.    z[n++
3ab0: 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20  ] = zName[i];.  
3ac0: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d    if( zName[i]==
3ad0: 27 5c 27 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  '\'' ) z[n++] = 
3ae0: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
3af0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  needQuote ) z[n+
3b00: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e  +] = '\'';.  z[n
3b10: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e  ] = 0;.}../* zIn
3b20: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
3b30: 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74  nter to a NULL-t
3b40: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
3b50: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3b60: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c  ned.** from mall
3b70: 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20  oc(), or a NULL 
3b80: 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72  pointer. The str
3b90: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
3ba0: 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20  y zAppend is.** 
3bb0: 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e  added to zIn, an
3bc0: 64 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74  d the result ret
3bd0: 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  urned in memory 
3be0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
3bf0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20  lloc()..** zIn, 
3c00: 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55  if it was not NU
3c10: 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a  LL, is freed..**
3c20: 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
3c30: 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65   argument, quote
3c40: 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74  , is not '\0', t
3c50: 68 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61  hen it is used a
3c60: 73 20 61 20 0a 2a 2a 20 71 75 6f 74 65 20 63 68  s a .** quote ch
3c70: 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70  aracter for zApp
3c80: 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  end..*/.static c
3c90: 68 61 72 20 2a 20 61 70 70 65 6e 64 54 65 78 74  har * appendText
3ca0: 28 63 68 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72  (char *zIn, char
3cb0: 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c   const *zAppend,
3cc0: 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20   char quote){.  
3cd0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69  int len;.  int i
3ce0: 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20  ;.  int nAppend 
3cf0: 3d 20 73 74 72 6c 65 6e 28 7a 41 70 70 65 6e 64  = strlen(zAppend
3d00: 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 28  );.  int nIn = (
3d10: 7a 49 6e 3f 73 74 72 6c 65 6e 28 7a 49 6e 29 3a  zIn?strlen(zIn):
3d20: 30 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70  0);..  len = nAp
3d30: 70 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20 20 69 66  pend+nIn+1;.  if
3d40: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c  ( quote ){.    l
3d50: 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72  en += 2;.    for
3d60: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
3d70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3d80: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
3d90: 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20  te ) len++;.    
3da0: 7d 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20 3d 20 28  }.  }..  zIn = (
3db0: 63 68 61 72 20 2a 29 72 65 61 6c 6c 6f 63 28 7a  char *)realloc(z
3dc0: 49 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  In, len);.  if( 
3dd0: 21 7a 49 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  !zIn ){.    retu
3de0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
3df0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
3e00: 61 72 20 2a 7a 43 73 72 20 3d 20 26 7a 49 6e 5b  ar *zCsr = &zIn[
3e10: 6e 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  nIn];.    *zCsr+
3e20: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
3e30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
3e40: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
3e50: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
3e60: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
3e70: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
3e80: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
3e90: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
3ea0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
3eb0: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 5c 30     *zCsr++ = '\0
3ec0: 27 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ';.    assert( (
3ed0: 7a 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65 6e 20 29  zCsr-zIn)==len )
3ee0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
3ef0: 65 6d 63 70 79 28 26 7a 49 6e 5b 6e 49 6e 5d 2c  emcpy(&zIn[nIn],
3f00: 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e   zAppend, nAppen
3f10: 64 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c 65 6e 2d  d);.    zIn[len-
3f20: 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  1] = '\0';.  }..
3f30: 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d 0a    return zIn;.}.
3f40: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
3f50: 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e  a query statemen
3f60: 74 20 74 68 61 74 20 68 61 73 20 61 20 73 69 6e  t that has a sin
3f70: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
3f80: 6e 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 61  n.  Print.** tha
3f90: 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  t result column 
3fa0: 6f 6e 20 61 20 6c 69 6e 65 20 62 79 20 69 74 73  on a line by its
3fb0: 65 6c 66 20 77 69 74 68 20 61 20 73 65 6d 69 63  elf with a semic
3fc0: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e  olon terminator.
3fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
3fe0: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
3ff0: 65 72 79 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  ery(FILE *out, s
4000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
4010: 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 29  t char *zSelect)
4020: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
4030: 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74   *pSelect;.  int
4040: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
4050: 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
4060: 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53  zSelect, -1, &pS
4070: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
4080: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
4090: 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  | !pSelect ){.  
40a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
40b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
40c0: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
40d0: 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
40e0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 70  TE_ROW ){.    fp
40f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c  rintf(out, "%s;\
4100: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
4110: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
4120: 20 30 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73   0));.    rc = s
4130: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
4140: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ect);.  }.  retu
4150: 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
4160: 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  ize(pSelect);.}.
4170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4180: 61 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  a different call
4190: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65  back routine use
41a0: 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68  d for dumping th
41b0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45  e database..** E
41c0: 61 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64  ach row received
41d0: 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63   by this callbac
41e0: 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  k consists of a 
41f0: 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74  table name,.** t
4200: 68 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22  he table type ("
4210: 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65  index" or "table
4220: 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72  ") and SQL to cr
4230: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  eate the table..
4240: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4250: 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78  should print tex
4260: 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  t sufficient to 
4270: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62  recreate the tab
4280: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
4290: 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  t dump_callback(
42a0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
42b0: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
42c0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
42d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
42e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
42f0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
4300: 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20  *zType;.  const 
4310: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 74  char *zSql;.  st
4320: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
4330: 74 61 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  ta *p = (struct 
4340: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29  callback_data *)
4350: 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 6e 41 72  pArg;..  if( nAr
4360: 67 21 3d 33 20 29 20 72 65 74 75 72 6e 20 31 3b  g!=3 ) return 1;
4370: 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
4380: 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
4390: 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
43a0: 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a   = azArg[2];.  .
43b0: 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70    if( strcasecmp
43c0: 28 7a 54 61 62 6c 65 2c 22 73 71 6c 69 74 65 5f  (zTable,"sqlite_
43d0: 73 65 71 75 65 6e 63 65 22 29 21 3d 30 20 29 7b  sequence")!=0 ){
43e0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
43f0: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53  out, "%s;\n", zS
4400: 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
4410: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
4420: 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
4430: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
4440: 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n");.  }..  if( 
4450: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74  strcmp(zType, "t
4460: 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
4470: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
4480: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20  TableInfo = 0;. 
4490: 20 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74     char *zSelect
44a0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
44b0: 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a  zTableInfo = 0;.
44c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20 3d      char *zTmp =
44d0: 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a 54 61 62   0;.   .    zTab
44e0: 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54  leInfo = appendT
44f0: 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20  ext(zTableInfo, 
4500: 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
4510: 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54  fo(", 0);.    zT
4520: 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e  ableInfo = appen
4530: 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f  dText(zTableInfo
4540: 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a  , zTable, '"');.
4550: 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d      zTableInfo =
4560: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62   appendText(zTab
4570: 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c 20 30 29  leInfo, ");", 0)
4580: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
4590: 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64  te3_prepare(p->d
45a0: 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 2d  b, zTableInfo, -
45b0: 31 2c 20 26 70 54 61 62 6c 65 49 6e 66 6f 2c 20  1, &pTableInfo, 
45c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 61 62  0);.    if( zTab
45d0: 6c 65 49 6e 66 6f 20 29 20 66 72 65 65 28 7a 54  leInfo ) free(zT
45e0: 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69  ableInfo);.    i
45f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4600: 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e 66 6f 20   || !pTableInfo 
4610: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4620: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53  1;.    }..    zS
4630: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
4640: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 53 45 4c  xt(zSelect, "SEL
4650: 45 43 54 20 27 49 4e 53 45 52 54 20 49 4e 54 4f  ECT 'INSERT INTO
4660: 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20   ' || ", 0);.   
4670: 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64 54 65   zTmp = appendTe
4680: 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c 65 2c  xt(zTmp, zTable,
4690: 20 27 22 27 29 3b 0a 20 20 20 20 69 66 28 20 7a   '"');.    if( z
46a0: 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  Tmp ){.      zSe
46b0: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
46c0: 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d 70 2c  t(zSelect, zTmp,
46d0: 20 27 5c 27 27 29 3b 0a 20 20 20 20 7d 0a 20 20   '\'');.    }.  
46e0: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
46f0: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
4700: 22 20 7c 7c 20 27 20 56 41 4c 55 45 53 28 27 20  " || ' VALUES(' 
4710: 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 63  || ", 0);.    rc
4720: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
4730: 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20  pTableInfo);.   
4740: 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
4750: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
4760: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
4770: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71  Text(zSelect, "q
4780: 75 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20  uote(", 0);.    
4790: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
47a0: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
47b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
47c0: 65 78 74 28 70 54 61 62 6c 65 49 6e 66 6f 2c 20  ext(pTableInfo, 
47d0: 31 29 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20  1), '"');.      
47e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
47f0: 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  p(pTableInfo);. 
4800: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4810: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
4820: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
4830: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
4840: 20 22 29 20 7c 7c 20 27 2c 20 27 20 7c 7c 20 22   ") || ', ' || "
4850: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
4860: 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65  e{.        zSele
4870: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
4880: 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c 20 30  zSelect, ") ", 0
4890: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
48a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
48b0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61 62 6c  3_finalize(pTabl
48c0: 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  eInfo);.    if( 
48d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
48e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65 6c 65  .      if( zSele
48f0: 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c 65 63  ct ) free(zSelec
4900: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
4910: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53   1;.    }.    zS
4920: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
4930: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c 7c 20  xt(zSelect, "|| 
4940: 27 29 27 20 46 52 4f 4d 20 20 22 2c 20 30 29 3b  ')' FROM  ", 0);
4950: 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61  .    zSelect = a
4960: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
4970: 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b  t, zTable, '"');
4980: 0a 0a 20 20 20 20 72 63 20 3d 20 72 75 6e 5f 74  ..    rc = run_t
4990: 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
49a0: 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 20 7a  p->out, p->db, z
49b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
49c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
49d0: 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  UPT ){.      zSe
49e0: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
49f0: 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f 52 44  t(zSelect, " ORD
4a00: 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
4a10: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ", 0);.      rc 
4a20: 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70  = run_table_dump
4a30: 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70  _query(p->out, p
4a40: 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 29 3b 0a  ->db, zSelect);.
4a50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
4a60: 65 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53 65  elect ) free(zSe
4a70: 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72  lect);.    if( r
4a80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4aa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4ab0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4ac0: 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 70 64 61  un zQuery.  Upda
4ad0: 74 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  te dump_callback
4ae0: 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
4af0: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 49  ck routine..** I
4b00: 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54  f we get a SQLIT
4b10: 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c  E_CORRUPT error,
4b20: 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79   rerun the query
4b30: 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67   after appending
4b40: 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f  .** "ORDER BY ro
4b50: 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65  wid DESC" to the
4b60: 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   end..*/.static 
4b70: 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64  int run_schema_d
4b80: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 73 74 72  ump_query(.  str
4b90: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
4ba0: 61 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  a *p, .  const c
4bb0: 68 61 72 20 2a 7a 51 75 65 72 79 2c 0a 20 20 63  har *zQuery,.  c
4bc0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 0a 29  har **pzErrMsg.)
4bd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
4be0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4bf0: 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64  p->db, zQuery, d
4c00: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
4c10: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   pzErrMsg);.  if
4c20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
4c30: 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72  RUPT ){.    char
4c40: 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c   *zQ2;.    int l
4c50: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 51 75 65  en = strlen(zQue
4c60: 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 7a 45  ry);.    if( pzE
4c70: 72 72 4d 73 67 20 29 20 73 71 6c 69 74 65 33 5f  rrMsg ) sqlite3_
4c80: 66 72 65 65 28 2a 70 7a 45 72 72 4d 73 67 29 3b  free(*pzErrMsg);
4c90: 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f  .    zQ2 = mallo
4ca0: 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20  c( len+100 );.  
4cb0: 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72    if( zQ2==0 ) r
4cc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 70  eturn rc;.    sp
4cd0: 72 69 6e 74 66 28 7a 51 32 2c 20 22 25 73 20 4f  rintf(zQ2, "%s O
4ce0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
4cf0: 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20  SC", zQuery);.  
4d00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
4d10: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20  xec(p->db, zQ2, 
4d20: 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
4d30: 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
4d40: 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a   free(zQ2);.  }.
4d50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4d60: 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 61 20  /*.** Text of a 
4d70: 68 65 6c 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a  help message.*/.
4d80: 73 74 61 74 69 63 20 63 68 61 72 20 7a 48 65 6c  static char zHel
4d90: 70 5b 5d 20 3d 0a 20 20 22 2e 64 61 74 61 62 61  p[] =.  ".databa
4da0: 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ses             
4db0: 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66  List names and f
4dc0: 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64  iles of attached
4dd0: 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20   databases\n".  
4de0: 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
4df0: 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68 65  ..      Dump the
4e00: 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20   database in an 
4e10: 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c  SQL text format\
4e20: 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f  n".  ".echo ON|O
4e30: 46 46 20 20 20 20 20 20 20 20 20 20 20 54 75 72  FF           Tur
4e40: 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f  n command echo o
4e50: 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
4e60: 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20  exit            
4e70: 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
4e80: 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65  program\n".  ".e
4e90: 78 70 6c 61 69 6e 20 4f 4e 7c 4f 46 46 20 20 20  xplain ON|OFF   
4ea0: 20 20 20 20 20 54 75 72 6e 20 6f 75 74 70 75 74       Turn output
4eb0: 20 6d 6f 64 65 20 73 75 69 74 61 62 6c 65 20 66   mode suitable f
4ec0: 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72  or EXPLAIN on or
4ed0: 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 2e 68 65 61   off.\n".  ".hea
4ee0: 64 65 72 28 73 29 20 4f 4e 7c 4f 46 46 20 20 20  der(s) ON|OFF   
4ef0: 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
4f00: 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
4f10: 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70   off\n".  ".help
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73    Show this mess
4f40: 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72  age\n".  ".impor
4f50: 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20  t FILE TABLE    
4f60: 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f   Import data fro
4f70: 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c  m FILE into TABL
4f80: 45 5c 6e 22 0a 20 20 22 2e 69 6e 64 69 63 65 73  E\n".  ".indices
4f90: 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 53   TABLE         S
4fa0: 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  how names of all
4fb0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 54 41 42 4c   indices on TABL
4fc0: 45 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f  E\n".  ".mode MO
4fd0: 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 53  DE ?TABLE?     S
4fe0: 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 77  et output mode w
4ff0: 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65  here MODE is one
5000: 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20   of:\n".  "     
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
5030: 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
5040: 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74     column   Left
5070: 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73  -aligned columns
5080: 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 5c  .  (See .width)\
5090: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
50b0: 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61  tml     HTML <ta
50c0: 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22  ble> code\n".  "
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
50f0: 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61    SQL insert sta
5100: 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c  tements for TABL
5110: 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  E\n".  "        
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61   line     One va
5140: 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a  lue per line\n".
5150: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
5160: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
5170: 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69       Values deli
5180: 6d 69 74 65 64 20 62 79 20 2e 73 65 70 61 72 61  mited by .separa
5190: 74 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a 20 20  tor string\n".  
51a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
51b0: 20 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20            tabs  
51c0: 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
51d0: 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20   values\n".  "  
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20         tcl      
5200: 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  TCL list element
5210: 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c  s\n".  ".nullval
5220: 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 50  ue STRING      P
5230: 72 69 6e 74 20 53 54 52 49 4e 47 20 69 6e 20 70  rint STRING in p
5240: 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c  lace of NULL val
5250: 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75  ues\n".  ".outpu
5260: 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  t FILENAME      
5270: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
5280: 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
5290: 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20 20 20  output stdout   
52a0: 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
52b0: 74 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 5c  t to the screen\
52c0: 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41  n".  ".prompt MA
52d0: 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70  IN CONTINUE  Rep
52e0: 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64 61 72  lace the standar
52f0: 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22  d prompts\n".  "
5300: 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20  .quit           
5310: 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
5320: 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e   program\n".  ".
5330: 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20  read FILENAME   
5340: 20 20 20 20 20 20 45 78 65 63 75 74 65 20 53 51        Execute SQ
5350: 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  L in FILENAME\n"
5360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
5370: 41 53 5f 43 4f 44 45 43 0a 20 20 22 2e 72 65 6b  AS_CODEC.  ".rek
5380: 65 79 20 4f 4c 44 20 4e 45 57 20 4e 45 57 20 20  ey OLD NEW NEW  
5390: 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e     Change the en
53a0: 63 72 79 70 74 69 6f 6e 20 6b 65 79 5c 6e 22 0a  cryption key\n".
53b0: 23 65 6e 64 69 66 0a 20 20 22 2e 73 63 68 65 6d  #endif.  ".schem
53c0: 61 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  a ?TABLE?       
53d0: 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45   Show the CREATE
53e0: 20 73 74 61 74 65 6d 65 6e 74 73 5c 6e 22 0a 20   statements\n". 
53f0: 20 22 2e 73 65 70 61 72 61 74 6f 72 20 53 54 52   ".separator STR
5400: 49 4e 47 20 20 20 20 20 20 43 68 61 6e 67 65 20  ING      Change 
5410: 73 65 70 61 72 61 74 6f 72 20 75 73 65 64 20 62  separator used b
5420: 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e  y output mode an
5430: 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20 20 22  d .import\n".  "
5440: 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20  .show           
5450: 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
5460: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
5470: 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
5480: 6e 67 73 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65  ngs\n".  ".table
5490: 73 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20  s ?PATTERN?     
54a0: 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74   List names of t
54b0: 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 61  ables matching a
54c0: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 5c 6e 22   LIKE pattern\n"
54d0: 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20  .  ".timeout MS 
54e0: 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f             Try o
54f0: 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61  pening locked ta
5500: 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c  bles for MS mill
5510: 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e  iseconds\n".  ".
5520: 77 69 64 74 68 20 4e 55 4d 20 4e 55 4d 20 2e 2e  width NUM NUM ..
5530: 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e  .     Set column
5540: 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f   widths for \"co
5550: 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 3b  lumn\" mode\n".;
5560: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
5570: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
5580: 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 69 6e   void process_in
5590: 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62  put(struct callb
55a0: 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49 4c  ack_data *p, FIL
55b0: 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  E *in);../*.** M
55c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
55d0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20  abase is open.  
55e0: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
55f0: 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a  en open it.  If.
5600: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
5610: 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70  fails to open, p
5620: 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
5630: 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
5640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
5650: 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63 61  pen_db(struct ca
5660: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29 7b  llback_data *p){
5670: 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
5680: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  ){.    sqlite3_o
5690: 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  pen(p->zDbFilena
56a0: 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  me, &p->db);.   
56b0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66   db = p->db;.#if
56c0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
56d0: 4f 44 45 43 0a 20 20 20 20 73 71 6c 69 74 65 33  ODEC.    sqlite3
56e0: 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  _key(p->db, p->z
56f0: 4b 65 79 2c 20 70 2d 3e 7a 4b 65 79 20 3f 20 73  Key, p->zKey ? s
5700: 74 72 6c 65 6e 28 70 2d 3e 7a 4b 65 79 29 20 3a  trlen(p->zKey) :
5710: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
5720: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
5730: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 68 65  unction(db, "she
5740: 6c 6c 73 74 61 74 69 63 22 2c 20 30 2c 20 53 51  llstatic", 0, SQ
5750: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
5760: 20 20 20 20 20 20 73 68 65 6c 6c 73 74 61 74 69        shellstati
5770: 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  cFunc, 0, 0);.  
5780: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5790: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
57a0: 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20 66 70  (db) ){.      fp
57b0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
57c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
57d0: 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
57e0: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
57f0: 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
5800: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
5810: 62 29 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  b));.      exit(
5820: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
5830: 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67  ./*.** Do C-lang
5840: 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f  uage style dequo
5850: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c  ting..**.**    \
5860: 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20  t    -> tab.**  
5870: 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69    \n    -> newli
5880: 6e 65 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d  ne.**    \r    -
5890: 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72  > carriage retur
58a0: 6e 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e  n.**    \NNN  ->
58b0: 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72   ascii character
58c0: 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2a   NNN in octal.**
58d0: 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63      \\    -> bac
58e0: 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74 61 74 69 63  kslash.*/.static
58f0: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
5900: 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
5910: 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  z){.  int i, j, 
5920: 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  c;.  for(i=j=0; 
5930: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
5940: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
5950: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
5960: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
5970: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20       if( c=='n' 
5980: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
5990: 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
59a0: 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
59b0: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
59c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
59d0: 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
59e0: 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
59f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
5a00: 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
5a10: 0a 20 20 20 20 20 20 20 20 63 20 3d 2d 20 27 30  .        c =- '0
5a20: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
5a30: 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
5a40: 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
5a50: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
5a60: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
5a70: 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
5a80: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
5a90: 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
5aa0: 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
5ab0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
5ac0: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
5ad0: 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
5ae0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5b00: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
5b10: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
5b20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  0;.}../*.** If a
5b30: 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67  n input line beg
5b40: 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65  ins with "." the
5b50: 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  n invoke this ro
5b60: 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63  utine to.** proc
5b70: 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a  ess that line..*
5b80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 74 6f  *.** Return 1 to
5b90: 20 65 78 69 74 20 61 6e 64 20 30 20 74 6f 20 63   exit and 0 to c
5ba0: 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73 74 61 74  ontinue..*/.stat
5bb0: 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63  ic int do_meta_c
5bc0: 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69  ommand(char *zLi
5bd0: 6e 65 2c 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ne, struct callb
5be0: 61 63 6b 5f 64 61 74 61 20 2a 70 29 7b 0a 20 20  ack_data *p){.  
5bf0: 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20 69 6e 74  int i = 1;.  int
5c00: 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
5c10: 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
5c20: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
5c30: 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61  rg[50];..  /* Pa
5c40: 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69  rse the input li
5c50: 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a  ne into tokens..
5c60: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c    */.  while( zL
5c70: 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72 67 3c 41  ine[i] && nArg<A
5c80: 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
5c90: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  ){.    while( is
5ca0: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
5cb0: 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29  char)zLine[i]) )
5cc0: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { i++; }.    if(
5cd0: 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30 20 29 20 62   zLine[i]==0 ) b
5ce0: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c  reak;.    if( zL
5cf0: 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27 20 7c 7c 20  ine[i]=='\'' || 
5d00: 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22 27 20 29 7b  zLine[i]=='"' ){
5d10: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  .      int delim
5d20: 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b 0a 20   = zLine[i++];. 
5d30: 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
5d40: 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a  +] = &zLine[i];.
5d50: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
5d60: 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69  ne[i] && zLine[i
5d70: 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 69 2b 2b 3b  ]!=delim ){ i++;
5d80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
5d90: 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a  ne[i]==delim ){.
5da0: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b          zLine[i+
5db0: 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  +] = 0;.      }.
5dc0: 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d        if( delim=
5dd0: 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62  ='"' ) resolve_b
5de0: 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
5df0: 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72  else{.      azAr
5e10: 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69  g[nArg++] = &zLi
5e20: 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77 68 69  ne[i];.      whi
5e30: 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20  le( zLine[i] && 
5e40: 21 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e  !isspace((unsign
5e50: 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d  ed char)zLine[i]
5e60: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
5e70: 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 20 29    if( zLine[i] )
5e80: 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b   zLine[i++] = 0;
5e90: 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62  .      resolve_b
5ea0: 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
5eb0: 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
5ec0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
5ed0: 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e  ss the input lin
5ee0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41  e..  */.  if( nA
5ef0: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rg==0 ) return r
5f00: 63 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  c;.  n = strlen(
5f10: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d  azArg[0]);.  c =
5f20: 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20   azArg[0][0];.  
5f30: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e  if( c=='d' && n>
5f40: 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
5f50: 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65  rg[0], "database
5f60: 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
5f70: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
5f80: 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20  _data data;.    
5f90: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
5fa0: 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
5fb0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
5fc0: 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
5fd0: 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
5fe0: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a  showHeader = 1;.
5ff0: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
6000: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  MODE_Column;.   
6010: 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 30   data.colWidth[0
6020: 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61 74 61 2e  ] = 3;.    data.
6030: 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31 35  colWidth[1] = 15
6040: 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69  ;.    data.colWi
6050: 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a 20 20 20  dth[2] = 58;.   
6060: 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20   data.cnt = 0;. 
6070: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
6080: 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64  p->db, "PRAGMA d
6090: 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 20 22 2c  atabase_list; ",
60a0: 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
60b0: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
60c0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
60d0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
60e0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
60f0: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
6100: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6110: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  (zErrMsg);.    }
6120: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
6130: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
6140: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d  p(azArg[0], "dum
6150: 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
6160: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
6170: 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
6180: 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
6190: 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54  p->out, "BEGIN T
61a0: 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b  RANSACTION;\n");
61b0: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
61c0: 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63   ){.      run_sc
61d0: 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
61e0: 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  p, .        "SEL
61f0: 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
6200: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
6210: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
6220: 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
6230: 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27  NULL AND type=='
6240: 74 61 62 6c 65 27 22 2c 20 30 0a 20 20 20 20 20  table'", 0.     
6250: 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63   );.      run_sc
6260: 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
6270: 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  p, .        "SEL
6280: 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
6290: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
62a0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
62b0: 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
62c0: 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 21 3d 27  NULL AND type!='
62d0: 74 61 62 6c 65 27 20 41 4e 44 20 74 79 70 65 21  table' AND type!
62e0: 3d 27 6d 65 74 61 27 22 2c 20 30 0a 20 20 20 20  ='meta'", 0.    
62f0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
6300: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6310: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
6320: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
6330: 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d    zShellStatic =
6340: 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
6350: 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
6360: 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
6370: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
6380: 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
6390: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
63a0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48   ".          "WH
63b0: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  ERE tbl_name LIK
63c0: 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
63d0: 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
63e0: 27 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  '".          "  
63f0: 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  AND sql NOT NULL
6400: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
6410: 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
6420: 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
6430: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
6440: 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
6450: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
6460: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
6470: 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
6480: 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20  ellstatic() AND 
6490: 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22 0a 20  type!='table'". 
64a0: 20 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20           "  AND 
64b0: 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
64c0: 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
64d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  0);.        zShe
64e0: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20  llStatic = 0;.  
64f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6500: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
6510: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
6520: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
6530: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
6540: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6550: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 65  zErrMsg);.    }e
6560: 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
6570: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d  tf(p->out, "COMM
6580: 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  IT;\n");.    }. 
6590: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
65a0: 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
65b0: 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22  azArg[0], "echo"
65c0: 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
65d0: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  1 ){.    int j;.
65e0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
65f0: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[1];.    int 
6600: 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  val = atoi(azArg
6610: 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  [1]);.    for(j=
6620: 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  0; z[j]; j++){. 
6630: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 74 6f 6c 6f       z[j] = tolo
6640: 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  wer((unsigned ch
6650: 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a  ar)z[j]);.    }.
6660: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6670: 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"on")==0 ){.   
6680: 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20     val = 1;.    
6690: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
66a0: 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a  (z,"yes")==0 ){.
66b0: 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20        val = 1;. 
66c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 65 63 68 6f     }.    p->echo
66d0: 4f 6e 20 3d 20 76 61 6c 3b 0a 20 20 7d 65 6c 73  On = val;.  }els
66e0: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
66f0: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
6700: 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d  [0], "exit", n)=
6710: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
6720: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
6730: 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
6740: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
6750: 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  plain", n)==0 ){
6760: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
6770: 73 74 61 74 69 63 20 63 68 61 72 20 7a 4f 6e 65  static char zOne
6780: 5b 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 63 68  [] = "1";.    ch
6790: 61 72 20 2a 7a 20 3d 20 6e 41 72 67 3e 3d 32 20  ar *z = nArg>=2 
67a0: 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 7a 4f 6e  ? azArg[1] : zOn
67b0: 65 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  e;.    int val =
67c0: 20 61 74 6f 69 28 7a 29 3b 0a 20 20 20 20 66 6f   atoi(z);.    fo
67d0: 72 28 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b  r(j=0; z[j]; j++
67e0: 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20  ){.      z[j] = 
67f0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
6800: 64 20 63 68 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20  d char)z[j]);.  
6810: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
6820: 6d 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b  mp(z,"on")==0 ){
6830: 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  .      val = 1;.
6840: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6850: 72 63 6d 70 28 7a 2c 22 79 65 73 22 29 3d 3d 30  rcmp(z,"yes")==0
6860: 20 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20   ){.      val = 
6870: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
6880: 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20  val == 1) {.    
6890: 20 20 69 66 28 21 70 2d 3e 65 78 70 6c 61 69 6e    if(!p->explain
68a0: 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20  Prev.valid) {.  
68b0: 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e        p->explain
68c0: 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 31 3b 0a  Prev.valid = 1;.
68d0: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61          p->expla
68e0: 69 6e 50 72 65 76 2e 6d 6f 64 65 20 3d 20 70 2d  inPrev.mode = p-
68f0: 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 70  >mode;.        p
6900: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68  ->explainPrev.sh
6910: 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68  owHeader = p->sh
6920: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
6930: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 65 78 70 6c    memcpy(p->expl
6940: 61 69 6e 50 72 65 76 2e 63 6f 6c 57 69 64 74 68  ainPrev.colWidth
6950: 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a  ,p->colWidth,siz
6960: 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  eof(p->colWidth)
6970: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6980: 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 70 75 74   /* We could put
6990: 20 74 68 69 73 20 63 6f 64 65 20 75 6e 64 65 72   this code under
69a0: 20 74 68 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e   the !p->explain
69b0: 56 61 6c 69 64 0a 20 20 20 20 20 20 2a 2a 20 63  Valid.      ** c
69c0: 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 74 68 61 74  ondition so that
69d0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 65   it does not exe
69e0: 63 75 74 65 20 69 66 20 77 65 20 61 72 65 20 61  cute if we are a
69f0: 6c 72 65 61 64 79 20 69 6e 0a 20 20 20 20 20 20  lready in.      
6a00: 2a 2a 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e  ** explain mode.
6a10: 20 48 6f 77 65 76 65 72 2c 20 61 6c 77 61 79 73   However, always
6a20: 20 65 78 65 63 75 74 69 6e 67 20 69 74 20 61 6c   executing it al
6a30: 6c 6f 77 73 20 75 73 20 61 6e 20 65 61 73 79 0a  lows us an easy.
6a40: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 6f 20        ** was to 
6a50: 72 65 73 65 74 20 74 6f 20 65 78 70 6c 61 69 6e  reset to explain
6a60: 20 6d 6f 64 65 20 69 6e 20 63 61 73 65 20 74 68   mode in case th
6a70: 65 20 75 73 65 72 20 70 72 65 76 69 6f 75 73 6c  e user previousl
6a80: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 64 20 61  y.      ** did a
6a90: 6e 20 2e 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f  n .explain follo
6aa0: 77 65 64 20 62 79 20 61 20 2e 77 69 64 74 68 2c  wed by a .width,
6ab0: 20 2e 6d 6f 64 65 20 6f 72 20 2e 68 65 61 64 65   .mode or .heade
6ac0: 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  r.      ** comma
6ad0: 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
6ae0: 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
6af0: 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  E_Column;.      
6b00: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
6b10: 31 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  1;.      memset(
6b20: 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 30 2c 41 72  p->colWidth,0,Ar
6b30: 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69  raySize(p->colWi
6b40: 64 74 68 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dth));.      p->
6b50: 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20 34 3b  colWidth[0] = 4;
6b60: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
6b70: 74 68 5b 31 5d 20 3d 20 31 32 3b 0a 20 20 20 20  th[1] = 12;.    
6b80: 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d    p->colWidth[2]
6b90: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 70 2d 3e   = 10;.      p->
6ba0: 63 6f 6c 57 69 64 74 68 5b 33 5d 20 3d 20 31 30  colWidth[3] = 10
6bb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  ;.      p->colWi
6bc0: 64 74 68 5b 34 5d 20 3d 20 33 35 3b 0a 20 20 20  dth[4] = 35;.   
6bd0: 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 65 78   }else if (p->ex
6be0: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29  plainPrev.valid)
6bf0: 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 70 6c   {.      p->expl
6c00: 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20  ainPrev.valid = 
6c10: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  0;.      p->mode
6c20: 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65   = p->explainPre
6c30: 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  v.mode;.      p-
6c40: 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d  >showHeader = p-
6c50: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f  >explainPrev.sho
6c60: 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 6d  wHeader;.      m
6c70: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74  emcpy(p->colWidt
6c80: 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  h,p->explainPrev
6c90: 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  .colWidth,sizeof
6ca0: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
6cb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
6cc0: 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 28   if( c=='h' && (
6cd0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
6ce0: 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d  , "header", n)==
6cf0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
6d00: 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20     ||.          
6d10: 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61         strncmp(a
6d20: 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72  zArg[0], "header
6d30: 73 22 2c 20 6e 29 3d 3d 30 20 29 26 26 20 6e 41  s", n)==0 )&& nA
6d40: 72 67 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  rg>1 ){.    int 
6d50: 6a 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  j;.    char *z =
6d60: 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69   azArg[1];.    i
6d70: 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a  nt val = atoi(az
6d80: 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72  Arg[1]);.    for
6d90: 28 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29  (j=0; z[j]; j++)
6da0: 7b 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 74  {.      z[j] = t
6db0: 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  olower((unsigned
6dc0: 20 63 68 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20 20   char)z[j]);.   
6dd0: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6de0: 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a  p(z,"on")==0 ){.
6df0: 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20        val = 1;. 
6e00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6e10: 63 6d 70 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20  cmp(z,"yes")==0 
6e20: 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31  ){.      val = 1
6e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 73  ;.    }.    p->s
6e40: 68 6f 77 48 65 61 64 65 72 20 3d 20 76 61 6c 3b  howHeader = val;
6e50: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
6e60: 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
6e70: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c  p(azArg[0], "hel
6e80: 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
6e90: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
6ea0: 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a  zHelp);.  }else.
6eb0: 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
6ec0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
6ed0: 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d  ], "import", n)=
6ee0: 3d 30 20 26 26 20 6e 41 72 67 3e 3d 33 20 29 7b  =0 && nArg>=3 ){
6ef0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
6f00: 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20  e = azArg[2];   
6f10: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
6f20: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
6f30: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
6f40: 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 20 20  le = azArg[1];  
6f50: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
6f60: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
6f70: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
6f80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
6f90: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Stmt;        /* 
6fa0: 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
6fb0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fd0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
6fe0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
7010: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
7020: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
7030: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
7040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7050: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
7060: 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
7070: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7090: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
70a0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
70d0: 74 65 73 20 69 6e 20 70 2d 3e 73 65 70 61 72 61  tes in p->separa
70e0: 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  tor[] */.    cha
70f0: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
7100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
7110: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
7120: 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
7150: 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
7160: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
7170: 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
7190: 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
71a0: 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
71b0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
71c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
71d0: 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
71e0: 20 63 68 61 6e 67 65 73 20 2a 2f 20 20 20 0a 20   changes */   . 
71f0: 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20     FILE *in;    
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7210: 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65  * The input file
7220: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65   */.    int line
7230: 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  no = 0;         
7240: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
7250: 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65  er of input file
7260: 20 2a 2f 0a 0a 20 20 20 20 6e 53 65 70 20 3d 20   */..    nSep = 
7270: 73 74 72 6c 65 6e 28 70 2d 3e 73 65 70 61 72 61  strlen(p->separa
7280: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  tor);.    if( nS
7290: 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ep==0 ){.      f
72a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
72b0: 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74  non-null separat
72c0: 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  or required for 
72d0: 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20  import\n");.    
72e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
72f0: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
7300: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
7310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
7320: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
7330: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
7340: 74 75 72 6e 20 30 3b 0a 20 20 20 20 6e 42 79 74  turn 0;.    nByt
7350: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  e = strlen(zSql)
7360: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7370: 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62  e3_prepare(p->db
7380: 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d  , zSql, 0, &pStm
7390: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
73a0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
73b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
73c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
73d0: 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
73e0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
73f0: 64 62 29 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  db));.      nCol
7400: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
7410: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
7420: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7430: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  nt(pStmt);.    }
7440: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
7450: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
7460: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
7470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 53  return 0;.    zS
7480: 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  ql = malloc( nBy
7490: 74 65 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  te + 20 + nCol*2
74a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
74b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
74c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
74d0: 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a  intf(nByte+20, z
74e0: 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54  Sql, "INSERT INT
74f0: 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22  O '%q' VALUES(?"
7500: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
7510: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
7520: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
7530: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7540: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
7550: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
7560: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
7570: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
7580: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
7590: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
75a0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
75b0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26  ->db, zSql, 0, &
75c0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
75d0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
75e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
75f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
7600: 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
7610: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
7620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7630: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
7640: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
7650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
7660: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
7670: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
7680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
7690: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
76a0: 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25  not open file: %
76b0: 73 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  s\n", zFile);.  
76c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
76d0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
76e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
76f0: 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
7700: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
7710: 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
7720: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
7730: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
7740: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
7750: 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  c(p->db, "BEGIN"
7760: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7770: 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
7780: 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
7790: 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
77a0: 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
77b0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
77c0: 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  z;.      i = 0;.
77d0: 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
77e0: 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d        azCol[0] =
77f0: 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f   zLine;.      fo
7800: 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20  r(i=0, z=zLine; 
7810: 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26  *z && *z!='\n' &
7820: 26 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b 29  & *z!='\r'; z++)
7830: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
7840: 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30  ==p->separator[0
7850: 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  ] && strncmp(z, 
7860: 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e 53  p->separator, nS
7870: 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
7880: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
7890: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
78a0: 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
78b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
78c0: 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
78d0: 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
78e0: 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
78f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7900: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7910: 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
7920: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
7930: 66 28 73 74 64 65 72 72 2c 22 25 73 20 6c 69 6e  f(stderr,"%s lin
7940: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
7950: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
7960: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 5c 6e  a but found %d\n
7970: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
7980: 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
7990: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
79a0: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
79b0: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
79c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
79d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
79e0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
79f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
7a00: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c  text(pStmt, i+1,
7a10: 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53   azCol[i], -1, S
7a20: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7a40: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
7a50: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
7a60: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
7a70: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
7a80: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
7a90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7aa0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
7ab0: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
7ac0: 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
7ad0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
7ae0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
7af0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
7b00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7b10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
7b20: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f  azCol);.    fclo
7b30: 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se(in);.    sqli
7b40: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
7b50: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
7b60: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 6f  _exec(p->db, zCo
7b70: 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
7b80: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
7b90: 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
7ba0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69  (azArg[0], "indi
7bb0: 63 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ces", n)==0 && n
7bc0: 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 73 74 72  Arg>1 ){.    str
7bd0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
7be0: 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  a data;.    char
7bf0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
7c00: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
7c10: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
7c20: 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
7c30: 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
7c40: 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
7c50: 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
7c60: 5f 4c 69 73 74 3b 0a 20 20 20 20 7a 53 68 65 6c  _List;.    zShel
7c70: 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b  lStatic = azArg[
7c80: 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1];.    sqlite3_
7c90: 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
7ca0: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
7cb0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
7cc0: 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45  r ".      "WHERE
7cd0: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
7ce0: 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
7cf0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
7d00: 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c        "UNION ALL
7d10: 20 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54   ".      "SELECT
7d20: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
7d30: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a  e_temp_master ".
7d40: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
7d50: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
7d60: 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
7d70: 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20 20 20  lstatic() ".    
7d80: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
7d90: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
7da0: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
7db0: 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 68 65 6c      );.    zShel
7dc0: 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20  lStatic = 0;.   
7dd0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
7de0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
7df0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
7e00: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
7e10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7e20: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  (zErrMsg);.    }
7e30: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
7e40: 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
7e50: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
7e60: 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  e", n)==0 && nAr
7e70: 67 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  g>=2 ){.    int 
7e80: 6e 32 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41 72  n2 = strlen(azAr
7e90: 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  g[1]);.    if( s
7ea0: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
7eb0: 22 6c 69 6e 65 22 2c 6e 32 29 3d 3d 30 0a 20 20  "line",n2)==0.  
7ec0: 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20        ||.       
7ed0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
7ee0: 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
7ef0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
7f00: 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20  e = MODE_Line;. 
7f10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7f20: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
7f30: 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 0a 20 20  olumn",n2)==0.  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 0a 20              ||. 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
7f60: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
7f70: 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29  olumns",n2)==0 )
7f80: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
7f90: 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
7fa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7fb0: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
7fc0: 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ist",n2)==0 ){. 
7fd0: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
7fe0: 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65  ODE_List;.    }e
7ff0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
8000: 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c  azArg[1],"html",
8010: 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
8020: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48  p->mode = MODE_H
8030: 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  tml;.    }else i
8040: 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
8050: 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30  [1],"tcl",n2)==0
8060: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
8070: 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20  e = MODE_Tcl;.  
8080: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
8090: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
80a0: 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
80b0: 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
80c0: 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 74 72  E_Csv;.      str
80d0: 63 70 79 28 70 2d 3e 73 65 70 61 72 61 74 6f 72  cpy(p->separator
80e0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , ",");.    }els
80f0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a  e if( strncmp(az
8100: 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32  Arg[1],"tabs",n2
8110: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
8120: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
8130: 74 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  t;.      strcpy(
8140: 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 5c  p->separator, "\
8150: 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t");.    }else i
8160: 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
8170: 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29  [1],"insert",n2)
8180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
8190: 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  mode = MODE_Inse
81a0: 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  rt;.      if( nA
81b0: 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg>=3 ){.       
81c0: 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
81d0: 70 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  p, azArg[2]);.  
81e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81f0: 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d     set_table_nam
8200: 65 28 70 2c 20 22 74 61 62 6c 65 22 29 3b 0a 20  e(p, "table");. 
8210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8220: 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   {.      fprintf
8230: 28 73 74 64 65 72 72 2c 22 6d 6f 64 65 20 73 68  (stderr,"mode sh
8240: 6f 75 6c 64 20 62 65 20 6f 6e 20 6f 66 3a 20 22  ould be on of: "
8250: 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  .         "colum
8260: 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72  n csv html inser
8270: 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61 62 73  t line list tabs
8280: 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a   tcl\n");.    }.
8290: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
82a0: 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70  =='n' && strncmp
82b0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c  (azArg[0], "null
82c0: 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 26 26  value", n)==0 &&
82d0: 20 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20 20 20   nArg==2 ) {.   
82e0: 20 73 70 72 69 6e 74 66 28 70 2d 3e 6e 75 6c 6c   sprintf(p->null
82f0: 76 61 6c 75 65 2c 20 22 25 2e 2a 73 22 2c 20 28  value, "%.*s", (
8300: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
8310: 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61  >nullvalue)-1, a
8320: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
8330: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20  e..  if( c=='o' 
8340: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
8350: 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e  [0], "output", n
8360: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
8370: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  ){.    if( p->ou
8380: 74 21 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20  t!=stdout ){.   
8390: 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74     fclose(p->out
83a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
83b0: 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
83c0: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
83d0: 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
83e0: 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 73 74  stdout;.      st
83f0: 72 63 70 79 28 70 2d 3e 6f 75 74 66 69 6c 65 2c  rcpy(p->outfile,
8400: 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d  "stdout");.    }
8410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
8420: 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  ut = fopen(azArg
8430: 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20  [1], "wb");.    
8440: 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
8450: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
8460: 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27 74  tf(stderr,"can't
8470: 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22   write to \"%s\"
8480: 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
8490: 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d          p->out =
84a0: 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d   stdout;.      }
84b0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
84c0: 20 73 74 72 63 70 79 28 70 2d 3e 6f 75 74 66 69   strcpy(p->outfi
84d0: 6c 65 2c 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  le,azArg[1]);.  
84e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
84f0: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70  lse..  if( c=='p
8500: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
8510: 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c  rg[0], "prompt",
8520: 20 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d   n)==0 && (nArg=
8530: 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b  =2 || nArg==3)){
8540: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d  .    if( nArg >=
8550: 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e   2) {.      strn
8560: 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61  cpy(mainPrompt,a
8570: 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72  zArg[1],(int)Arr
8580: 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70  aySize(mainPromp
8590: 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t)-1);.    }.   
85a0: 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20   if( nArg >= 3) 
85b0: 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
85c0: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61  continuePrompt,a
85d0: 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72  zArg[2],(int)Arr
85e0: 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50  aySize(continueP
85f0: 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d  rompt)-1);.    }
8600: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
8610: 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d  c=='q' && strncm
8620: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69  p(azArg[0], "qui
8630: 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
8640: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65   rc = 1;.  }else
8650: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  ..  if( c=='r' &
8660: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
8670: 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d  0], "read", n)==
8680: 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
8690: 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20      FILE *alt = 
86a0: 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
86b0: 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61  "rb");.    if( a
86c0: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  lt==0 ){.      f
86d0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 63  printf(stderr,"c
86e0: 61 6e 27 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  an't open \"%s\"
86f0: 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
8700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8710: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
8720: 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
8730: 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
8740: 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65 66  .  }else..#ifdef
8750: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
8760: 43 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  C.  if( c=='r' &
8770: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
8780: 30 5d 2c 22 72 65 6b 65 79 22 2c 20 6e 29 3d 3d  0],"rekey", n)==
8790: 30 20 26 26 20 6e 41 72 67 3d 3d 34 20 29 7b 0a  0 && nArg==4 ){.
87a0: 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d      char *zOld =
87b0: 20 70 2d 3e 7a 4b 65 79 3b 0a 20 20 20 20 69 66   p->zKey;.    if
87c0: 28 20 7a 4f 6c 64 3d 3d 30 20 29 20 7a 4f 6c 64  ( zOld==0 ) zOld
87d0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 73   = "";.    if( s
87e0: 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 7a  trcmp(azArg[1],z
87f0: 4f 6c 64 29 20 29 7b 0a 20 20 20 20 20 20 66 70  Old) ){.      fp
8800: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 6c  rintf(stderr,"ol
8810: 64 20 6b 65 79 20 69 73 20 69 6e 63 6f 72 72 65  d key is incorre
8820: 63 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  ct\n");.    }els
8830: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
8840: 72 67 5b 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 29  rg[2], azArg[3])
8850: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
8860: 66 28 73 74 64 65 72 72 2c 22 32 6e 64 20 63 6f  f(stderr,"2nd co
8870: 70 79 20 6f 66 20 6e 65 77 20 6b 65 79 20 64 6f  py of new key do
8880: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
8890: 20 31 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 65   1st\n");.    }e
88a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
88b0: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4b 65 79 29  e3_free(p->zKey)
88c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 4b 65 79 20  ;.      p->zKey 
88d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
88e0: 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 32 5d  f("%s", azArg[2]
88f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8900: 5f 72 65 6b 65 79 28 70 2d 3e 64 62 2c 20 70 2d  _rekey(p->db, p-
8910: 3e 7a 4b 65 79 2c 20 73 74 72 6c 65 6e 28 70 2d  >zKey, strlen(p-
8920: 3e 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d 0a 20  >zKey));.    }. 
8930: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
8940: 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
8950: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
8960: 20 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30   "schema", n)==0
8970: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63   ){.    struct c
8980: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74  allback_data dat
8990: 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
89a0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
89b0: 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 6d 65  en_db(p);.    me
89c0: 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
89d0: 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
89e0: 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
89f0: 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
8a00: 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
8a10: 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  ;.    if( nArg>1
8a20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
8a30: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8a40: 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b  azArg[1][i]; i++
8a50: 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20 3d 20  ) azArg[1][i] = 
8a60: 74 6f 6c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d  tolower(azArg[1]
8a70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
8a80: 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
8a90: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  "sqlite_master")
8aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
8ab0: 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d  har *new_argv[2]
8ac0: 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a  , *new_colv[2];.
8ad0: 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
8ae0: 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41  [0] = "CREATE TA
8af0: 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  BLE sqlite_maste
8b00: 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  r (\n".         
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
8b20: 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
8b50: 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
8b60: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
8b70: 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
8ba0: 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
8bd0: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
8be0: 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20           ")";.  
8bf0: 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
8c00: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
8c10: 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
8c20: 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
8c30: 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
8c40: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
8c50: 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
8c60: 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
8c70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8c80: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71  cmp(azArg[1],"sq
8c90: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
8ca0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
8cb0: 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
8cc0: 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
8cd0: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
8ce0: 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20  gv[0] = "CREATE 
8cf0: 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74  TEMP TABLE sqlit
8d00: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 28 5c  e_temp_master (\
8d10: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
8d20: 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
8d30: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
8d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d70: 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
8d80: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
8db0: 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20       ")";.      
8e00: 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20    new_argv[1] = 
8e10: 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  0;.        new_c
8e20: 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a  olv[0] = "sql";.
8e30: 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
8e40: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
8e50: 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c   callback(&data,
8e60: 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65   1, new_argv, ne
8e70: 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 7d  w_colv);.      }
8e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53  else{.        zS
8e90: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41  hellStatic = azA
8ea0: 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 73  rg[1];.        s
8eb0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
8ec0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  b,.          "SE
8ed0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a  LECT sql FROM ".
8ee0: 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53 45            "  (SE
8ef0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
8f00: 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20  te_master UNION 
8f10: 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 22  ALL".          "
8f20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8f30: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
8f40: 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20 20  ter) ".         
8f50: 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
8f60: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
8f70: 63 28 29 20 41 4e 44 20 74 79 70 65 21 3d 27 6d  c() AND type!='m
8f80: 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54  eta' AND sql NOT
8f90: 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20  NULL ".         
8fa0: 20 22 4f 52 44 45 52 20 42 59 20 73 75 62 73 74   "ORDER BY subst
8fb0: 72 28 74 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d  r(type,2,1), nam
8fc0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 61  e",.          ca
8fd0: 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
8fe0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
8ff0: 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d    zShellStatic =
9000: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
9020: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
9030: 0a 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  .         "SELEC
9040: 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20  T sql FROM ".   
9050: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
9060: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
9070: 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22  aster UNION ALL"
9080: 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45  .         "   SE
9090: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
90a0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
90b0: 22 0a 20 20 20 20 20 20 20 20 20 22 57 48 45 52  ".         "WHER
90c0: 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41  E type!='meta' A
90d0: 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22  ND sql NOTNULL "
90e0: 0a 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  .         "ORDER
90f0: 20 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c   BY substr(type,
9100: 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20  2,1), name",.   
9110: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
9120: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
9130: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
9140: 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
9150: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
9160: 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
9170: 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
9180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9190: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
91a0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
91b0: 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
91c0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
91d0: 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30  eparator", n)==0
91e0: 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20   && nArg==2 ){. 
91f0: 20 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 73 65     sprintf(p->se
9200: 70 61 72 61 74 6f 72 2c 20 22 25 2e 2a 73 22 2c  parator, "%.*s",
9210: 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
9220: 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2d 31 2c  p->separator)-1,
9230: 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65   azArg[1]);.  }e
9240: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
9250: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
9260: 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e  rg[0], "show", n
9270: 29 3d 3d 30 29 7b 0a 20 20 20 20 69 6e 74 20 69  )==0){.    int i
9280: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
9290: 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c  >out,"%9.9s: %s\
92a0: 6e 22 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63  n","echo", p->ec
92b0: 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  hoOn ? "on" : "o
92c0: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
92d0: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
92e0: 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22   %s\n","explain"
92f0: 2c 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  , p->explainPrev
9300: 2e 76 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a 22  .valid ? "on" :"
9310: 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  off");.    fprin
9320: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
9330: 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73  : %s\n","headers
9340: 22 2c 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  ", p->showHeader
9350: 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29   ? "on" : "off")
9360: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
9370: 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c  >out,"%9.9s: %s\
9380: 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44  n","mode", modeD
9390: 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a  escr[p->mode]);.
93a0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
93b0: 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 6e  ut,"%9.9s: ", "n
93c0: 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20 20  ullvalue");.    
93d0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
93e0: 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75 6c  g(p->out, p->nul
93f0: 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 66  lvalue);.      f
9400: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
9410: 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  \n");.    fprint
9420: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
9430: 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c   %s\n","output",
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 73 74 72 6c 65 6e 28 70 2d 3e 6f 75 74 66    strlen(p->outf
9470: 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
9480: 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
9490: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
94a0: 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 73 65  t,"%9.9s: ", "se
94b0: 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20  parator");.     
94c0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
94d0: 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70 61  (p->out, p->sepa
94e0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 70  rator);.      fp
94f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
9500: 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  n");.    fprintf
9510: 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
9520: 22 2c 22 77 69 64 74 68 22 29 3b 0a 20 20 20 20  ","width");.    
9530: 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29  for (i=0;i<(int)
9540: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
9550: 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c  Width) && p->col
9560: 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b  Width[i] != 0;i+
9570: 2b 29 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  +) {.      fprin
9580: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 64 20 22 2c  tf(p->out,"%d ",
9590: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29 3b  p->colWidth[i]);
95a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
95b0: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
95c0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
95d0: 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26 26  c=='t' && n>1 &&
95e0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
95f0: 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d  ], "tables", n)=
9600: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
9610: 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 69  *azResult;.    i
9620: 6e 74 20 6e 52 6f 77 2c 20 72 63 3b 0a 20 20 20  nt nRow, rc;.   
9630: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
9640: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
9650: 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
9660: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9670: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
9680: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22  p->db,.        "
9690: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
96a0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
96b0: 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
96c0: 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
96d0: 2c 27 76 69 65 77 27 29 20 22 0a 20 20 20 20 20  ,'view') ".     
96e0: 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
96f0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9700: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
9710: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20  _temp_master ". 
9720: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
9730: 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
9740: 76 69 65 77 27 29 20 22 0a 20 20 20 20 20 20 20  view') ".       
9750: 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20   "ORDER BY 1",. 
9760: 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c 74         &azResult
9770: 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45 72  , &nRow, 0, &zEr
9780: 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  rMsg.      );.  
9790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
97a0: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a  ShellStatic = az
97b0: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63  Arg[1];.      rc
97c0: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
97d0: 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20  able(p->db,.    
97e0: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
97f0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
9800: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
9810: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
9820: 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e  able','view') AN
9830: 44 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 27 7c  D name LIKE '%'|
9840: 7c 73 68 65 6c 6c 73 74 61 74 69 63 28 29 7c 7c  |shellstatic()||
9850: 27 25 27 20 22 0a 20 20 20 20 20 20 20 20 22 55  '%' ".        "U
9860: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
9870: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
9880: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
9890: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
98a0: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
98b0: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
98c0: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
98d0: 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61 74 69 63  '%'||shellstatic
98e0: 28 29 7c 7c 27 25 27 20 22 0a 20 20 20 20 20 20  ()||'%' ".      
98f0: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
9900: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
9910: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
9920: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
9930: 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
9940: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
9950: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
9960: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
9970: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
9980: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
9990: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
99a0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  (zErrMsg);.    }
99b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
99c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
99d0: 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20  int len, maxlen 
99e0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
99f0: 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  , j;.      int n
9a00: 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74  PrintCol, nPrint
9a10: 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Row;.      for(i
9a20: 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b 2b  =1; i<=nRow; i++
9a30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9a40: 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29 20  zResult[i]==0 ) 
9a50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9a60: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61    len = strlen(a
9a70: 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20  zResult[i]);.   
9a80: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78       if( len>max
9a90: 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
9aa0: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
9ab0: 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30    nPrintCol = 80
9ac0: 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20  /(maxlen+2);.   
9ad0: 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c     if( nPrintCol
9ae0: 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d  <1 ) nPrintCol =
9af0: 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74   1;.      nPrint
9b00: 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50  Row = (nRow + nP
9b10: 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72  rintCol - 1)/nPr
9b20: 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f  intCol;.      fo
9b30: 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52  r(i=0; i<nPrintR
9b40: 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
9b50: 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 3d    for(j=i+1; j<=
9b60: 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52  nRow; j+=nPrintR
9b70: 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ow){.          c
9b80: 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 3d 6e 50  har *zSp = j<=nP
9b90: 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
9ba0: 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 70    ";.          p
9bb0: 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c 20  rintf("%s%-*s", 
9bc0: 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a 52  zSp, maxlen, azR
9bd0: 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73  esult[j] ? azRes
9be0: 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20 20  ult[j] : "");.  
9bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9c00: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
9c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9c20: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
9c30: 6c 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  le(azResult);.  
9c40: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
9c50: 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
9c60: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
9c70: 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30  "timeout", n)==0
9c80: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
9c90: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
9ca0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
9cb0: 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 61  timeout(p->db, a
9cc0: 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a  toi(azArg[1]));.
9cd0: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
9ce0: 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70  =='w' && strncmp
9cf0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64 74  (azArg[0], "widt
9d00: 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
9d10: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
9d20: 6a 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a  j=1; j<nArg && j
9d30: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
9d40: 6c 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20  lWidth); j++){. 
9d50: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
9d60: 5b 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41  [j-1] = atoi(azA
9d70: 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[j]);.    }.  
9d80: 7d 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66  }else..  {.    f
9d90: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
9da0: 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20  unknown command 
9db0: 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
9dc0: 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20  ents: ".      " 
9dd0: 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22  \"%s\". Enter \"
9de0: 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70  .help\" for help
9df0: 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
9e00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9e20: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 61  n TRUE if the la
9e30: 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63  st non-whitespac
9e40: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
9e50: 5b 5d 20 69 73 20 61 20 73 65 6d 69 63 6f 6c 6f  [] is a semicolo
9e60: 6e 2e 0a 2a 2a 20 7a 5b 5d 20 69 73 20 4e 20 63  n..** z[] is N c
9e70: 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 0a  haracters long..
9e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 65  */.static int _e
9e90: 6e 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c  nds_with_semicol
9ea0: 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
9eb0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c  , int N){.  whil
9ec0: 65 28 20 4e 3e 30 20 26 26 20 69 73 73 70 61 63  e( N>0 && isspac
9ed0: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
9ee0: 29 7a 5b 4e 2d 31 5d 29 20 29 7b 20 4e 2d 2d 3b  )z[N-1]) ){ N--;
9ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3e 30 20   }.  return N>0 
9f00: 26 26 20 7a 5b 4e 2d 31 5d 3d 3d 27 3b 27 3b 0a  && z[N-1]==';';.
9f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  }../*.** Test to
9f20: 20 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63   see if a line c
9f30: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
9f40: 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a   of whitespace..
9f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61  */.static int _a
9f60: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f  ll_whitespace(co
9f70: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9f80: 66 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  for(; *z; z++){.
9f90: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
9fa0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
9fb0: 29 7a 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  )z) ) continue;.
9fc0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
9fd0: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
9fe0: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
9ff0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
a000: 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31   (*z!='*' || z[1
a010: 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20  ]!='/') ){ z++; 
a020: 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
a030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a040: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63      z++;.      c
a050: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
a060: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26     if( *z=='-' &
a070: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
a080: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
a090: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
a0a0: 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b  *z!='\n' ){ z++;
a0b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d   }.      if( *z=
a0c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a0d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a0e0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
a0f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a100: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
a110: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c  rn TRUE if the l
a120: 69 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20  ine typed in is 
a130: 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74  an SQL command t
a140: 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a  erminator other.
a150: 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63  ** than a semi-c
a160: 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53  olon.  The SQL S
a170: 65 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22  erver style "go"
a180: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65   command is unde
a190: 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20  rstood.** as is 
a1a0: 74 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a  the Oracle "/"..
a1b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69  */.static int _i
a1c0: 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e  s_command_termin
a1d0: 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
a1e0: 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65  *zLine){.  while
a1f0: 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69  ( isspace(*(unsi
a200: 67 6e 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65  gned char*)zLine
a210: 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b  ) ){ zLine++; };
a220: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
a230: 3d 27 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69  ='/' && _all_whi
a240: 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31  tespace(&zLine[1
a250: 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  ]) ) return 1;  
a260: 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a 20 20 69  /* Oracle */.  i
a270: 66 28 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65  f( tolower(zLine
a280: 5b 30 5d 29 3d 3d 27 67 27 20 26 26 20 74 6f 6c  [0])=='g' && tol
a290: 6f 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d  ower(zLine[1])==
a2a0: 27 6f 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'o'.         && 
a2b0: 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28  _all_whitespace(
a2c0: 26 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20  &zLine[2]) ){.  
a2d0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
a2e0: 53 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20  SQL Server */.  
a2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
a300: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
a310: 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70  t from *in and p
a320: 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a  rocess it.  If *
a330: 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74  in==0 then input
a340: 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69  .** is interacti
a350: 76 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73  ve - the user is
a360: 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20   typing it it.  
a370: 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74  Otherwise, input
a380: 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  .** is coming fr
a390: 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76  om a file or dev
a3a0: 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69  ice.  A prompt i
a3b0: 73 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73  s issued and his
a3c0: 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64  tory.** is saved
a3d0: 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69   only if input i
a3e0: 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20  s interactive.  
a3f0: 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67  An interrupt sig
a400: 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  nal will.** caus
a410: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
a420: 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  o exit immediate
a430: 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74  ly, unless input
a440: 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
a450: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a460: 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74  process_input(st
a470: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
a480: 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  ta *p, FILE *in)
a490: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b  {.  char *zLine;
a4a0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  .  char *zSql = 
a4b0: 30 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20  0;.  int nSql = 
a4c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  0;.  char *zErrM
a4d0: 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
a4e0: 77 68 69 6c 65 28 20 66 66 6c 75 73 68 28 70 2d  while( fflush(p-
a4f0: 3e 6f 75 74 29 2c 20 28 7a 4c 69 6e 65 20 3d 20  >out), (zLine = 
a500: 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a  one_input_line(z
a510: 53 71 6c 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  Sql, in))!=0 ){.
a520: 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
a530: 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
a540: 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
a550: 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
a560: 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
a570: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f  .    if( p->echo
a580: 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c  On ) printf("%s\
a590: 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n", zLine);.    
a5a0: 69 66 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20  if( (zSql==0 || 
a5b0: 7a 53 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f  zSql[0]==0) && _
a5c0: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
a5d0: 4c 69 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Line) ) continue
a5e0: 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20  ;.    if( zLine 
a5f0: 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  && zLine[0]=='.'
a600: 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20   && nSql==0 ){. 
a610: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 6f       int rc = do
a620: 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c  _meta_command(zL
a630: 69 6e 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 66  ine, p);.      f
a640: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
a650: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
a660: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
a670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a680: 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d  _is_command_term
a690: 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 29 7b  inator(zLine) ){
a6a0: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 4c  .      strcpy(zL
a6b0: 69 6e 65 2c 22 3b 22 29 3b 0a 20 20 20 20 7d 0a  ine,";");.    }.
a6c0: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
a6d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a6e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
a6f0: 4c 69 6e 65 5b 69 5d 20 26 26 20 69 73 73 70 61  Line[i] && isspa
a700: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
a710: 72 29 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b  r)zLine[i]); i++
a720: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ){}.      if( zL
a730: 69 6e 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20  ine[i]!=0 ){.   
a740: 20 20 20 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c       nSql = strl
a750: 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  en(zLine);.     
a760: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
a770: 28 20 6e 53 71 6c 2b 31 20 29 3b 0a 20 20 20 20  ( nSql+1 );.    
a780: 20 20 20 20 73 74 72 63 70 79 28 7a 53 71 6c 2c      strcpy(zSql,
a790: 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d   zLine);.      }
a7a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a7b0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
a7c0: 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  en(zLine);.     
a7d0: 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28   zSql = realloc(
a7e0: 20 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20 6c 65   zSql, nSql + le
a7f0: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 69  n + 2 );.      i
a800: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
a810: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
a820: 64 65 72 72 2c 22 25 73 3a 20 6f 75 74 20 6f 66  derr,"%s: out of
a830: 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20 41 72 67   memory!\n", Arg
a840: 76 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  v0);.        exi
a850: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
a860: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 71 6c      strcpy(&zSql
a870: 5b 6e 53 71 6c 2b 2b 5d 2c 20 22 5c 6e 22 29 3b  [nSql++], "\n");
a880: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
a890: 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65  Sql[nSql], zLine
a8a0: 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d  );.      nSql +=
a8b0: 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20   len;.    }.    
a8c0: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
a8d0: 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f 65 6e   if( zSql && _en
a8e0: 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c 6f  ds_with_semicolo
a8f0: 6e 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 26 26  n(zSql, nSql) &&
a900: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
a910: 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  e(zSql) ){.     
a920: 20 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20   p->cnt = 0;.   
a930: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
a940: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a950: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53  3_exec(p->db, zS
a960: 71 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ql, callback, p,
a970: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
a980: 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
a990: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Msg ){.        i
a9a0: 66 28 20 69 6e 21 3d 30 20 26 26 20 21 70 2d 3e  f( in!=0 && !p->
a9b0: 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28  echoOn ) printf(
a9c0: 22 25 73 5c 6e 22 2c 7a 53 71 6c 29 3b 0a 20 20  "%s\n",zSql);.  
a9d0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
a9e0: 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
a9f0: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20 65 72    printf("SQL er
aa00: 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
aa10: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
aa20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
aa30: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
aa40: 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
aa50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa60: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 53         printf("S
aa70: 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
aa80: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
aa90: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
aaa0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
aab0: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
aac0: 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20     zSql = 0;.   
aad0: 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20     nSql = 0;.   
aae0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71   }.  }.  if( zSq
aaf0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 5f 61  l ){.    if( !_a
ab00: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53  ll_whitespace(zS
ab10: 71 6c 29 20 29 20 70 72 69 6e 74 66 28 22 49 6e  ql) ) printf("In
ab20: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a 20 25 73  complete SQL: %s
ab30: 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
ab40: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
ab50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ab60: 61 20 70 61 74 68 6e 61 6d 65 20 77 68 69 63 68  a pathname which
ab70: 20 69 73 20 74 68 65 20 75 73 65 72 27 73 20 68   is the user's h
ab80: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ome directory.  
ab90: 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e 20 69 6e  A.** 0 return in
aba0: 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72  dicates an error
abb0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
abc0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
abd0: 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 73  e.** resulting s
abe0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
abf0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
ac00: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
ac10: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
ac20: 20 66 72 65 65 20 74 68 65 20 72 65 73 75 6c 74   free the result
ac30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
ac40: 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28   *find_home_dir(
ac50: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 68  void){.  char *h
ac60: 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a  ome_dir = NULL;.
ac70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
ac80: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
ac90: 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  d(WIN32) && !def
aca0: 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f 29 0a  ined(__MACOS__).
acb0: 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20    struct passwd 
acc0: 2a 70 77 65 6e 74 3b 0a 20 20 75 69 64 5f 74 20  *pwent;.  uid_t 
acd0: 75 69 64 20 3d 20 67 65 74 75 69 64 28 29 3b 0a  uid = getuid();.
ace0: 20 20 69 66 28 20 28 70 77 65 6e 74 3d 67 65 74    if( (pwent=get
acf0: 70 77 75 69 64 28 75 69 64 29 29 20 21 3d 20 4e  pwuid(uid)) != N
ad00: 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
ad10: 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f  dir = pwent->pw_
ad20: 64 69 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dir;.  }.#endif.
ad30: 0a 23 69 66 64 65 66 20 5f 5f 4d 41 43 4f 53 5f  .#ifdef __MACOS_
ad40: 5f 0a 20 20 63 68 61 72 20 68 6f 6d 65 5f 70 61  _.  char home_pa
ad50: 74 68 5b 5f 4d 41 58 5f 50 41 54 48 2b 31 5d 3b  th[_MAX_PATH+1];
ad60: 0a 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65  .  home_dir = ge
ad70: 74 63 77 64 28 68 6f 6d 65 5f 70 61 74 68 2c 20  tcwd(home_path, 
ad80: 5f 4d 41 58 5f 50 41 54 48 29 3b 0a 23 65 6e 64  _MAX_PATH);.#end
ad90: 69 66 0a 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f  if..  if (!home_
ada0: 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  dir) {.    home_
adb0: 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  dir = getenv("HO
adc0: 4d 45 22 29 3b 0a 20 20 20 20 69 66 20 28 21 68  ME");.    if (!h
add0: 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 20  ome_dir) {.     
ade0: 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65   home_dir = gete
adf0: 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29 3b 20  nv("HOMEPATH"); 
ae00: 2f 2a 20 57 69 6e 64 6f 77 73 3f 20 2a 2f 0a 20  /* Windows? */. 
ae10: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 64 65     }.  }..#if de
ae20: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
ae30: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
ae40: 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29    if (!home_dir)
ae50: 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
ae60: 3d 20 22 63 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64  = "c:";.  }.#end
ae70: 69 66 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64  if..  if( home_d
ae80: 69 72 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ir ){.    char *
ae90: 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  z = malloc( strl
aea0: 65 6e 28 68 6f 6d 65 5f 64 69 72 29 2b 31 20 29  en(home_dir)+1 )
aeb0: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 20 73 74  ;.    if( z ) st
aec0: 72 63 70 79 28 7a 2c 20 68 6f 6d 65 5f 64 69 72  rcpy(z, home_dir
aed0: 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  );.    home_dir 
aee0: 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = z;.  }..  retu
aef0: 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a  rn home_dir;.}..
af00: 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
af10: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67   from the file g
af20: 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63  iven by sqliterc
af30: 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69  _override.  Or i
af40: 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65  f that.** parame
af50: 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b  ter is NULL, tak
af60: 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e  e input from ~/.
af70: 73 71 6c 69 74 65 72 63 0a 2a 2f 0a 73 74 61 74  sqliterc.*/.stat
af80: 69 63 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f  ic void process_
af90: 73 71 6c 69 74 65 72 63 28 0a 20 20 73 74 72 75  sqliterc(.  stru
afa0: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
afb0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43   *p,        /* C
afc0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
afd0: 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
afe0: 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72  r *sqliterc_over
aff0: 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ride   /* Name o
b000: 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e  f config file. N
b010: 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75  ULL to use defau
b020: 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  lt */.){.  char 
b030: 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c  *home_dir = NULL
b040: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b050: 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74  sqliterc = sqlit
b060: 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20  erc_override;.  
b070: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 46 49  char *zBuf;.  FI
b080: 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 0a  LE *in = NULL;..
b090: 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20 3d    if (sqliterc =
b0a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f  = NULL) {.    ho
b0b0: 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f  me_dir = find_ho
b0c0: 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 69 66  me_dir();.    if
b0d0: 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b  ( home_dir==0 ){
b0e0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
b0f0: 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e 6e 6f  tderr,"%s: canno
b100: 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20 68 6f  t locate your ho
b110: 6d 65 20 64 69 72 65 63 74 6f 72 79 21 5c 6e 22  me directory!\n"
b120: 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20  , Argv0);.      
b130: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b140: 20 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28    zBuf = malloc(
b150: 73 74 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29  strlen(home_dir)
b160: 20 2b 20 31 35 29 3b 0a 20 20 20 20 69 66 28 20   + 15);.    if( 
b170: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
b180: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b190: 22 25 73 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  "%s: out of memo
b1a0: 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ry!\n", Argv0);.
b1b0: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
b1c0: 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66     }.    sprintf
b1d0: 28 7a 42 75 66 2c 22 25 73 2f 2e 73 71 6c 69 74  (zBuf,"%s/.sqlit
b1e0: 65 72 63 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a  erc",home_dir);.
b1f0: 20 20 20 20 66 72 65 65 28 68 6f 6d 65 5f 64 69      free(home_di
b200: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 72 63  r);.    sqliterc
b210: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
b220: 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  zBuf;.  }.  in =
b230: 20 66 6f 70 65 6e 28 73 71 6c 69 74 65 72 63 2c   fopen(sqliterc,
b240: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
b250: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61 74 74  ){.    if( isatt
b260: 79 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29  y(fileno(stdout)
b270: 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  ) ){.      print
b280: 66 28 22 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75  f("Loading resou
b290: 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c  rces from %s\n",
b2a0: 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d  sqliterc);.    }
b2b0: 0a 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e 70  .    process_inp
b2c0: 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20 20 66 63  ut(p,in);.    fc
b2d0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20  lose(in);.  }.  
b2e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b2f0: 20 53 68 6f 77 20 61 76 61 69 6c 61 62 6c 65 20   Show available 
b300: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
b310: 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ions.*/.static c
b320: 6f 6e 73 74 20 63 68 61 72 20 7a 4f 70 74 69 6f  onst char zOptio
b330: 6e 73 5b 5d 20 3d 20 0a 20 20 22 20 20 20 2d 69  ns[] = .  "   -i
b340: 6e 69 74 20 66 69 6c 65 6e 61 6d 65 20 20 20 20  nit filename    
b350: 20 20 20 72 65 61 64 2f 70 72 6f 63 65 73 73 20     read/process 
b360: 6e 61 6d 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20  named file\n".  
b370: 22 20 20 20 2d 65 63 68 6f 20 20 20 20 20 20 20  "   -echo       
b380: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 63           print c
b390: 6f 6d 6d 61 6e 64 73 20 62 65 66 6f 72 65 20 65  ommands before e
b3a0: 78 65 63 75 74 69 6f 6e 5c 6e 22 0a 20 20 22 20  xecution\n".  " 
b3b0: 20 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20 20    -[no]header   
b3c0: 20 20 20 20 20 20 20 74 75 72 6e 20 68 65 61 64         turn head
b3d0: 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ers on or off\n"
b3e0: 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20  .  "   -column  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
b400: 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
b410: 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20  column'\n".  "  
b420: 20 2d 68 74 6d 6c 20 20 20 20 20 20 20 20 20 20   -html          
b430: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
b440: 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c 5c 6e 22   mode to HTML\n"
b450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
b460: 41 53 5f 43 4f 44 45 43 0a 20 20 22 20 20 20 2d  AS_CODEC.  "   -
b470: 6b 65 79 20 4b 45 59 20 20 20 20 20 20 20 20 20  key KEY         
b480: 20 20 20 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b      encryption k
b490: 65 79 5c 6e 22 0a 23 65 6e 64 69 66 20 20 20 20  ey\n".#endif    
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
b4b0: 22 20 20 20 2d 6c 69 6e 65 20 20 20 20 20 20 20  "   -line       
b4c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
b4d0: 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e  put mode to 'lin
b4e0: 65 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73  e'\n".  "   -lis
b4f0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b500: 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   set output mode
b510: 20 74 6f 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20   to 'list'\n".  
b520: 22 20 20 20 2d 73 65 70 61 72 61 74 6f 72 20 27  "   -separator '
b530: 78 27 20 20 20 20 20 20 20 73 65 74 20 6f 75 74  x'       set out
b540: 70 75 74 20 66 69 65 6c 64 20 73 65 70 61 72 61  put field separa
b550: 74 6f 72 20 28 7c 29 5c 6e 22 0a 20 20 22 20 20  tor (|)\n".  "  
b560: 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 27 74 65 78   -nullvalue 'tex
b570: 74 27 20 20 20 20 73 65 74 20 74 65 78 74 20 73  t'    set text s
b580: 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76  tring for NULL v
b590: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 2d  alues\n".  "   -
b5a0: 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
b5b0: 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74 65 20      show SQLite 
b5c0: 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22 20 20  version\n".  "  
b5d0: 20 2d 68 65 6c 70 20 20 20 20 20 20 20 20 20 20   -help          
b5e0: 20 20 20 20 20 20 73 68 6f 77 20 74 68 69 73 20        show this 
b5f0: 74 65 78 74 2c 20 61 6c 73 6f 20 73 68 6f 77 20  text, also show 
b600: 64 6f 74 2d 63 6f 6d 6d 61 6e 64 73 5c 6e 22 0a  dot-commands\n".
b610: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  ;.static void us
b620: 61 67 65 28 69 6e 74 20 73 68 6f 77 44 65 74 61  age(int showDeta
b630: 69 6c 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  il){.  fprintf(s
b640: 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
b650: 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45  s [OPTIONS] FILE
b660: 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 2c 20 41  NAME [SQL]\n", A
b670: 72 67 76 30 29 3b 0a 20 20 69 66 28 20 73 68 6f  rgv0);.  if( sho
b680: 77 44 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 66  wDetail ){.    f
b690: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b6a0: 4f 70 74 69 6f 6e 73 20 61 72 65 3a 5c 6e 25 73  Options are:\n%s
b6b0: 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20  ", zOptions);.  
b6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
b6d0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20  tf(stderr, "Use 
b6e0: 74 68 65 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e  the -help option
b6f0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
b700: 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
b710: 0a 20 20 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a  .  }.  exit(1);.
b720: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b730: 69 7a 65 20 74 68 65 20 73 74 61 74 65 20 69 6e  ize the state in
b740: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74  formation in dat
b750: 61 0a 2a 2f 0a 76 6f 69 64 20 6d 61 69 6e 5f 69  a.*/.void main_i
b760: 6e 69 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62  nit(struct callb
b770: 61 63 6b 5f 64 61 74 61 20 2a 64 61 74 61 29 20  ack_data *data) 
b780: 7b 0a 20 20 6d 65 6d 73 65 74 28 64 61 74 61 2c  {.  memset(data,
b790: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 64 61 74 61   0, sizeof(*data
b7a0: 29 29 3b 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65  ));.  data->mode
b7b0: 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
b7c0: 73 74 72 63 70 79 28 64 61 74 61 2d 3e 73 65 70  strcpy(data->sep
b7d0: 61 72 61 74 6f 72 2c 22 7c 22 29 3b 0a 20 20 64  arator,"|");.  d
b7e0: 61 74 61 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ata->showHeader 
b7f0: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 6d 61  = 0;.  strcpy(ma
b800: 69 6e 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65  inPrompt,"sqlite
b810: 3e 20 22 29 3b 0a 20 20 73 74 72 63 70 79 28 63  > ");.  strcpy(c
b820: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20  ontinuePrompt," 
b830: 20 20 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e    ...> ");.}..in
b840: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
b850: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
b860: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
b870: 20 30 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c   0;.  struct cal
b880: 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b  lback_data data;
b890: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b8a0: 49 6e 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  InitFile = 0;.  
b8b0: 63 68 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20  char *zFirstCmd 
b8c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  = 0;.  int i;..#
b8d0: 69 66 64 65 66 20 5f 5f 4d 41 43 4f 53 5f 5f 0a  ifdef __MACOS__.
b8e0: 20 20 61 72 67 63 20 3d 20 63 63 6f 6d 6d 61 6e    argc = ccomman
b8f0: 64 28 26 61 72 67 76 29 3b 0a 23 65 6e 64 69 66  d(&argv);.#endif
b900: 0a 0a 20 20 41 72 67 76 30 20 3d 20 61 72 67 76  ..  Argv0 = argv
b910: 5b 30 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74  [0];.  main_init
b920: 28 26 64 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 4d  (&data);..  /* M
b930: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
b940: 20 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20   a valid signal 
b950: 68 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62  handler early, b
b960: 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20  efore anything. 
b970: 20 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65   ** else is done
b980: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49  ..  */.#ifdef SI
b990: 47 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49  GINT.  signal(SI
b9a0: 47 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f  GINT, interrupt_
b9b0: 68 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66  handler);.#endif
b9c0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69  ..  /* Do an ini
b9d0: 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
b9e0: 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  h the command-li
b9f0: 6e 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c  ne argument to l
ba00: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e  ocate.  ** the n
ba10: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
ba20: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61  ase file, the na
ba30: 6d 65 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  me of the initia
ba40: 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20  lization file,. 
ba50: 20 2a 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73   ** and the firs
ba60: 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65  t command to exe
ba70: 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  cute..  */.  for
ba80: 28 69 3d 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20  (i=1; i<argc-1; 
ba90: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72  i++){.    if( ar
baa0: 67 76 5b 69 5d 5b 30 5d 21 3d 27 2d 27 20 29 20  gv[i][0]!='-' ) 
bab0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
bac0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
bad0: 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 7c  separator")==0 |
bae0: 7c 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  | strcmp(argv[i]
baf0: 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d  ,"-nullvalue")==
bb00: 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
bb10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
bb20: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 69  rcmp(argv[i],"-i
bb30: 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nit")==0 ){.    
bb40: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 49 6e    i++;.      zIn
bb50: 69 74 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 5d  itFile = argv[i]
bb60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bb70: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
bb80: 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -key")==0 ){.   
bb90: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 64 61     i++;.      da
bba0: 74 61 2e 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ta.zKey = sqlite
bbb0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 61  3_mprintf("%s",a
bbc0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  rgv[i]);.    }. 
bbd0: 20 7d 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20   }.  if( i<argc 
bbe0: 29 7b 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46  ){.    data.zDbF
bbf0: 69 6c 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b 69  ilename = argv[i
bc00: 2b 2b 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  ++];.  }else{.#i
bc10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bc20: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 64  T_MEMORYDB.    d
bc30: 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20  ata.zDbFilename 
bc40: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
bc50: 6c 73 65 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  lse.    data.zDb
bc60: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 23 65  Filename = 0;.#e
bc70: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 69  ndif.  }.  if( i
bc80: 3c 61 72 67 63 20 29 7b 0a 20 20 20 20 7a 46 69  <argc ){.    zFi
bc90: 72 73 74 43 6d 64 20 3d 20 61 72 67 76 5b 69 2b  rstCmd = argv[i+
bca0: 2b 5d 3b 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f  +];.  }.  data.o
bcb0: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 20 20  ut = stdout;..  
bcc0: 2f 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20  /* Go ahead and 
bcd0: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
bce0: 65 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c 72  e file if it alr
bcf0: 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 49 66  eady exists.  If
bd00: 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 64   the.  ** file d
bd10: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 64  oes not exist, d
bd20: 65 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74 2e  elay opening it.
bd30: 20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20    This prevents 
bd40: 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a 20  empty database. 
bd50: 20 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20 62   ** files from b
bd60: 65 69 6e 67 20 63 72 65 61 74 65 64 20 69 66 20  eing created if 
bd70: 61 20 75 73 65 72 20 6d 69 73 74 79 70 65 73 20  a user mistypes 
bd80: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
bd90: 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20  e argument.  ** 
bda0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  to the sqlite co
bdb0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e  mmand-line tool.
bdc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63 65  .  */.  if( acce
bdd0: 73 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e  ss(data.zDbFilen
bde0: 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  ame, 0)==0 ){.  
bdf0: 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29    open_db(&data)
be00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  ;.  }..  /* Proc
be10: 65 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ess the initiali
be20: 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74  zation file if t
be30: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
be40: 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e   no -init option
be50: 0a 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f  .  ** is given o
be60: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
be70: 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66  ne, look for a f
be80: 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c  ile named ~/.sql
be90: 69 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74  iterc and.  ** t
bea0: 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74  ry to process it
beb0: 2e 0a 20 20 2a 2f 0a 20 20 70 72 6f 63 65 73 73  ..  */.  process
bec0: 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74 61 2c  _sqliterc(&data,
bed0: 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 0a 20 20 2f  zInitFile);..  /
bee0: 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20  * Make a second 
bef0: 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65  pass through the
bf00: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
bf10: 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a 20  gument and set. 
bf20: 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68   ** options.  Th
bf30: 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20 69  is second pass i
bf40: 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
bf50: 61 66 74 65 72 20 74 68 65 20 69 6e 69 74 69 61  after the initia
bf60: 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66 69  lization.  ** fi
bf70: 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 20  le is processed 
bf80: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d 6d  so that the comm
bf90: 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
bfa0: 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ts will override
bfb0: 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 69  .  ** settings i
bfc0: 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
bfd0: 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  tion file..  */.
bfe0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
bff0: 63 20 26 26 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  c && argv[i][0]=
c000: 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ='-'; i++){.    
c010: 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69  char *z = argv[i
c020: 5d 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ];.    if( strcm
c030: 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
c040: 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6b 65  || strcmp(z,"-ke
c050: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
c060: 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
c070: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74  f( strcmp(z,"-ht
c080: 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ml")==0 ){.     
c090: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
c0a0: 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
c0b0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
c0c0: 2d 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -list")==0 ){.  
c0d0: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
c0e0: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
c0f0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
c100: 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b  z,"-line")==0 ){
c110: 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
c120: 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
c130: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
c140: 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d  mp(z,"-column")=
c150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
c160: 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  .mode = MODE_Col
c170: 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  umn;.    }else i
c180: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 65  f( strcmp(z,"-se
c190: 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  parator")==0 ){.
c1a0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
c1b0: 20 73 70 72 69 6e 74 66 28 64 61 74 61 2e 73 65   sprintf(data.se
c1c0: 70 61 72 61 74 6f 72 2c 22 25 2e 2a 73 22 2c 28  parator,"%.*s",(
c1d0: 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74 61 2e  int)sizeof(data.
c1e0: 73 65 70 61 72 61 74 6f 72 29 2d 31 2c 61 72 67  separator)-1,arg
c1f0: 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
c200: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
c210: 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20 29  nullvalue")==0 )
c220: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
c230: 20 20 20 73 70 72 69 6e 74 66 28 64 61 74 61 2e     sprintf(data.
c240: 6e 75 6c 6c 76 61 6c 75 65 2c 22 25 2e 2a 73 22  nullvalue,"%.*s"
c250: 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74  ,(int)sizeof(dat
c260: 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 61  a.nullvalue)-1,a
c270: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  rgv[i]);.    }el
c280: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
c290: 22 2d 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b  "-header")==0 ){
c2a0: 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77  .      data.show
c2b0: 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Header = 1;.    
c2c0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
c2d0: 28 7a 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d  (z,"-noheader")=
c2e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
c2f0: 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
c300: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
c310: 74 72 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29  trcmp(z,"-echo")
c320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
c330: 61 2e 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20  a.echoOn = 1;.  
c340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
c350: 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22 29  mp(z,"-version")
c360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ==0 ){.      pri
c370: 6e 74 66 28 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ntf("%s\n", sqli
c380: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
c390: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c3a0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
c3b0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c 70   strcmp(z,"-help
c3c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  ")==0 ){.      u
c3d0: 73 61 67 65 28 31 29 3b 0a 20 20 20 20 7d 65 6c  sage(1);.    }el
c3e0: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
c3f0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 75 6e  f(stderr,"%s: un
c400: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
c410: 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b 0a  \n", Argv0, z);.
c420: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
c430: 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70 20  derr,"Use -help 
c440: 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f 70  for a list of op
c450: 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20  tions.\n");.    
c460: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c470: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 46 69  }.  }..  if( zFi
c480: 72 73 74 43 6d 64 20 29 7b 0a 20 20 20 20 2f 2a  rstCmd ){.    /*
c490: 20 52 75 6e 20 6a 75 73 74 20 74 68 65 20 63 6f   Run just the co
c4a0: 6d 6d 61 6e 64 20 74 68 61 74 20 66 6f 6c 6c 6f  mmand that follo
c4b0: 77 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ws the database 
c4c0: 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  name.    */.    
c4d0: 69 66 28 20 7a 46 69 72 73 74 43 6d 64 5b 30 5d  if( zFirstCmd[0]
c4e0: 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 64  =='.' ){.      d
c4f0: 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a  o_meta_command(z
c500: 46 69 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29  FirstCmd, &data)
c510: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b  ;.      exit(0);
c520: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c530: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
c540: 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b 0a  open_db(&data);.
c550: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c560: 65 33 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  e3_exec(data.db,
c570: 20 7a 46 69 72 73 74 43 6d 64 2c 20 63 61 6c 6c   zFirstCmd, call
c580: 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
c590: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
c5a0: 28 20 72 63 21 3d 30 20 26 26 20 7a 45 72 72 4d  ( rc!=0 && zErrM
c5b0: 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sg!=0 ){.       
c5c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c5d0: 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
c5e0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
c5f0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
c600: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
c610: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20  lse{.    /* Run 
c620: 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65 69 76 65  commands receive
c630: 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
c640: 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20 20  input.    */.   
c650: 20 69 66 28 20 69 73 61 74 74 79 28 66 69 6c 65   if( isatty(file
c660: 6e 6f 28 73 74 64 6f 75 74 29 29 20 26 26 20 69  no(stdout)) && i
c670: 73 61 74 74 79 28 66 69 6c 65 6e 6f 28 73 74 64  satty(fileno(std
c680: 69 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68  in)) ){.      ch
c690: 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20  ar *zHome;.     
c6a0: 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20   char *zHistory 
c6b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  = 0;.      print
c6c0: 66 28 0a 20 20 20 20 20 20 20 20 22 53 51 4c 69  f(.        "SQLi
c6d0: 74 65 20 76 65 72 73 69 6f 6e 20 25 73 5c 6e 22  te version %s\n"
c6e0: 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20  .        "Enter 
c6f0: 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 69 6e  \".help\" for in
c700: 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 2c 0a 20  structions\n",. 
c710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
c720: 69 62 76 65 72 73 69 6f 6e 28 29 0a 20 20 20 20  ibversion().    
c730: 20 20 29 3b 0a 20 20 20 20 20 20 7a 48 6f 6d 65    );.      zHome
c740: 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72   = find_home_dir
c750: 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48  ();.      if( zH
c760: 6f 6d 65 20 26 26 20 28 7a 48 69 73 74 6f 72 79  ome && (zHistory
c770: 20 3d 20 6d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e   = malloc(strlen
c780: 28 7a 48 6f 6d 65 29 2b 32 30 29 29 21 3d 30 20  (zHome)+20))!=0 
c790: 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ){.        sprin
c7a0: 74 66 28 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f  tf(zHistory,"%s/
c7b0: 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22  .sqlite_history"
c7c0: 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20  , zHome);.      
c7d0: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  }.#if defined(HA
c7e0: 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20  VE_READLINE) && 
c7f0: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31  HAVE_READLINE==1
c800: 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69 73 74  .      if( zHist
c810: 6f 72 79 20 29 20 72 65 61 64 5f 68 69 73 74 6f  ory ) read_histo
c820: 72 79 28 7a 48 69 73 74 6f 72 79 29 3b 0a 23 65  ry(zHistory);.#e
c830: 6e 64 69 66 0a 20 20 20 20 20 20 70 72 6f 63 65  ndif.      proce
c840: 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c 20  ss_input(&data, 
c850: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48  0);.      if( zH
c860: 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  istory ){.      
c870: 20 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79    stifle_history
c880: 28 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20 77  (100);.        w
c890: 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48 69  rite_history(zHi
c8a0: 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d 0a  story);.      }.
c8b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c8c0: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26   process_input(&
c8d0: 64 61 74 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20  data, stdin);.  
c8e0: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61    }.  }.  set_ta
c8f0: 62 6c 65 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20  ble_name(&data, 
c900: 30 29 3b 0a 20 20 69 66 28 20 64 62 20 29 20 73  0);.  if( db ) s
c910: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
c920: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.