System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b05e2cf5f66f7b426f7985e0718a18b034938c64:


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 32 32 20 32 30  hell.c,v 1.22 20
0200: 30 36 2f 30 36 2f 30 38 20 30 34 3a 32 34 3a 33  06/06/08 04:24:3
0210: 32 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78 70 20  2 rmsimpson Exp 
0220: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  $.*/.#include <s
0230: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0240: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0270: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h>.#include "sq
0280: 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64  lite3.h".#includ
0290: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69 66  e <ctype.h>..#if
02a0: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
02b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
02c0: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
02d0: 28 5f 5f 4d 41 43 4f 53 5f 5f 29 0a 23 20 69 6e  (__MACOS__).# in
02e0: 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e  clude <signal.h>
02f0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  .# include <pwd.
0300: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  h>.# include <un
0310: 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  istd.h>.# includ
0320: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0330: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f  #endif..#ifdef _
0340: 5f 4d 41 43 4f 53 5f 5f 0a 23 20 69 6e 63 6c 75  _MACOS__.# inclu
0350: 64 65 20 3c 63 6f 6e 73 6f 6c 65 2e 68 3e 0a 23  de <console.h>.#
0360: 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c   include <signal
0370: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
0380: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0390: 64 65 20 3c 65 78 74 72 61 73 2e 68 3e 0a 23 20  de <extras.h>.# 
03a0: 69 6e 63 6c 75 64 65 20 3c 46 69 6c 65 73 2e 68  include <Files.h
03b0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 46 6f 6c  >.# include <Fol
03c0: 64 65 72 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ders.h>.#endif..
03d0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
03e0: 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41  _READLINE) && HA
03f0: 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 23  VE_READLINE==1.#
0400: 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69   include <readli
0410: 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23  ne/readline.h>.#
0420: 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69   include <readli
0430: 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65  ne/history.h>.#e
0440: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 65 61  lse.# define rea
0450: 64 6c 69 6e 65 28 70 29 20 6c 6f 63 61 6c 5f 67  dline(p) local_g
0460: 65 74 6c 69 6e 65 28 70 2c 73 74 64 69 6e 29 0a  etline(p,stdin).
0470: 23 20 64 65 66 69 6e 65 20 61 64 64 5f 68 69 73  # define add_his
0480: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0490: 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29   read_history(X)
04a0: 0a 23 20 64 65 66 69 6e 65 20 77 72 69 74 65 5f  .# define write_
04b0: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
04c0: 69 6e 65 20 73 74 69 66 6c 65 5f 68 69 73 74 6f  ine stifle_histo
04d0: 72 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(X).#endif../*
04e0: 20 4d 61 6b 65 20 73 75 72 65 20 69 73 61 74 74   Make sure isatt
04f0: 79 28 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74  y() has a protot
0500: 79 70 65 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69  ype..*/.extern i
0510: 6e 74 20 69 73 61 74 74 79 28 29 3b 0a 0a 2f 2a  nt isatty();../*
0520: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
0530: 67 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51  g is the open SQ
0540: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
0550: 57 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65  We make a pointe
0560: 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74  r.** to this dat
0570: 61 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76  abase a static v
0580: 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20  ariable so that 
0590: 69 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73  it can be access
05a0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47  ed.** by the SIG
05b0: 49 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69  INT handler to i
05c0: 6e 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73  nterrupt databas
05d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f  e processing..*/
05e0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
05f0: 2a 64 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  *db = 0;../*.** 
0600: 54 72 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72  True if an inter
0610: 72 75 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29  rupt (Control-C)
0620: 20 68 61 73 20 62 65 65 6e 20 72 65 63 65 69 76   has been receiv
0630: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
0640: 6c 61 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49  latile int seenI
0650: 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f  nterrupt = 0;../
0660: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
0670: 20 6e 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f   name of our pro
0680: 67 72 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20  gram. It is set 
0690: 69 6e 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a  in main(), used.
06a0: 2a 2a 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f  ** in a number o
06b0: 66 20 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20  f other places, 
06c0: 6d 6f 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72  mostly for error
06d0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
06e0: 61 74 69 63 20 63 68 61 72 20 2a 41 72 67 76 30  atic char *Argv0
06f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20  ;../*.** Prompt 
0700: 73 74 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c  strings. Initial
0710: 69 7a 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65  ized in main. Se
0720: 74 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20  ttable with.**  
0730: 20 2e 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f   .prompt main co
0740: 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63  ntinue.*/.static
0750: 20 63 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74   char mainPrompt
0760: 5b 32 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72  [20];     /* Fir
0770: 73 74 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20  st line prompt. 
0780: 64 65 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65  default: "sqlite
0790: 3e 20 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  > "*/.static cha
07a0: 72 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  r continuePrompt
07b0: 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75  [20]; /* Continu
07c0: 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65  ation prompt. de
07d0: 66 61 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20  fault: "   ...> 
07e0: 22 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  " */.../*.** Det
07f0: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 72  ermines if a str
0800: 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72 20  ing is a number 
0810: 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  of not..*/.stati
0820: 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63  c int isNumber(c
0830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
0840: 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69  t *realnum){.  i
0850: 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a  f( *z=='-' || *z
0860: 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69  =='+' ) z++;.  i
0870: 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20  f( !isdigit(*z) 
0880: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
0890: 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66  .  }.  z++;.  if
08a0: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
08b0: 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  lnum = 0;.  whil
08c0: 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29  e( isdigit(*z) )
08d0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  { z++; }.  if( *
08e0: 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b  z=='.' ){.    z+
08f0: 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69  +;.    if( !isdi
0900: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
0910: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
0920: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sdigit(*z) ){ z+
0930: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  +; }.    if( rea
0940: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
0950: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  = 1;.  }.  if( *
0960: 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45  z=='e' || *z=='E
0970: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
0980: 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c    if( *z=='+' ||
0990: 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a   *z=='-' ) z++;.
09a0: 20 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74      if( !isdigit
09b0: 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
09c0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69  .    while( isdi
09d0: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
09e0: 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75  }.    if( realnu
09f0: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31  m ) *realnum = 1
0a00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ;.  }.  return *
0a10: 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  z==0;.}../*.** A
0a20: 20 67 6c 6f 62 61 6c 20 63 68 61 72 2a 20 61 6e   global char* an
0a30: 64 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  d an SQL functio
0a40: 6e 20 74 6f 20 61 63 63 65 73 73 20 69 74 73 20  n to access its 
0a50: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 0a 2a  current value .*
0a60: 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  * from within an
0a70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
0a80: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 75 73 65  This program use
0a90: 64 20 74 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a  d to use the .**
0aa0: 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 70 72 69   sqlite_exec_pri
0ab0: 6e 74 66 28 29 20 41 50 49 20 74 6f 20 73 75 62  ntf() API to sub
0ac0: 73 74 69 74 75 65 20 61 20 73 74 72 69 6e 67 20  stitue a string 
0ad0: 69 6e 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74  into an SQL stat
0ae0: 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f  ement..** The co
0af0: 72 72 65 63 74 20 77 61 79 20 74 6f 20 64 6f 20  rrect way to do 
0b00: 74 68 69 73 20 77 69 74 68 20 73 71 6c 69 74 65  this with sqlite
0b10: 33 20 69 73 20 74 6f 20 75 73 65 20 74 68 65 20  3 is to use the 
0b20: 62 69 6e 64 20 41 50 49 2c 20 62 75 74 0a 2a 2a  bind API, but.**
0b30: 20 73 69 6e 63 65 20 74 68 65 20 73 68 65 6c 6c   since the shell
0b40: 20 69 73 20 62 75 69 6c 74 20 61 72 6f 75 6e 64   is built around
0b50: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 70 61   the callback pa
0b60: 72 61 64 69 67 6d 20 69 74 20 77 6f 75 6c 64 20  radigm it would 
0b70: 62 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77  be a lot.** of w
0b80: 6f 72 6b 2e 20 49 6e 73 74 65 61 64 20 6a 75 73  ork. Instead jus
0b90: 74 20 75 73 65 20 74 68 69 73 20 68 61 63 6b 2c  t use this hack,
0ba0: 20 77 68 69 63 68 20 69 73 20 71 75 69 74 65 20   which is quite 
0bb0: 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61  harmless..*/.sta
0bc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
0bd0: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30  zShellStatic = 0
0be0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ;.static void sh
0bf0: 65 6c 6c 73 74 61 74 69 63 46 75 6e 63 28 0a 20  ellstaticFunc(. 
0c00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0c10: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
0c20: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
0c30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 61 72  .  assert( 0==ar
0c50: 67 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gc );.  assert( 
0c60: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 29 3b 0a  zShellStatic );.
0c70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0c80: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
0c90: 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31 2c  ShellStatic, -1,
0ca0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
0cb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
0cc0: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
0cd0: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
0ce0: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
0cf0: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
0d00: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
0d10: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
0d20: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
0d30: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
0d40: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
0d50: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
0d60: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
0d70: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
0d90: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
0da0: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
0db0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
0dc0: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
0dd0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
0de0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
0df0: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
0e00: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
0e10: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
0e20: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
0e30: 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20 7a 50  t eol;..  if( zP
0e40: 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f 6d 70  rompt && *zPromp
0e50: 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  t ){.    printf(
0e60: 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b 0a 20  "%s",zPrompt);. 
0e70: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
0e80: 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65 20 3d  );.  }.  nLine =
0e90: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
0ea0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
0eb0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
0ec0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
0ed0: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
0ee0: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
0ef0: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
0f00: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
0f10: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
0f20: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
0f30: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
0f40: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
0f50: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
0f60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
0f70: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
0f80: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
0f90: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
0fa0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
0fb0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
0fc0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
0fd0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
0fe0: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
0ff0: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
1000: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1010: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
1020: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
1030: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
1040: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
1050: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
1060: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
1070: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
1080: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  1;.    }.  }.  z
1090: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20  Line = realloc( 
10a0: 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20  zLine, n+1 );.  
10b0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
10c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
10d0: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
10e0: 20 69 6e 70 75 74 20 74 65 78 74 2e 20 20 22 69   input text.  "i
10f0: 73 61 74 74 79 22 20 69 73 20 74 72 75 65 20 69  satty" is true i
1100: 66 20 74 65 78 74 0a 2a 2a 20 69 73 20 63 6f 6d  f text.** is com
1110: 69 6e 67 20 66 72 6f 6d 20 61 20 74 65 72 6d 69  ing from a termi
1120: 6e 61 6c 2e 20 20 49 6e 20 74 68 61 74 20 63 61  nal.  In that ca
1130: 73 65 2c 20 77 65 20 69 73 73 75 65 20 61 20 70  se, we issue a p
1140: 72 6f 6d 70 74 20 61 6e 64 0a 2a 2a 20 61 74 74  rompt and.** att
1150: 65 6d 70 74 20 74 6f 20 75 73 65 20 22 72 65 61  empt to use "rea
1160: 64 6c 69 6e 65 22 20 66 6f 72 20 63 6f 6d 6d 61  dline" for comma
1170: 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 2e  nd-line editing.
1180: 20 20 49 66 20 22 69 73 61 74 74 79 22 0a 2a 2a    If "isatty".**
1190: 20 69 73 20 66 61 6c 73 65 2c 20 75 73 65 20 22   is false, use "
11a0: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 22 20 69  local_getline" i
11b0: 6e 73 74 65 61 64 20 6f 66 20 22 72 65 61 64 6c  nstead of "readl
11c0: 69 6e 65 22 20 61 6e 64 20 69 73 73 75 65 20 6e  ine" and issue n
11d0: 6f 20 70 72 6f 6d 70 74 2e 0a 2a 2a 0a 2a 2a 20  o prompt..**.** 
11e0: 7a 50 72 69 6f 72 20 69 73 20 61 20 73 74 72 69  zPrior is a stri
11f0: 6e 67 20 6f 66 20 70 72 69 6f 72 20 74 65 78 74  ng of prior text
1200: 20 72 65 74 72 69 65 76 65 64 2e 20 20 49 66 20   retrieved.  If 
1210: 6e 6f 74 20 74 68 65 20 65 6d 70 74 79 0a 2a 2a  not the empty.**
1220: 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 69 73   string, then is
1230: 73 75 65 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  sue a continuati
1240: 6f 6e 20 70 72 6f 6d 70 74 2e 0a 2a 2f 0a 73 74  on prompt..*/.st
1250: 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f 69  atic char *one_i
1260: 6e 70 75 74 5f 6c 69 6e 65 28 63 6f 6e 73 74 20  nput_line(const 
1270: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 46 49  char *zPrior, FI
1280: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
1290: 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61 72  *zPrompt;.  char
12a0: 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66 28   *zResult;.  if(
12b0: 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   in!=0 ){.    re
12c0: 74 75 72 6e 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  turn local_getli
12d0: 6e 65 28 30 2c 20 69 6e 29 3b 0a 20 20 7d 0a 20  ne(0, in);.  }. 
12e0: 20 69 66 28 20 7a 50 72 69 6f 72 20 26 26 20 7a   if( zPrior && z
12f0: 50 72 69 6f 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Prior[0] ){.    
1300: 7a 50 72 6f 6d 70 74 20 3d 20 63 6f 6e 74 69 6e  zPrompt = contin
1310: 75 65 50 72 6f 6d 70 74 3b 0a 20 20 7d 65 6c 73  uePrompt;.  }els
1320: 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  e{.    zPrompt =
1330: 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 20 20 7d   mainPrompt;.  }
1340: 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20 72 65 61  .  zResult = rea
1350: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
1360: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
1370: 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41  _READLINE) && HA
1380: 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 20  VE_READLINE==1. 
1390: 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26 26 20   if( zResult && 
13a0: 2a 7a 52 65 73 75 6c 74 20 29 20 61 64 64 5f 68  *zResult ) add_h
13b0: 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b  istory(zResult);
13c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
13d0: 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 73 74 72   zResult;.}..str
13e0: 75 63 74 20 70 72 65 76 69 6f 75 73 5f 6d 6f 64  uct previous_mod
13f0: 65 5f 64 61 74 61 20 7b 0a 20 20 69 6e 74 20 76  e_data {.  int v
1400: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  alid;        /* 
1410: 49 73 20 74 68 65 72 65 20 6c 65 67 69 74 20 64  Is there legit d
1420: 61 74 61 20 69 6e 20 68 65 72 65 3f 20 2a 2f 0a  ata in here? */.
1430: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 69 6e    int mode;.  in
1440: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  t showHeader;.  
1450: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
1460: 5d 3b 0a 7d 3b 0a 2f 2a 0a 2a 2a 20 41 6e 20 70  ];.};./*.** An p
1470: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
1480: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1490: 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65  ructure is passe
14a0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6d 61  d from.** the ma
14b0: 69 6e 20 70 72 6f 67 72 61 6d 20 74 6f 20 74 68  in program to th
14c0: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
14d0: 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  s is used to com
14e0: 6d 75 6e 69 63 61 74 65 0a 2a 2a 20 73 74 61 74  municate.** stat
14f0: 65 20 61 6e 64 20 6d 6f 64 65 20 69 6e 66 6f 72  e and mode infor
1500: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  mation..*/.struc
1510: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
1520: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1540: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1550: 20 69 6e 74 20 65 63 68 6f 4f 6e 3b 20 20 20 20   int echoOn;    
1560: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1570: 74 6f 20 65 63 68 6f 20 69 6e 70 75 74 20 63 6f  to echo input co
1580: 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  mmands */.  int 
1590: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
15a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15b0: 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65  records displaye
15c0: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49  d so far */.  FI
15d0: 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
15e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
15f0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
1600: 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20  int mode;       
1610: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74         /* An out
1620: 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67  put mode setting
1630: 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65   */.  int showHe
1640: 61 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ader;        /* 
1650: 54 72 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c  True to show col
1660: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73  umn names in Lis
1670: 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65  t or Column mode
1680: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
1690: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
16a0: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
16b0: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
16c0: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
16d0: 63 68 61 72 20 73 65 70 61 72 61 74 6f 72 5b 32  char separator[2
16e0: 30 5d 3b 20 20 20 20 2f 2a 20 53 65 70 61 72 61  0];    /* Separa
16f0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
1700: 72 20 4d 4f 44 45 5f 4c 69 73 74 20 2a 2f 0a 20  r MODE_List */. 
1710: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
1720: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
1730: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
1740: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
1750: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
1760: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
1770: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
1780: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
1790: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
17a0: 72 20 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b  r nullvalue[20];
17b0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
17c0: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
17d0: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
17e0: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1810: 0a 20 20 73 74 72 75 63 74 20 70 72 65 76 69 6f  .  struct previo
1820: 75 73 5f 6d 6f 64 65 5f 64 61 74 61 20 65 78 70  us_mode_data exp
1830: 6c 61 69 6e 50 72 65 76 3b 0a 20 20 20 20 20 20  lainPrev;.      
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20     /* Holds the 
1860: 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  mode information
1870: 20 6a 75 73 74 20 62 65 66 6f 72 65 0a 20 20 20   just before.   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 20 2a 2a 20 2e 65 78 70 6c 61 69        ** .explai
18a0: 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 6f  n ON */.  char o
18b0: 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f  utfile[FILENAME_
18c0: 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  MAX]; /* Filenam
18d0: 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20  e for *out */.  
18e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46  const char *zDbF
18f0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e  ilename;    /* n
1900: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1910: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
1920: 61 72 20 2a 7a 4b 65 79 3b 20 20 20 20 20 20 20  ar *zKey;       
1930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 63            /* Enc
1940: 72 79 70 74 69 6f 6e 20 6b 65 79 20 2a 2f 0a 7d  ryption key */.}
1950: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
1960: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
1970: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
1980: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
1990: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
19a0: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
19b0: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
19c0: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
19d0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
19e0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
19f0: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
1a00: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
1a10: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
1a20: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
1a30: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
1a40: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
1a50: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
1a60: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
1a70: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
1a80: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
1a90: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
1aa0: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
1ab0: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
1ac0: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
1ad0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
1ae0: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
1af0: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
1b00: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
1b10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
1b20: 5f 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20  _Tcl      6  /* 
1b30: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
1b40: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
1b50: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
1b60: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
1b70: 37 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  7  /* Quote stri
1b80: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
1b90: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
1ba0: 65 20 4d 4f 44 45 5f 4e 55 4d 5f 4f 46 20 20 20  e MODE_NUM_OF   
1bb0: 38 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  8  /* The number
1bc0: 20 6f 66 20 6d 6f 64 65 73 20 28 6e 6f 74 20 61   of modes (not a
1bd0: 20 6d 6f 64 65 20 69 74 73 65 6c 66 29 20 2a 2f   mode itself) */
1be0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
1bf0: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 4d  har *modeDescr[M
1c00: 4f 44 45 5f 4e 55 4d 5f 4f 46 5d 20 3d 20 7b 0a  ODE_NUM_OF] = {.
1c10: 20 20 22 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c    "line",.  "col
1c20: 75 6d 6e 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a  umn",.  "list",.
1c30: 20 20 22 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d    "semi",.  "htm
1c40: 6c 22 2c 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a  l",.  "insert",.
1c50: 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22    "tcl",.  "csv"
1c60: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62  ,.};../*.** Numb
1c70: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1c80: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23 64  n an array.*/.#d
1c90: 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65 28  efine ArraySize(
1ca0: 58 29 20 20 28 73 69 7a 65 6f 66 28 58 29 2f 73  X)  (sizeof(X)/s
1cb0: 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a  izeof(X[0]))../*
1cc0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
1cd0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
1ce0: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75   quoted string u
1cf0: 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67  sing SQL quoting
1d00: 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2f   conventions..*/
1d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
1d20: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
1d30: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
1d40: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
1d50: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 69 6e  nt i;.  int nSin
1d60: 67 6c 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  gle = 0;.  for(i
1d70: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
1d80: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
1d90: 27 27 20 29 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a  '' ) nSingle++;.
1da0: 20 20 7d 0a 20 20 69 66 28 20 6e 53 69 6e 67 6c    }.  if( nSingl
1db0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
1dc0: 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a  ntf(out,"'%s'",z
1dd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1de0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
1df0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
1e00: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
1e10: 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d  ; z[i] && z[i]!=
1e20: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '\''; i++){}.   
1e30: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
1e40: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1e50: 75 74 2c 22 27 27 22 29 3b 0a 20 20 20 20 20 20  ut,"''");.      
1e60: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    z++;.      }el
1e70: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
1e80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ' ){.        fpr
1e90: 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 27 27  intf(out,"%.*s''
1ea0: 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20  ",i,z);.        
1eb0: 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  z += i+1;.      
1ec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1ed0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
1ee0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
1ef0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1f00: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f10: 2c 22 27 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ,"'");.  }.}../*
1f20: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
1f30: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
1f40: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
1f50: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
1f60: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
1f70: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
1f80: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
1f90: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
1fa0: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
1fb0: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
1fc0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
1fd0: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
1fe0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
1ff0: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
2000: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
2010: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
2020: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
2030: 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20  f( c=='\t' ){.  
2040: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
2050: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
2060: 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('t', out);.   
2070: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
2080: 6e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  n' ){.      fput
2090: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
20a0: 20 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f      fputc('n', o
20b0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
20c0: 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20  f( c=='\r' ){.  
20d0: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
20e0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
20f0: 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('r', out);.   
2100: 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72   }else if( !ispr
2110: 69 6e 74 28 63 29 20 29 7b 0a 20 20 20 20 20 20  int(c) ){.      
2120: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c  fprintf(out, "\\
2130: 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a  %03o", c&0xff);.
2140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2150: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
2160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74      }.  }.  fput
2170: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a  c('"', out);.}..
2180: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
2190: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69   given string wi
21a0: 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68  th characters th
21b0: 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74  at are special t
21c0: 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65  o.** HTML escape
21d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
21e0: 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74  d output_html_st
21f0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
2200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
2210: 20 20 69 6e 74 20 69 3b 0a 20 20 77 68 69 6c 65    int i;.  while
2220: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( *z ){.    for(
2230: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
2240: 5d 21 3d 27 3c 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!='<' && z[i]!=
2250: 27 26 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '&'; i++){}.    
2260: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
2270: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
2280: 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a  *s",i,z);.    }.
2290: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c      if( z[i]=='<
22a0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ' ){.      fprin
22b0: 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a  tf(out,"&lt;");.
22c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
22d0: 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20  i]=='&' ){.     
22e0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61   fprintf(out,"&a
22f0: 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mp;");.    }else
2300: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
2310: 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20     }.    z += i 
2320: 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  + 1;.  }.}../*.*
2330: 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c  * Output a singl
2340: 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20  e term of CSV.  
2350: 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70  Actually, p->sep
2360: 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66  arator is used f
2370: 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  or.** the separa
2380: 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  tor, which may o
2390: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  r may not be a c
23a0: 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61  omma.  p->nullva
23b0: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75  lue is.** the nu
23c0: 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e  ll value.  Strin
23d0: 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 75 73  gs are quoted us
23e0: 69 6e 67 20 41 4e 53 49 2d 43 20 72 75 6c 65 73  ing ANSI-C rules
23f0: 2e 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 70  .  Numbers.** ap
2400: 70 65 61 72 20 6f 75 74 73 69 64 65 20 6f 66 20  pear outside of 
2410: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
2420: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73  c void output_cs
2430: 76 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  v(struct callbac
2440: 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74  k_data *p, const
2450: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53   char *z, int bS
2460: 65 70 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  ep){.  if( z==0 
2470: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
2480: 2d 3e 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75  ->out,"%s",p->nu
2490: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73  llvalue);.  }els
24a0: 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 7a  e if( isNumber(z
24b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 66 70 72 69  , 0) ){.    fpri
24c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
24d0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
24e0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
24f0: 28 70 2d 3e 6f 75 74 2c 20 7a 29 3b 0a 20 20 7d  (p->out, z);.  }
2500: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
2510: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
2520: 74 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  t, p->separator)
2530: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
2540: 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SIGINT./*.** Thi
2550: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
2560: 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65  hen the user pre
2570: 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73  sses Ctrl-C.*/.s
2580: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72  tatic void inter
2590: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74  rupt_handler(int
25a0: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 65 65   NotUsed){.  see
25b0: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 31 3b 0a  nInterrupt = 1;.
25c0: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
25d0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
25e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
2600: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
2610: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
2620: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
2630: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
2640: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
2650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2660: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
2670: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
2680: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
2690: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
26a0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
26b0: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
26c0: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
26d0: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  k_data*)pArg;.  
26e0: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
26f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
2700: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
2710: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
2720: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
2730: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
2740: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
2750: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
2760: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 43 6f  en = strlen(azCo
2770: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  l[i]);.        i
2780: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
2790: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
27a0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
27b0: 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
27c0: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  t,"\n");.      f
27d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
27e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
27f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a  rintf(p->out,"%*
2800: 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20 61 7a  s = %s\n", w, az
2810: 43 6f 6c 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  Col[i], .       
2820: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
2830: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
2840: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
2850: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2870: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
2880: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
2890: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
28a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
28b0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
28c0: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
28d0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
28e0: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
28f0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
2900: 20 20 20 20 77 20 3d 20 70 2d 3e 63 6f 6c 57 69      w = p->colWi
2910: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
2920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2930: 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20        w = 0;.   
2940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2950: 20 20 20 69 66 28 20 77 3c 3d 30 20 29 7b 0a 20     if( w<=0 ){. 
2960: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73             w = s
2970: 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 20 3f  trlen(azCol[i] ?
2980: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
2990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29a0: 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a   w<10 ) w = 10;.
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
29c0: 73 74 72 6c 65 6e 28 61 7a 41 72 67 20 26 26 20  strlen(azArg && 
29d0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
29e0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
29f0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
2a00: 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e   if( w<n ) w = n
2a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a20: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
2a30: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
2a40: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
2a50: 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c         p->actual
2a60: 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20  Width[i] = w;.  
2a70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a80: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
2a90: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
2aa0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
2ab0: 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77  out,"%-*.*s%s",w
2ac0: 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d  ,w,azCol[i], i==
2ad0: 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22  nArg-1 ? "\n": "
2ae0: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
2af0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b00: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
2b10: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
2b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
2b30: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2b40: 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20        int w;.   
2b50: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
2b60: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
2b70: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
2b80: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
2b90: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d  ->actualWidth[i]
2ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2bb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2bc0: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
2bd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2be0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
2bf0: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
2c00: 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  w,w,"-----------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20  --------".      
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 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 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20  --------",.     
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2c90: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a  ==nArg-1 ? "\n":
2ca0: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
2cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cd0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
2ce0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2cf0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
2d00: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
2d10: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
2d20: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
2d30: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
2d40: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
2d50: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
2d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d70: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
2d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2d90: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
2da0: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20  -*.*s%s",w,w,.  
2db0: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2dc0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
2dd0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20 69 3d  p->nullvalue, i=
2de0: 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20  =nArg-1 ? "\n": 
2df0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "  ");.      }. 
2e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e10: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
2e20: 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65 20 4d  Semi:.    case M
2e30: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
2e40: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
2e50: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
2e60: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
2e70: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
2e80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
2e90: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
2ea0: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69  s%s",azCol[i], i
2eb0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 20  ==nArg-1 ? "\n" 
2ec0: 3a 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  : p->separator);
2ed0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
2ef0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
2f00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2f10: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2f20: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
2f30: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
2f40: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
2f50: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 3b 0a 20 20 20  ->nullvalue;.   
2f60: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
2f70: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
2f80: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
2f90: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
2fa0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
2fb0: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
2fc0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tor);.        }e
2fd0: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d  lse if( p->mode=
2fe0: 3d 4d 4f 44 45 5f 53 65 6d 69 20 29 7b 0a 20 20  =MODE_Semi ){.  
2ff0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
3000: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
3010: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3020: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
3030: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
3040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3060: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
3070: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
3080: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
3090: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
30a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  r ){.        fpr
30b0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
30c0: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  >");.        for
30d0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
30e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  +){.          fp
30f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
3100: 48 3e 25 73 3c 2f 54 48 3e 22 2c 61 7a 43 6f 6c  H>%s</TH>",azCol
3110: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
3120: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
3130: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
3140: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3150: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
3160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72  break;.      fpr
3170: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
3180: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
3190: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
31a0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
31b0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29  f(p->out,"<TD>")
31c0: 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  ;.        output
31d0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
31e0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
31f0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
3200: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
3210: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3220: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
3230: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
3240: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
3250: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
3260: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3270: 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20  e MODE_Tcl: {.  
3280: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
3290: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
32a0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
32b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
32c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32d0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
32e0: 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d  (p->out,azCol[i]
32f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  );.          fpr
3300: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
3310: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
3320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3330: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3340: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
3350: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
3360: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
3370: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3380: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
3390: 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
33a0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
33b0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
33c0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
33d0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
33e0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
33f0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
3400: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
3410: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
3420: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3430: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
3440: 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 69  E_Csv: {.      i
3450: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
3460: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
3470: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
3480: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
3490: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
34a0: 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b  ut_csv(p, azCol[
34b0: 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20  i], i<nArg-1);. 
34c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34d0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
34e0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
34f0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
3500: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
3510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
3520: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3530: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
3540: 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31  Arg[i], i<nArg-1
3550: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3560: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
3570: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
3580: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3590: 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20  se MODE_Insert: 
35a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
35b0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
35c0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
35d0: 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ut,"INSERT INTO 
35e0: 25 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e 7a  %s VALUES(",p->z
35f0: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
3600: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
3610: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
3620: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69 3e   char *zSep = i>
3630: 30 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20 20  0 ? ",": "";.   
3640: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
3650: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
3660: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3670: 2c 22 25 73 4e 55 4c 4c 22 2c 7a 53 65 70 29 3b  ,"%sNULL",zSep);
3680: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
3690: 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72  f( isNumber(azAr
36a0: 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20  g[i], 0) ){.    
36b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
36c0: 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70  >out,"%s%s",zSep
36d0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
36e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36f0: 20 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30        if( zSep[0
3700: 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f  ] ) fprintf(p->o
3710: 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20  ut,"%s",zSep);. 
3720: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
3730: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
3740: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
3750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3760: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
3770: 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b  (p->out,");\n");
3780: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3790: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
37a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
37b0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
37c0: 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20   table field of 
37d0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  the callback_dat
37e0: 61 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  a structure to.*
37f0: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
3800: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20  e table given.  
3810: 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65  Escape any quote
3820: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
3830: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  he.** table name
3840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3850: 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
3860: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
3870: 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63  data *p, const c
3880: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
3890: 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e  nt i, n;.  int n
38a0: 65 65 64 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  eedQuote;.  char
38b0: 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
38c0: 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
38d0: 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
38e0: 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
38f0: 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
3900: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3910: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 65 65 64  ) return;.  need
3920: 51 75 6f 74 65 20 3d 20 21 69 73 61 6c 70 68 61  Quote = !isalpha
3930: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
3940: 2a 7a 4e 61 6d 65 29 20 26 26 20 2a 7a 4e 61 6d  *zName) && *zNam
3950: 65 21 3d 27 5f 27 3b 0a 20 20 66 6f 72 28 69 3d  e!='_';.  for(i=
3960: 6e 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  n=0; zName[i]; i
3970: 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, n++){.    if
3980: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
3990: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
39a0: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
39b0: 3d 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 6e 65  ='_' ){.      ne
39c0: 65 64 51 75 6f 74 65 20 3d 20 31 3b 0a 20 20 20  edQuote = 1;.   
39d0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d     if( zName[i]=
39e0: 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 0a 20 20 20  ='\'' ) n++;.   
39f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65   }.  }.  if( nee
3a00: 64 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 32 3b  dQuote ) n += 2;
3a10: 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
3a20: 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
3a30: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
3a40: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3a50: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
3a60: 65 6d 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20  emory!\n");.    
3a70: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e  exit(1);.  }.  n
3a80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 65 65 64   = 0;.  if( need
3a90: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
3aa0: 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 69 3d 30   '\'';.  for(i=0
3ab0: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
3ac0: 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
3ad0: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
3ae0: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20   zName[i]=='\'' 
3af0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
3b00: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
3b10: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
3b20: 27 5c 27 27 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  '\'';.  z[n] = 0
3b30: 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65  ;.}../* zIn is e
3b40: 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20  ither a pointer 
3b50: 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e  to a NULL-termin
3b60: 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d  ated string in m
3b70: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a  emory obtained.*
3b80: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c  * from malloc(),
3b90: 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   or a NULL point
3ba0: 65 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70  er. The string p
3bb0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70  ointed to by zAp
3bc0: 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64  pend is.** added
3bd0: 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65   to zIn, and the
3be0: 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64   result returned
3bf0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3c00: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
3c10: 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74  )..** zIn, if it
3c20: 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69   was not NULL, i
3c30: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
3c40: 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
3c50: 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20  ment, quote, is 
3c60: 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69  not '\0', then i
3c70: 74 20 69 73 20 75 73 65 64 20 61 73 20 61 20 0a  t is used as a .
3c80: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
3c90: 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a  er for zAppend..
3ca0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3cb0: 20 61 70 70 65 6e 64 54 65 78 74 28 63 68 61 72   appendText(char
3cc0: 20 2a 7a 49 6e 2c 20 63 68 61 72 20 63 6f 6e 73   *zIn, char cons
3cd0: 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72  t *zAppend, char
3ce0: 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c   quote){.  int l
3cf0: 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  en;.  int i;.  i
3d00: 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72  nt nAppend = str
3d10: 6c 65 6e 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20  len(zAppend);.  
3d20: 69 6e 74 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73  int nIn = (zIn?s
3d30: 74 72 6c 65 6e 28 7a 49 6e 29 3a 30 29 3b 0a 0a  trlen(zIn):0);..
3d40: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
3d50: 6e 49 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  nIn+1;.  if( quo
3d60: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
3d70: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
3d80: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
3d90: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
3da0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
3db0: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
3dc0: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20  ..  zIn = (char 
3dd0: 2a 29 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c  *)realloc(zIn, l
3de0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20  en);.  if( !zIn 
3df0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3e00: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74  .  }..  if( quot
3e10: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  e ){.    char *z
3e20: 43 73 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b  Csr = &zIn[nIn];
3e30: 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  .    *zCsr++ = q
3e40: 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  uote;.    for(i=
3e50: 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b  0; i<nAppend; i+
3e60: 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b  +){.      *zCsr+
3e70: 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a  + = zAppend[i];.
3e80: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
3e90: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a  d[i]==quote ) *z
3ea0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
3eb0: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b     }.    *zCsr++
3ec0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a   = quote;.    *z
3ed0: 43 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20  Csr++ = '\0';.  
3ee0: 20 20 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d    assert( (zCsr-
3ef0: 7a 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d  zIn)==len );.  }
3f00: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79  else{.    memcpy
3f10: 28 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70  (&zIn[nIn], zApp
3f20: 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20  end, nAppend);. 
3f30: 20 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20     zIn[len-1] = 
3f40: 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  '\0';.  }..  ret
3f50: 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn zIn;.}.../*.
3f60: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
3f70: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
3f80: 74 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72  t has a single r
3f90: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50  esult column.  P
3fa0: 72 69 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73  rint.** that res
3fb0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20  ult column on a 
3fc0: 6c 69 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77  line by itself w
3fd0: 69 74 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20  ith a semicolon 
3fe0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73  terminator..*/.s
3ff0: 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61  tatic int run_ta
4000: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 46  ble_dump_query(F
4010: 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69 74 65  ILE *out, sqlite
4020: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
4030: 72 20 2a 7a 53 65 6c 65 63 74 29 7b 0a 20 20 73  r *zSelect){.  s
4040: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
4050: 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lect;.  int rc;.
4060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
4070: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 65 6c 65  repare(db, zSele
4080: 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74  ct, -1, &pSelect
4090: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
40a0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53  SQLITE_OK || !pS
40b0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74  elect ){.    ret
40c0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63  urn rc;.  }.  rc
40d0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
40e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
40f0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
4100: 57 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  W ){.    fprintf
4110: 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73  (out, "%s;\n", s
4120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4130: 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 29 3b  xt(pSelect, 0));
4140: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4150: 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
4160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
4170: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
4180: 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Select);.}.../*.
4190: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66  ** This is a dif
41a0: 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20  ferent callback 
41b0: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72  routine used for
41c0: 20 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74   dumping the dat
41d0: 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72  abase..** Each r
41e0: 6f 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74  ow received by t
41f0: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e  his callback con
4200: 73 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65  sists of a table
4210: 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61   name,.** the ta
4220: 62 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78  ble type ("index
4230: 22 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e  " or "table") an
4240: 64 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20  d SQL to create 
4250: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
4260: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
4270: 64 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66  d print text suf
4280: 66 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65  ficient to recre
4290: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
42a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d  /.static int dum
42b0: 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  p_callback(void 
42c0: 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
42d0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
42e0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
42f0: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
4300: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
4310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
4320: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
4330: 2a 7a 53 71 6c 3b 0a 20 20 73 74 72 75 63 74 20  *zSql;.  struct 
4340: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
4350: 20 3d 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62   = (struct callb
4360: 61 63 6b 5f 64 61 74 61 20 2a 29 70 41 72 67 3b  ack_data *)pArg;
4370: 0a 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20  ..  if( nArg!=3 
4380: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54  ) return 1;.  zT
4390: 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b  able = azArg[0];
43a0: 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67  .  zType = azArg
43b0: 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a  [1];.  zSql = az
43c0: 41 72 67 5b 32 5d 3b 0a 20 20 0a 20 20 69 66 28  Arg[2];.  .  if(
43d0: 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
43e0: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
43f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ")==0 ){.    fpr
4400: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45  intf(p->out, "DE
4410: 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
4420: 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a  _sequence;\n");.
4430: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
4440: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
4450: 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29 7b  te_stat1")==0 ){
4460: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
4470: 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
4480: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
4490: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
44a0: 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
44b0: 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
44c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
44d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
44e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
44f0: 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d  ;\n", zSql);.  }
4500: 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ..  if( strcmp(z
4510: 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d  Type, "table")==
4520: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4530: 5f 73 74 6d 74 20 2a 70 54 61 62 6c 65 49 6e 66  _stmt *pTableInf
4540: 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  o = 0;.    char 
4550: 2a 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  *zSelect = 0;.  
4560: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 49 6e    char *zTableIn
4570: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  fo = 0;.    char
4580: 20 2a 7a 54 6d 70 20 3d 20 30 3b 0a 20 20 20 0a   *zTmp = 0;.   .
4590: 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d      zTableInfo =
45a0: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62   appendText(zTab
45b0: 6c 65 49 6e 66 6f 2c 20 22 50 52 41 47 4d 41 20  leInfo, "PRAGMA 
45c0: 74 61 62 6c 65 5f 69 6e 66 6f 28 22 2c 20 30 29  table_info(", 0)
45d0: 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f  ;.    zTableInfo
45e0: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54   = appendText(zT
45f0: 61 62 6c 65 49 6e 66 6f 2c 20 7a 54 61 62 6c 65  ableInfo, zTable
4600: 2c 20 27 22 27 29 3b 0a 20 20 20 20 7a 54 61 62  , '"');.    zTab
4610: 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54  leInfo = appendT
4620: 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20  ext(zTableInfo, 
4630: 22 29 3b 22 2c 20 30 29 3b 0a 0a 20 20 20 20 72  ");", 0);..    r
4640: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
4650: 61 72 65 28 70 2d 3e 64 62 2c 20 7a 54 61 62 6c  are(p->db, zTabl
4660: 65 49 6e 66 6f 2c 20 2d 31 2c 20 26 70 54 61 62  eInfo, -1, &pTab
4670: 6c 65 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20  leInfo, 0);.    
4680: 69 66 28 20 7a 54 61 62 6c 65 49 6e 66 6f 20 29  if( zTableInfo )
4690: 20 66 72 65 65 28 7a 54 61 62 6c 65 49 6e 66 6f   free(zTableInfo
46a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
46b0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 54 61  QLITE_OK || !pTa
46c0: 62 6c 65 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  bleInfo ){.     
46d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
46e0: 0a 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  ..    zSelect = 
46f0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
4700: 63 74 2c 20 22 53 45 4c 45 43 54 20 27 49 4e 53  ct, "SELECT 'INS
4710: 45 52 54 20 49 4e 54 4f 20 27 20 7c 7c 20 22 2c  ERT INTO ' || ",
4720: 20 30 29 3b 0a 20 20 20 20 7a 54 6d 70 20 3d 20   0);.    zTmp = 
4730: 61 70 70 65 6e 64 54 65 78 74 28 7a 54 6d 70 2c  appendText(zTmp,
4740: 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20   zTable, '"');. 
4750: 20 20 20 69 66 28 20 7a 54 6d 70 20 29 7b 0a 20     if( zTmp ){. 
4760: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
4770: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
4780: 74 2c 20 7a 54 6d 70 2c 20 27 5c 27 27 29 3b 0a  t, zTmp, '\'');.
4790: 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65 63      }.    zSelec
47a0: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
47b0: 53 65 6c 65 63 74 2c 20 22 20 7c 7c 20 27 20 56  Select, " || ' V
47c0: 41 4c 55 45 53 28 27 20 7c 7c 20 22 2c 20 30 29  ALUES(' || ", 0)
47d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
47e0: 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65 49 6e  e3_step(pTableIn
47f0: 66 6f 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  fo);.    while( 
4800: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
4810: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
4820: 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
4830: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
4840: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 54  3_column_text(pT
4850: 61 62 6c 65 49 6e 66 6f 2c 20 31 29 3b 0a 20 20  ableInfo, 1);.  
4860: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
4870: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
4880: 2c 20 22 71 75 6f 74 65 28 22 2c 20 30 29 3b 0a  , "quote(", 0);.
4890: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
48a0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
48b0: 63 74 2c 20 7a 54 65 78 74 2c 20 27 22 27 29 3b  ct, zText, '"');
48c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
48d0: 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65 49  te3_step(pTableI
48e0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
48f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
4900: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65 63  {.        zSelec
4910: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
4920: 53 65 6c 65 63 74 2c 20 22 29 20 7c 7c 20 27 2c  Select, ") || ',
4930: 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20   ' || ", 0);.   
4940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4950: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
4960: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
4970: 22 29 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ") ", 0);.      
4980: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
4990: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
49a0: 65 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  e(pTableInfo);. 
49b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
49c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
49d0: 28 20 7a 53 65 6c 65 63 74 20 29 20 66 72 65 65  ( zSelect ) free
49e0: 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  (zSelect);.     
49f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
4a00: 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61  .    zSelect = a
4a10: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
4a20: 74 2c 20 22 7c 7c 20 27 29 27 20 46 52 4f 4d 20  t, "|| ')' FROM 
4a30: 20 22 2c 20 30 29 3b 0a 20 20 20 20 7a 53 65 6c   ", 0);.    zSel
4a40: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
4a50: 28 7a 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65  (zSelect, zTable
4a60: 2c 20 27 22 27 29 3b 0a 0a 20 20 20 20 72 63 20  , '"');..    rc 
4a70: 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70  = run_table_dump
4a80: 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70  _query(p->out, p
4a90: 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 29 3b 0a  ->db, zSelect);.
4aa0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4ab0: 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
4ac0: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
4ad0: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
4ae0: 2c 20 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77  , " ORDER BY row
4af0: 69 64 20 44 45 53 43 22 2c 20 30 29 3b 0a 20 20  id DESC", 0);.  
4b00: 20 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61 62      rc = run_tab
4b10: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d  le_dump_query(p-
4b20: 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65  >out, p->db, zSe
4b30: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lect);.    }.   
4b40: 20 69 66 28 20 7a 53 65 6c 65 63 74 20 29 20 66   if( zSelect ) f
4b50: 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20  ree(zSelect);.  
4b60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4b70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
4b80: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4b90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4ba0: 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79  /*.** Run zQuery
4bb0: 2e 20 20 55 70 64 61 74 65 20 64 75 6d 70 5f 63  .  Update dump_c
4bc0: 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65  allback() as the
4bd0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
4be0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  e..** If we get 
4bf0: 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
4c00: 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
4c10: 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
4c20: 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
4c30: 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
4c40: 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
4c50: 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
4c60: 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
4c70: 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  (.  struct callb
4c80: 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20  ack_data *p, .  
4c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65  const char *zQue
4ca0: 72 79 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ry,.  char **pzE
4cb0: 72 72 4d 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72  rrMsg.){.  int r
4cc0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
4cd0: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
4ce0: 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
4cf0: 61 63 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67  ack, p, pzErrMsg
4d00: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4d10: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
4d20: 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
4d30: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
4d40: 65 6e 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  en(zQuery);.    
4d50: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 73  if( pzErrMsg ) s
4d60: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 45  qlite3_free(*pzE
4d70: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 51 32 20  rrMsg);.    zQ2 
4d80: 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30  = malloc( len+10
4d90: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32  0 );.    if( zQ2
4da0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
4db0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 51 32  .    sprintf(zQ2
4dc0: 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
4dd0: 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
4de0: 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
4df0: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
4e00: 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
4e10: 62 61 63 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73  back, p, pzErrMs
4e20: 67 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32  g);.    free(zQ2
4e30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4e40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  rc;.}../*.** Tex
4e50: 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73  t of a help mess
4e60: 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  age.*/.static ch
4e70: 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22  ar zHelp[] =.  "
4e80: 2e 64 61 74 61 62 61 73 65 73 20 20 20 20 20 20  .databases      
4e90: 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
4ea0: 73 20 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61  s and files of a
4eb0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4ec0: 73 5c 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54  s\n".  ".dump ?T
4ed0: 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44  ABLE? ...      D
4ee0: 75 6d 70 20 74 68 65 20 64 61 74 61 62 61 73 65  ump the database
4ef0: 20 69 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20   in an SQL text 
4f00: 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 2e 65 63  format\n".  ".ec
4f10: 68 6f 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  ho ON|OFF       
4f20: 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64      Turn command
4f30: 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c   echo on or off\
4f40: 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20  n".  ".exit     
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
4f60: 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
4f70: 22 0a 20 20 22 2e 65 78 70 6c 61 69 6e 20 4f 4e  ".  ".explain ON
4f80: 7c 4f 46 46 20 20 20 20 20 20 20 20 54 75 72 6e  |OFF        Turn
4f90: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 75 69   output mode sui
4fa0: 74 61 62 6c 65 20 66 6f 72 20 45 58 50 4c 41 49  table for EXPLAI
4fb0: 4e 20 6f 6e 20 6f 72 20 6f 66 66 2e 5c 6e 22 0a  N on or off.\n".
4fc0: 20 20 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e    ".header(s) ON
4fd0: 7c 4f 46 46 20 20 20 20 20 20 54 75 72 6e 20 64  |OFF      Turn d
4fe0: 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
4ff0: 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
5000: 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
5010: 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
5020: 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
5030: 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
5040: 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
5050: 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
5060: 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e  to TABLE\n".  ".
5070: 69 6e 64 69 63 65 73 20 54 41 42 4c 45 20 20 20  indices TABLE   
5080: 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
5090: 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20   of all indices 
50a0: 6f 6e 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e  on TABLE\n".  ".
50b0: 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45  mode MODE ?TABLE
50c0: 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70 75 74  ?     Set output
50d0: 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45   mode where MODE
50e0: 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20   is one of:\n". 
50f0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5100: 20 20 20 20 20 20 20 20 20 20 20 63 73 76 20 20             csv  
5110: 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61      Comma-separa
5120: 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ted values\n".  
5130: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5140: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
5150: 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20     Left-aligned 
5160: 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e  columns.  (See .
5170: 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20  width)\n".  "   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48        html     H
51a0: 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65  TML <table> code
51b0: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73  insert   SQL ins
51e0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66  ert statements f
51f0: 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20  or TABLE\n".  " 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20          line    
5220: 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c   One value per l
5230: 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ine\n".  "      
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75     list     Valu
5260: 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  es delimited by 
5270: 2e 73 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e  .separator strin
5280: 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 74 61 62 73 20 20 20 20 20 54 61 62 2d 73 65   tabs     Tab-se
52b0: 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e  parated values\n
52c0: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63                tc
52e0: 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20  l      TCL list 
52f0: 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e  elements\n".  ".
5300: 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47  nullvalue STRING
5310: 20 20 20 20 20 20 50 72 69 6e 74 20 53 54 52 49        Print STRI
5320: 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
5330: 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
5340: 22 2e 6f 75 74 70 75 74 20 46 49 4c 45 4e 41 4d  ".output FILENAM
5350: 45 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74  E       Send out
5360: 70 75 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c  put to FILENAME\
5370: 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 73 74  n".  ".output st
5380: 64 6f 75 74 20 20 20 20 20 20 20 20 20 53 65 6e  dout         Sen
5390: 64 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  d output to the 
53a0: 73 63 72 65 65 6e 5c 6e 22 0a 20 20 22 2e 70 72  screen\n".  ".pr
53b0: 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e  ompt MAIN CONTIN
53c0: 55 45 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  UE  Replace the 
53d0: 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73  standard prompts
53e0: 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20  \n".  ".quit    
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
5400: 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c  it this program\
5410: 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45  n".  ".read FILE
5420: 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45 78 65  NAME         Exe
5430: 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45  cute SQL in FILE
5440: 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 73 63 68 65  NAME\n".  ".sche
5450: 6d 61 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  ma ?TABLE?      
5460: 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
5470: 45 20 73 74 61 74 65 6d 65 6e 74 73 5c 6e 22 0a  E statements\n".
5480: 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 53 54    ".separator ST
5490: 52 49 4e 47 20 20 20 20 20 20 43 68 61 6e 67 65  RING      Change
54a0: 20 73 65 70 61 72 61 74 6f 72 20 75 73 65 64 20   separator used 
54b0: 62 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61  by output mode a
54c0: 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20 20  nd .import\n".  
54d0: 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20  ".show          
54e0: 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
54f0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
5500: 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74  for various sett
5510: 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 74 61 62 6c  ings\n".  ".tabl
5520: 65 73 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  es ?PATTERN?    
5530: 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20    List names of 
5540: 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
5550: 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 5c 6e  a LIKE pattern\n
5560: 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53  ".  ".timeout MS
5570: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20              Try 
5580: 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74  opening locked t
5590: 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c  ables for MS mil
55a0: 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22  liseconds\n".  "
55b0: 2e 77 69 64 74 68 20 4e 55 4d 20 4e 55 4d 20 2e  .width NUM NUM .
55c0: 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d  ..     Set colum
55d0: 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63  n widths for \"c
55e0: 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a  olumn\" mode\n".
55f0: 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;../* Forward re
5600: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5610: 63 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 69  c void process_i
5620: 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
5630: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
5640: 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
5650: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
5660: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
5670: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
5680: 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
5690: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
56a0: 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
56b0: 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
56c0: 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
56d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56e0: 6f 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63  open_db(struct c
56f0: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
5700: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
5710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5720: 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
5730: 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
5740: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5750: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
5760: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
5770: 68 65 6c 6c 73 74 61 74 69 63 22 2c 20 30 2c 20  hellstatic", 0, 
5780: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
5790: 20 20 20 20 20 20 20 20 73 68 65 6c 6c 73 74 61          shellsta
57a0: 74 69 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ticFunc, 0, 0);.
57b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
57c0: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
57d0: 64 65 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20  de(db) ){.      
57e0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
57f0: 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  Unable to open d
5800: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
5810: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
5820: 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
5830: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
5840: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 65 78 69  (db));.      exi
5850: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
5860: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61  }../*.** Do C-la
5870: 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71  nguage style deq
5880: 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  uoting..**.**   
5890: 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a   \t    -> tab.**
58a0: 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77      \n    -> new
58b0: 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 72 20 20 20  line.**    \r   
58c0: 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74   -> carriage ret
58d0: 75 72 6e 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20  urn.**    \NNN  
58e0: 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74  -> ascii charact
58f0: 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a  er NNN in octal.
5900: 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62  **    \\    -> b
5910: 61 63 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74 61 74  ackslash.*/.stat
5920: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f  ic void resolve_
5930: 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72  backslashes(char
5940: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *z){.  int i, j
5950: 2c 20 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  , c;.  for(i=j=0
5960: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
5970: 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
5980: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
5990: 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
59a0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e  .      if( c=='n
59b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
59c0: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
59d0: 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b  se if( c=='t' ){
59e0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74  .        c = '\t
59f0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
5a00: 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20  f( c=='r' ){.   
5a10: 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20       c = '\r';. 
5a20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
5a30: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20  >='0' && c<='7' 
5a40: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20  ){.        c -= 
5a50: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  '0';.        if(
5a60: 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
5a70: 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
5a80: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
5a90: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
5aa0: 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
5ab0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
5ac0: 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
5ad0: 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
5ae0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
5af0: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
5b00: 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
5b10: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
5b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5b30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
5b40: 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  = c;.  }.  z[j] 
5b50: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  = 0;.}../*.** If
5b60: 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62   an input line b
5b70: 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74  egins with "." t
5b80: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  hen invoke this 
5b90: 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72  routine to.** pr
5ba0: 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e  ocess that line.
5bb0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
5bc0: 74 6f 20 65 78 69 74 20 61 6e 64 20 30 20 74 6f  to exit and 0 to
5bd0: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73 74   continue..*/.st
5be0: 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61  atic int do_meta
5bf0: 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a  _command(char *z
5c00: 4c 69 6e 65 2c 20 73 74 72 75 63 74 20 63 61 6c  Line, struct cal
5c10: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29 7b 0a  lback_data *p){.
5c20: 20 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20 69    int i = 1;.  i
5c30: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69  nt nArg = 0;.  i
5c40: 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72  nt n, c;.  int r
5c50: 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61  c = 0;.  char *a
5c60: 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20  zArg[50];..  /* 
5c70: 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
5c80: 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
5c90: 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
5ca0: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72 67  zLine[i] && nArg
5cb0: 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
5cc0: 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
5cd0: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
5ce0: 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29  d char)zLine[i])
5cf0: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ i++; }.    i
5d00: 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30 20 29  f( zLine[i]==0 )
5d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
5d20: 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27 20 7c  zLine[i]=='\'' |
5d30: 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22 27 20  | zLine[i]=='"' 
5d40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c  ){.      int del
5d50: 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b  im = zLine[i++];
5d60: 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
5d70: 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d  g++] = &zLine[i]
5d80: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
5d90: 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65  Line[i] && zLine
5da0: 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 69 2b  [i]!=delim ){ i+
5db0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +; }.      if( z
5dc0: 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d 20 29  Line[i]==delim )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
5de0: 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  i++] = 0;.      
5df0: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
5e00: 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
5e10: 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
5e20: 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
5e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
5e40: 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
5e50: 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77  Line[i];.      w
5e60: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26  hile( zLine[i] &
5e70: 26 20 21 69 73 73 70 61 63 65 28 28 75 6e 73 69  & !isspace((unsi
5e80: 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b  gned char)zLine[
5e90: 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  i]) ){ i++; }.  
5ea0: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
5eb0: 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20   ) zLine[i++] = 
5ec0: 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65  0;.      resolve
5ed0: 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
5ee0: 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
5ef0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
5f00: 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c  cess the input l
5f10: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
5f20: 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nArg==0 ) return
5f30: 20 72 63 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65   rc;.  n = strle
5f40: 6e 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63  n(azArg[0]);.  c
5f50: 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a   = azArg[0][0];.
5f60: 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
5f70: 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
5f80: 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
5f90: 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ses", n)==0 ){. 
5fa0: 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61     struct callba
5fb0: 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20  ck_data data;.  
5fc0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
5fd0: 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
5fe0: 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (p);.    memcpy(
5ff0: 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
6000: 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
6010: 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31  a.showHeader = 1
6020: 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20  ;.    data.mode 
6030: 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
6040: 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
6050: 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61 74  [0] = 3;.    dat
6060: 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20  a.colWidth[1] = 
6070: 31 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c  15;.    data.col
6080: 57 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a 20  Width[2] = 58;. 
6090: 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b     data.cnt = 0;
60a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
60b0: 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
60c0: 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 20   database_list; 
60d0: 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  ", callback, &da
60e0: 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
60f0: 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
6100: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
6110: 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
6120: 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
6130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6140: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
6150: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
6160: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e  ( c=='d' && strn
6170: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
6180: 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ump", n)==0 ){. 
6190: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
61a0: 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
61b0: 62 28 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  b(p);.    fprint
61c0: 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e  f(p->out, "BEGIN
61d0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22   TRANSACTION;\n"
61e0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  );.    if( nArg=
61f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f  =1 ){.      run_
6200: 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
6210: 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53  y(p, .        "S
6220: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
6230: 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
6240: 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
6250: 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
6260: 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d  T NULL AND type=
6270: 3d 27 74 61 62 6c 65 27 22 2c 20 30 0a 20 20 20  ='table'", 0.   
6280: 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
6290: 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
62a0: 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53  y(p, .        "S
62b0: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
62c0: 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
62d0: 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
62e0: 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
62f0: 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 21  T NULL AND type!
6300: 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 74 79 70  ='table' AND typ
6310: 65 21 3d 27 6d 65 74 61 27 22 2c 20 30 0a 20 20  e!='meta'", 0.  
6320: 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
6330: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
6340: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
6350: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
6360: 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63      zShellStatic
6370: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
6380: 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
6390: 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
63a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
63b0: 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
63c0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
63d0: 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  er ".          "
63e0: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c  WHERE tbl_name L
63f0: 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
6400: 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  ) AND type=='tab
6410: 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20 20 22  le'".          "
6420: 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55    AND sql NOT NU
6430: 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
6440: 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
6450: 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
6460: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
6470: 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
6480: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
6490: 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52  .          "WHER
64a0: 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  E tbl_name LIKE 
64b0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e  shellstatic() AN
64c0: 44 20 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22  D type!='table'"
64d0: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
64e0: 44 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41  D type!='meta' A
64f0: 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
6500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  , 0);.        zS
6510: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
6520: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6530: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
6540: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
6550: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
6560: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
6570: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6580: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
6590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
65a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 43 4f  intf(p->out, "CO
65b0: 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  MMIT;\n");.    }
65c0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
65d0: 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
65e0: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68  p(azArg[0], "ech
65f0: 6f 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  o", n)==0 && nAr
6600: 67 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  g>1 ){.    int j
6610: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
6620: 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e  azArg[1];.    in
6630: 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a 41  t val = atoi(azA
6640: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28  rg[1]);.    for(
6650: 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b  j=0; z[j]; j++){
6660: 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 74 6f  .      z[j] = to
6670: 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20  lower((unsigned 
6680: 63 68 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20 20 20  char)z[j]);.    
6690: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
66a0: 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  (z,"on")==0 ){. 
66b0: 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20       val = 1;.  
66c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
66d0: 6d 70 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20 29  mp(z,"yes")==0 )
66e0: 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b  {.      val = 1;
66f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 65 63  .    }.    p->ec
6700: 68 6f 4f 6e 20 3d 20 76 61 6c 3b 0a 20 20 7d 65  hoOn = val;.  }e
6710: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
6720: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
6730: 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e  rg[0], "exit", n
6740: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6750: 20 31 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69   1;.  }else..  i
6760: 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
6770: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
6780: 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20  explain", n)==0 
6790: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
67a0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4f    static char zO
67b0: 6e 65 5b 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20  ne[] = "1";.    
67c0: 63 68 61 72 20 2a 7a 20 3d 20 6e 41 72 67 3e 3d  char *z = nArg>=
67d0: 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 7a  2 ? azArg[1] : z
67e0: 4f 6e 65 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  One;.    int val
67f0: 20 3d 20 61 74 6f 69 28 7a 29 3b 0a 20 20 20 20   = atoi(z);.    
6800: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a  for(j=0; z[j]; j
6810: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 5d 20  ++){.      z[j] 
6820: 3d 20 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67  = tolower((unsig
6830: 6e 65 64 20 63 68 61 72 29 7a 5b 6a 5d 29 3b 0a  ned char)z[j]);.
6840: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
6850: 72 63 6d 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20  rcmp(z,"on")==0 
6860: 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31  ){.      val = 1
6870: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6880: 73 74 72 63 6d 70 28 7a 2c 22 79 65 73 22 29 3d  strcmp(z,"yes")=
6890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 61 6c 20  =0 ){.      val 
68a0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
68b0: 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20  f(val == 1) {.  
68c0: 20 20 20 20 69 66 28 21 70 2d 3e 65 78 70 6c 61      if(!p->expla
68d0: 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a  inPrev.valid) {.
68e0: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61          p->expla
68f0: 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 31  inPrev.valid = 1
6900: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70  ;.        p->exp
6910: 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65 20 3d 20  lainPrev.mode = 
6920: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  p->mode;.       
6930: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
6940: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e  showHeader = p->
6950: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
6960: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 65 78      memcpy(p->ex
6970: 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c 57 69 64  plainPrev.colWid
6980: 74 68 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 73  th,p->colWidth,s
6990: 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74  izeof(p->colWidt
69a0: 68 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h));.      }.   
69b0: 20 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 70     /* We could p
69c0: 75 74 20 74 68 69 73 20 63 6f 64 65 20 75 6e 64  ut this code und
69d0: 65 72 20 74 68 65 20 21 70 2d 3e 65 78 70 6c 61  er the !p->expla
69e0: 69 6e 56 61 6c 69 64 0a 20 20 20 20 20 20 2a 2a  inValid.      **
69f0: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 74 68   condition so th
6a00: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  at it does not e
6a10: 78 65 63 75 74 65 20 69 66 20 77 65 20 61 72 65  xecute if we are
6a20: 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 20 20   already in.    
6a30: 20 20 2a 2a 20 65 78 70 6c 61 69 6e 20 6d 6f 64    ** explain mod
6a40: 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 6c 77 61  e. However, alwa
6a50: 79 73 20 65 78 65 63 75 74 69 6e 67 20 69 74 20  ys executing it 
6a60: 61 6c 6c 6f 77 73 20 75 73 20 61 6e 20 65 61 73  allows us an eas
6a70: 79 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  y.      ** was t
6a80: 6f 20 72 65 73 65 74 20 74 6f 20 65 78 70 6c 61  o reset to expla
6a90: 69 6e 20 6d 6f 64 65 20 69 6e 20 63 61 73 65 20  in mode in case 
6aa0: 74 68 65 20 75 73 65 72 20 70 72 65 76 69 6f 75  the user previou
6ab0: 73 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 64  sly.      ** did
6ac0: 20 61 6e 20 2e 65 78 70 6c 61 69 6e 20 66 6f 6c   an .explain fol
6ad0: 6c 6f 77 65 64 20 62 79 20 61 20 2e 77 69 64 74  lowed by a .widt
6ae0: 68 2c 20 2e 6d 6f 64 65 20 6f 72 20 2e 68 65 61  h, .mode or .hea
6af0: 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  der.      ** com
6b00: 6d 61 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mand..      */. 
6b10: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
6b20: 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
6b30: 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
6b40: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 1;.      memse
6b50: 74 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 30 2c  t(p->colWidth,0,
6b60: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
6b70: 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20 20 70  Width));.      p
6b80: 2d 3e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20  ->colWidth[0] = 
6b90: 34 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  4;.      p->colW
6ba0: 69 64 74 68 5b 31 5d 20 3d 20 31 34 3b 0a 20 20  idth[1] = 14;.  
6bb0: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
6bc0: 32 5d 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 70  2] = 10;.      p
6bd0: 2d 3e 63 6f 6c 57 69 64 74 68 5b 33 5d 20 3d 20  ->colWidth[3] = 
6be0: 31 30 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  10;.      p->col
6bf0: 57 69 64 74 68 5b 34 5d 20 3d 20 33 33 3b 0a 20  Width[4] = 33;. 
6c00: 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e     }else if (p->
6c10: 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69  explainPrev.vali
6c20: 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  d) {.      p->ex
6c30: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
6c40: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  = 0;.      p->mo
6c50: 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50  de = p->explainP
6c60: 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rev.mode;.      
6c70: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
6c80: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73  p->explainPrev.s
6c90: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
6ca0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69   memcpy(p->colWi
6cb0: 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72  dth,p->explainPr
6cc0: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  ev.colWidth,size
6cd0: 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
6cf0: 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
6d00: 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
6d10: 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29  0], "header", n)
6d20: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
6d30: 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20       ||.        
6d40: 20 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70           strncmp
6d50: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
6d60: 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 26 26 20  ers", n)==0 )&& 
6d70: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 69 6e  nArg>1 ){.    in
6d80: 74 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  t j;.    char *z
6d90: 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
6da0: 20 69 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28   int val = atoi(
6db0: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
6dc0: 6f 72 28 6a 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b  or(j=0; z[j]; j+
6dd0: 2b 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  +){.      z[j] =
6de0: 20 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e   tolower((unsign
6df0: 65 64 20 63 68 61 72 29 7a 5b 6a 5d 29 3b 0a 20  ed char)z[j]);. 
6e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
6e10: 63 6d 70 28 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29  cmp(z,"on")==0 )
6e20: 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b  {.      val = 1;
6e30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6e40: 74 72 63 6d 70 28 7a 2c 22 79 65 73 22 29 3d 3d  trcmp(z,"yes")==
6e50: 30 20 29 7b 0a 20 20 20 20 20 20 76 61 6c 20 3d  0 ){.      val =
6e60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   1;.    }.    p-
6e70: 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 76 61  >showHeader = va
6e80: 6c 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  l;.  }else..  if
6e90: 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
6ea0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
6eb0: 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  elp", n)==0 ){. 
6ec0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
6ed0: 72 2c 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73  r,zHelp);.  }els
6ee0: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  e..  if( c=='i' 
6ef0: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
6f00: 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e  [0], "import", n
6f10: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 33 20  )==0 && nArg>=3 
6f20: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61  ){.    char *zTa
6f30: 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20  ble = azArg[2]; 
6f40: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
6f50: 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
6f60: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
6f70: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
6f80: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
6f90: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
6fa0: 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
6fb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
6fc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
6fd0: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
6fe0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
7010: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7040: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
7050: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
7060: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7070: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7080: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
7090: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
70a0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
70c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
70d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7100: 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65 70 61  bytes in p->sepa
7110: 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63  rator[] */.    c
7120: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
7130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
7140: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
7150: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
7160: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7170: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
7180: 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
7190: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
71a0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
71c0: 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
71d0: 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
71e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d  /.    char *zCom
71f0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
7200: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
7210: 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 20 20 20  it changes */   
7220: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
7250: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
7260: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
7270: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
7280: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
7290: 6c 65 20 2a 2f 0a 0a 20 20 20 20 6e 53 65 70 20  le */..    nSep 
72a0: 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 73 65 70 61  = strlen(p->sepa
72b0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  rator);.    if( 
72c0: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
72d0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
72e0: 20 22 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72   "non-null separ
72f0: 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
7300: 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20  r import\n");.  
7310: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7320: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
7330: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
7340: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
7350: 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
7360: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
7370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6e 42  return 0;.    nB
7380: 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71  yte = strlen(zSq
7390: 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l);.    rc = sql
73a0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
73b0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
73c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
73d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
73e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
73f0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
7400: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
7410: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
7420: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 6e  sg(db));.      n
7430: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Col = 0;.    }el
7440: 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  se{.      nCol =
7450: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7460: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
7470: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7480: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
7490: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
74a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
74b0: 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20   zSql = malloc( 
74c0: 6e 42 79 74 65 20 2b 20 32 30 20 2b 20 6e 43 6f  nByte + 20 + nCo
74d0: 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
74e0: 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
74f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
7500: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30  nprintf(nByte+20
7510: 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
7520: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
7530: 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
7540: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71    j = strlen(zSq
7550: 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
7560: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
7570: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
7580: 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
7590: 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
75a0: 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
75b0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
75c0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
75d0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
75e0: 65 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  e(p->db, zSql, -
75f0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
7600: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
7610: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7620: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7630: 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
7640: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7650: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  (db));.      sql
7660: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
7670: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
7680: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7690: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
76a0: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
76b0: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
76c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
76d0: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
76e0: 65 3a 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 29  e: %s\n", zFile)
76f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7700: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
7710: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7720: 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
7730: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
7740: 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
7750: 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
7760: 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
7770: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
7780: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7790: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
77a0: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47  exec(p->db, "BEG
77b0: 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
77c0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f     zCommit = "CO
77d0: 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65  MMIT";.    while
77e0: 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c  ( (zLine = local
77f0: 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29  _getline(0, in))
7800: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  !=0 ){.      cha
7810: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20  r *z;.      i = 
7820: 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  0;.      lineno+
7830: 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
7840: 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
7850: 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
7860: 65 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e  e; *z && *z!='\n
7870: 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a  ' && *z!='\r'; z
7880: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
7890: 20 2a 7a 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f   *z==p->separato
78a0: 72 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  r[0] && strncmp(
78b0: 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c  z, p->separator,
78c0: 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20   nSep)==0 ){.   
78d0: 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20         *z = 0;. 
78e0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
78f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
7900: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
7910: 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b    azCol[i] = &z[
7920: 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  nSep];.         
7930: 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a     z += nSep-1;.
7940: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7950: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7960: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
7970: 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20    if( i+1!=nCol 
7980: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
7990: 74 66 28 73 74 64 65 72 72 2c 22 25 73 20 6c 69  tf(stderr,"%s li
79a0: 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20  ne %d: expected 
79b0: 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  %d columns of da
79c0: 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 5c  ta but found %d\
79d0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
79e0: 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43  File, lineno, nC
79f0: 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
7a00: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
7a10: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
7a20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7a30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7a40: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
7a60: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
7a70: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
7a80: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7aa0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
7ab0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
7ac0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
7ad0: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
7ae0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
7af0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7b00: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
7b10: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
7b20: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
7b30: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
7b40: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
7b50: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
7b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7b70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
7b80: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
7b90: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
7ba0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
7bb0: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
7bc0: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43  3_exec(p->db, zC
7bd0: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
7be0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
7bf0: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
7c00: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
7c10: 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20  ices", n)==0 && 
7c20: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 73 74  nArg>1 ){.    st
7c30: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
7c40: 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
7c50: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
7c60: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
7c70: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
7c80: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
7c90: 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
7ca0: 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
7cb0: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
7cc0: 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7a 53 68 65  E_List;.    zShe
7cd0: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
7ce0: 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [1];.    sqlite3
7cf0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
7d00: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
7d10: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
7d20: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
7d30: 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
7d40: 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  ND tbl_name LIKE
7d50: 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22   shellstatic() "
7d60: 0a 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c  .      "UNION AL
7d70: 4c 20 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43  L ".      "SELEC
7d80: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
7d90: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22  te_temp_master "
7da0: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79  .      "WHERE ty
7db0: 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
7dc0: 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65  bl_name LIKE she
7dd0: 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20 20  llstatic() ".   
7de0: 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c     "ORDER BY 1",
7df0: 0a 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c  .      callback,
7e00: 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
7e10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 68 65  .    );.    zShe
7e20: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20  llStatic = 0;.  
7e30: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
7e40: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
7e50: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
7e60: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
7e70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7e80: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
7e90: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
7ea0: 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63   c=='m' && strnc
7eb0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f  mp(azArg[0], "mo
7ec0: 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  de", n)==0 && nA
7ed0: 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  rg>=2 ){.    int
7ee0: 20 6e 32 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41   n2 = strlen(azA
7ef0: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
7f00: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
7f10: 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d 3d 30 0a 20  ,"line",n2)==0. 
7f20: 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20         ||.      
7f30: 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b    strncmp(azArg[
7f40: 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d  1],"lines",n2)==
7f50: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
7f60: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a  de = MODE_Line;.
7f70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7f80: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
7f90: 63 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 0a 20  column",n2)==0. 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 0a               ||.
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
7fc0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
7fd0: 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
7fe0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
7ff0: 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
8000: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
8010: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
8020: 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
8030: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
8040: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
8050: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
8060: 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22  (azArg[1],"html"
8070: 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
8080: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
8090: 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Html;.    }else 
80a0: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
80b0: 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d  g[1],"tcl",n2)==
80c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
80d0: 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20  de = MODE_Tcl;. 
80e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
80f0: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
8100: 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
8110: 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
8120: 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 74  DE_Csv;.      st
8130: 72 63 70 79 28 70 2d 3e 73 65 70 61 72 61 74 6f  rcpy(p->separato
8140: 72 2c 20 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c  r, ",");.    }el
8150: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61  se if( strncmp(a
8160: 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e  zArg[1],"tabs",n
8170: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
8180: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
8190: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79  st;.      strcpy
81a0: 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22  (p->separator, "
81b0: 5c 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  \t");.    }else 
81c0: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
81d0: 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32  g[1],"insert",n2
81e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
81f0: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  >mode = MODE_Ins
8200: 65 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ert;.      if( n
8210: 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
8220: 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
8230: 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  (p, azArg[2]);. 
8240: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8250: 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61      set_table_na
8260: 6d 65 28 70 2c 20 22 74 61 62 6c 65 22 29 3b 0a  me(p, "table");.
8270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8280: 65 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  e {.      fprint
8290: 66 28 73 74 64 65 72 72 2c 22 6d 6f 64 65 20 73  f(stderr,"mode s
82a0: 68 6f 75 6c 64 20 62 65 20 6f 6e 20 6f 66 3a 20  hould be on of: 
82b0: 22 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75  ".         "colu
82c0: 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65  mn csv html inse
82d0: 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61 62  rt line list tab
82e0: 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d  s tcl\n");.    }
82f0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
8300: 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d  c=='n' && strncm
8310: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c  p(azArg[0], "nul
8320: 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 26  lvalue", n)==0 &
8330: 26 20 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20 20  & nArg==2 ) {.  
8340: 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 6e 75 6c    sprintf(p->nul
8350: 6c 76 61 6c 75 65 2c 20 22 25 2e 2a 73 22 2c 20  lvalue, "%.*s", 
8360: 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
8370: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20  ->nullvalue)-1, 
8380: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c  azArg[1]);.  }el
8390: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27  se..  if( c=='o'
83a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
83b0: 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20  g[0], "output", 
83c0: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32  n)==0 && nArg==2
83d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
83e0: 75 74 21 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20  ut!=stdout ){.  
83f0: 20 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e 6f 75      fclose(p->ou
8400: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
8410: 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
8420: 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29  ],"stdout")==0 )
8430: 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  {.      p->out =
8440: 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 73   stdout;.      s
8450: 74 72 63 70 79 28 70 2d 3e 6f 75 74 66 69 6c 65  trcpy(p->outfile
8460: 2c 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20  ,"stdout");.    
8470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
8480: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  out = fopen(azAr
8490: 67 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20  g[1], "wb");.   
84a0: 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
84b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
84c0: 6e 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27  ntf(stderr,"can'
84d0: 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c  t write to \"%s\
84e0: 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
84f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
8500: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
8510: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
8520: 20 20 73 74 72 63 70 79 28 70 2d 3e 6f 75 74 66    strcpy(p->outf
8530: 69 6c 65 2c 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ile,azArg[1]);. 
8540: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8550: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
8560: 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  p' && strncmp(az
8570: 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22  Arg[0], "prompt"
8580: 2c 20 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72 67  , n)==0 && (nArg
8590: 3d 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29 29  ==2 || nArg==3))
85a0: 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  {.    if( nArg >
85b0: 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 2) {.      str
85c0: 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c  ncpy(mainPrompt,
85d0: 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72  azArg[1],(int)Ar
85e0: 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d  raySize(mainProm
85f0: 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
8600: 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29    if( nArg >= 3)
8610: 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
8620: 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c  (continuePrompt,
8630: 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72  azArg[2],(int)Ar
8640: 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65  raySize(continue
8650: 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
8660: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
8670: 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63   c=='q' && strnc
8680: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75  mp(azArg[0], "qu
8690: 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
86a0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73    rc = 1;.  }els
86b0: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
86c0: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
86d0: 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d  [0], "read", n)=
86e0: 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b  =0 && nArg==2 ){
86f0: 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 20 3d  .    FILE *alt =
8700: 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
8710: 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
8720: 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  alt==0 ){.      
8730: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
8740: 63 61 6e 27 74 20 6f 70 65 6e 20 5c 22 25 73 5c  can't open \"%s\
8750: 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
8760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8770: 20 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28    process_input(
8780: 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66  p, alt);.      f
8790: 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20  close(alt);.    
87a0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
87b0: 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
87c0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
87d0: 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
87e0: 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62      struct callb
87f0: 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
8800: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
8810: 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
8820: 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  b(p);.    memcpy
8830: 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
8840: 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
8850: 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
8860: 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  0;.    data.mode
8870: 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
8880: 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
8890: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
88a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72     for(i=0; azAr
88b0: 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a  g[1][i]; i++) az
88c0: 41 72 67 5b 31 5d 5b 69 5d 20 3d 20 74 6f 6c 6f  Arg[1][i] = tolo
88d0: 77 65 72 28 61 7a 41 72 67 5b 31 5d 5b 69 5d 29  wer(azArg[1][i])
88e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
88f0: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c  mp(azArg[1],"sql
8900: 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20  ite_master")==0 
8910: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8920: 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e  *new_argv[2], *n
8930: 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20  ew_colv[2];.    
8940: 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20      new_argv[0] 
8950: 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  = "CREATE TABLE 
8960: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 5c  sqlite_master (\
8970: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
8980: 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
8990: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
89c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89d0: 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
89e0: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
8a10: 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20       ")";.      
8a60: 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20    new_argv[1] = 
8a70: 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  0;.        new_c
8a80: 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a  olv[0] = "sql";.
8a90: 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
8aa0: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
8ab0: 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c   callback(&data,
8ac0: 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65   1, new_argv, ne
8ad0: 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 7d  w_colv);.      }
8ae0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8af0: 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65  azArg[1],"sqlite
8b00: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d  _temp_master")==
8b10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
8b20: 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
8b30: 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
8b40: 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
8b50: 5d 20 3d 20 22 43 52 45 41 54 45 20 54 45 4d 50  ] = "CREATE TEMP
8b60: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65   TABLE sqlite_te
8b70: 6d 70 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  mp_master (\n". 
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
8ba0: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
8bc0: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8be0: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
8bf0: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
8c10: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
8c20: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
8c40: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
8c70: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
8c80: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
8c90: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
8ca0: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
8cb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
8cc0: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
8cd0: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
8ce0: 6c 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lv);.      }else
8cf0: 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  {.        zShell
8d00: 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31  Static = azArg[1
8d10: 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
8d20: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
8d30: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
8d40: 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20 20   sql FROM ".    
8d50: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
8d60: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
8d70: 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22  aster UNION ALL"
8d80: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 53  .          "   S
8d90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
8da0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
8db0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48   ".          "WH
8dc0: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  ERE tbl_name LIK
8dd0: 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
8de0: 41 4e 44 20 74 79 70 65 21 3d 27 6d 65 74 61 27  AND type!='meta'
8df0: 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c   AND sql NOTNULL
8e00: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52   ".          "OR
8e10: 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74 79  DER BY substr(ty
8e20: 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a  pe,2,1), name",.
8e30: 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
8e40: 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
8e50: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  Msg);.        zS
8e60: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
8e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8e80: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8e90: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
8ea0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
8eb0: 6c 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20  l FROM ".       
8ec0: 20 20 22 20 20 28 53 45 4c 45 43 54 20 2a 20 46    "  (SELECT * F
8ed0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
8ee0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
8ef0: 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54        "   SELECT
8f00: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74   * FROM sqlite_t
8f10: 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
8f20: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
8f30: 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73  pe!='meta' AND s
8f40: 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e  ql NOTNULL AND n
8f50: 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
8f60: 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20 20  lite_%'".       
8f70: 20 20 22 4f 52 44 45 52 20 42 59 20 73 75 62 73    "ORDER BY subs
8f80: 74 72 28 74 79 70 65 2c 32 2c 31 29 2c 20 6e 61  tr(type,2,1), na
8f90: 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 63 61  me",.         ca
8fa0: 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
8fb0: 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b  zErrMsg.      );
8fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
8fd0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
8fe0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
8ff0: 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
9000: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
9010: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
9020: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  sg);.    }.  }el
9030: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
9040: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
9050: 67 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72  g[0], "separator
9060: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
9070: 3d 3d 32 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  ==2 ){.    sprin
9080: 74 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c  tf(p->separator,
9090: 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
90a0: 72 61 79 53 69 7a 65 28 70 2d 3e 73 65 70 61 72  raySize(p->separ
90b0: 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31  ator)-1, azArg[1
90c0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ]);.  }else..  i
90d0: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
90e0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
90f0: 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 29 7b 0a 20  show", n)==0){. 
9100: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 70     int i;.    fp
9110: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
9120: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f  .9s: %s\n","echo
9130: 22 2c 20 70 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22  ", p->echoOn ? "
9140: 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20  on" : "off");.  
9150: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
9160: 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22  ,"%9.9s: %s\n","
9170: 65 78 70 6c 61 69 6e 22 2c 20 70 2d 3e 65 78 70  explain", p->exp
9180: 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3f  lainPrev.valid ?
9190: 20 22 6f 6e 22 20 3a 22 6f 66 66 22 29 3b 0a 20   "on" :"off");. 
91a0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
91b0: 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c  t,"%9.9s: %s\n",
91c0: 22 68 65 61 64 65 72 73 22 2c 20 70 2d 3e 73 68  "headers", p->sh
91d0: 6f 77 48 65 61 64 65 72 20 3f 20 22 6f 6e 22 20  owHeader ? "on" 
91e0: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
91f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
9200: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64 65  .9s: %s\n","mode
9210: 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e  ", modeDescr[p->
9220: 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 66 70 72 69  mode]);.    fpri
9230: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
9240: 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  s: ", "nullvalue
9250: 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
9260: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
9270: 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b  , p->nullvalue);
9280: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
9290: 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
92a0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
92b0: 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22  ,"%9.9s: %s\n","
92c0: 6f 75 74 70 75 74 22 2c 0a 20 20 20 20 20 20 20  output",.       
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
92f0: 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70  (p->outfile) ? p
9300: 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73 74 64  ->outfile : "std
9310: 6f 75 74 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  out");.    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 22 2c 20 22 73 65 70 61 72 61 74 6f 72 22  : ", "separator"
9340: 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  );.      output_
9350: 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
9360: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a   p->separator);.
9370: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
9380: 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
9390: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
93a0: 22 25 39 2e 39 73 3a 20 22 2c 22 77 69 64 74 68  "%9.9s: ","width
93b0: 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30  ");.    for (i=0
93c0: 3b 69 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  ;i<(int)ArraySiz
93d0: 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26  e(p->colWidth) &
93e0: 26 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d  & p->colWidth[i]
93f0: 20 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20   != 0;i++) {.   
9400: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
9410: 74 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c 57 69  t,"%d ",p->colWi
9420: 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  dth[i]);.    }. 
9430: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
9440: 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  t,"\n");.  }else
9450: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
9460: 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  & n>1 && strncmp
9470: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c  (azArg[0], "tabl
9480: 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
9490: 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c    char **azResul
94a0: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c  t;.    int nRow,
94b0: 20 72 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   rc;.    char *z
94c0: 45 72 72 4d 73 67 3b 0a 20 20 20 20 6f 70 65 6e  ErrMsg;.    open
94d0: 5f 64 62 28 70 29 3b 0a 20 20 20 20 69 66 28 20  _db(p);.    if( 
94e0: 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nArg==1 ){.     
94f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65   rc = sqlite3_ge
9500: 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20  t_table(p->db,. 
9510: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
9520: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
9530: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
9540: 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e 20   "WHERE type IN 
9550: 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29  ('table','view')
9560: 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
9570: 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20  KE 'sqlite_%'". 
9580: 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c         "UNION AL
9590: 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c  L ".        "SEL
95a0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
95b0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
95c0: 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
95d0: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
95e0: 65 27 2c 27 76 69 65 77 27 29 20 22 0a 20 20 20  e','view') ".   
95f0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31       "ORDER BY 1
9600: 22 2c 0a 20 20 20 20 20 20 20 20 26 61 7a 52 65  ",.        &azRe
9610: 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20  sult, &nRow, 0, 
9620: 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29  &zErrMsg.      )
9630: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9640: 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20     zShellStatic 
9650: 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
9660: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
9670: 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a  et_table(p->db,.
9680: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9690: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
96a0: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
96b0: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
96c0: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
96d0: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
96e0: 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61 74 69 63  '%'||shellstatic
96f0: 28 29 7c 7c 27 25 27 20 22 0a 20 20 20 20 20 20  ()||'%' ".      
9700: 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
9710: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
9720: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
9730: 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20  temp_master ".  
9740: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
9750: 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76  e IN ('table','v
9760: 69 65 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c  iew') AND name L
9770: 49 4b 45 20 27 25 27 7c 7c 73 68 65 6c 6c 73 74  IKE '%'||shellst
9780: 61 74 69 63 28 29 7c 7c 27 25 27 20 22 0a 20 20  atic()||'%' ".  
9790: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
97a0: 31 22 2c 0a 20 20 20 20 20 20 20 20 26 61 7a 52  1",.        &azR
97b0: 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c  esult, &nRow, 0,
97c0: 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
97d0: 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  );.      zShellS
97e0: 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d  tatic = 0;.    }
97f0: 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
9800: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
9810: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
9820: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
9830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9840: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
9850: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
9860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9870: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78      int len, max
9880: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  len = 0;.      i
9890: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69  nt i, j;.      i
98a0: 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50  nt nPrintCol, nP
98b0: 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66  rintRow;.      f
98c0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b  or(i=1; i<=nRow;
98d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
98e0: 66 28 20 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d  f( azResult[i]==
98f0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9900: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
9910: 65 6e 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b  en(azResult[i]);
9920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
9930: 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
9940: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a   = len;.      }.
9950: 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20        nPrintCol 
9960: 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b  = 80/(maxlen+2);
9970: 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69 6e  .      if( nPrin
9980: 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43  tCol<1 ) nPrintC
9990: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50  ol = 1;.      nP
99a0: 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20  rintRow = (nRow 
99b0: 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29  + nPrintCol - 1)
99c0: 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20  /nPrintCol;.    
99d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72    for(i=0; i<nPr
99e0: 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  intRow; i++){.  
99f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b        for(j=i+1;
9a00: 20 6a 3c 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72   j<=nRow; j+=nPr
9a10: 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20  intRow){.       
9a20: 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a     char *zSp = j
9a30: 3c 3d 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22  <=nPrintRow ? ""
9a40: 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20   : "  ";.       
9a50: 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 2d 2a     printf("%s%-*
9a60: 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c  s", zSp, maxlen,
9a70: 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61   azResult[j] ? a
9a80: 7a 52 65 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29  zResult[j] : "")
9a90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9aa0: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
9ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9ad0: 5f 74 61 62 6c 65 28 61 7a 52 65 73 75 6c 74 29  _table(azResult)
9ae0: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
9af0: 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26   c=='t' && n>1 &
9b00: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
9b10: 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e  0], "timeout", n
9b20: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20  )==0 && nArg>=2 
9b30: 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
9b40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
9b50: 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64  usy_timeout(p->d
9b60: 62 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d  b, atoi(azArg[1]
9b70: 29 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ));.  }else..  i
9b80: 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72  f( c=='w' && str
9b90: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
9ba0: 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  width", n)==0 ){
9bb0: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
9bc0: 61 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72  assert( nArg<=Ar
9bd0: 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
9be0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
9bf0: 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79  <nArg && j<Array
9c00: 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
9c10: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); j++){.      p
9c20: 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20  ->colWidth[j-1] 
9c30: 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 6a 5d 29  = atoi(azArg[j])
9c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
9c50: 0a 20 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  .  {.    fprintf
9c60: 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
9c70: 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e 76  n command or inv
9c80: 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a 20  alid arguments: 
9c90: 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22  ".      " \"%s\"
9ca0: 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c  . Enter \".help\
9cb0: 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61  " for help\n", a
9cc0: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20  zArg[0]);.  }.. 
9cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
9cf0: 20 69 66 20 74 68 65 20 6c 61 73 74 20 6e 6f 6e   if the last non
9d00: 2d 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72  -whitespace char
9d10: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 69 73 20  acter in z[] is 
9d20: 61 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 20  a semicolon..** 
9d30: 7a 5b 5d 20 69 73 20 4e 20 63 68 61 72 61 63 74  z[] is N charact
9d40: 65 72 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ers long..*/.sta
9d50: 74 69 63 20 69 6e 74 20 5f 65 6e 64 73 5f 77 69  tic int _ends_wi
9d60: 74 68 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f 6e  th_semicolon(con
9d70: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
9d80: 4e 29 7b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30  N){.  while( N>0
9d90: 20 26 26 20 69 73 73 70 61 63 65 28 28 75 6e 73   && isspace((uns
9da0: 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 4e 2d 31  igned char)z[N-1
9db0: 5d 29 20 29 7b 20 4e 2d 2d 3b 20 7d 0a 20 20 72  ]) ){ N--; }.  r
9dc0: 65 74 75 72 6e 20 4e 3e 30 20 26 26 20 7a 5b 4e  eturn N>0 && z[N
9dd0: 2d 31 5d 3d 3d 27 3b 27 3b 0a 7d 0a 0a 2f 2a 0a  -1]==';';.}../*.
9de0: 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 69  ** Test to see i
9df0: 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73 69 73 74  f a line consist
9e00: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77 68  s entirely of wh
9e10: 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  itespace..*/.sta
9e20: 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f 77 68 69  tic int _all_whi
9e30: 74 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68  tespace(const ch
9e40: 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72 28 3b 20  ar *z){.  for(; 
9e50: 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  *z; z++){.    if
9e60: 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69  ( isspace(*(unsi
9e70: 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 20 29 20  gned char*)z) ) 
9e80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
9e90: 28 20 2a 7a 3d 3d 27 2f 27 20 26 26 20 7a 5b 31  ( *z=='/' && z[1
9ea0: 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  ]=='*' ){.      
9eb0: 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68  z += 2;.      wh
9ec0: 69 6c 65 28 20 2a 7a 20 26 26 20 28 2a 7a 21 3d  ile( *z && (*z!=
9ed0: 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2f 27  '*' || z[1]!='/'
9ee0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
9ef0: 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65    if( *z==0 ) re
9f00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b  turn 0;.      z+
9f10: 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
9f20: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
9f30: 20 2a 7a 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d   *z=='-' && z[1]
9f40: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='-' ){.      z
9f50: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69   += 2;.      whi
9f60: 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
9f70: 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  n' ){ z++; }.   
9f80: 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 72     if( *z==0 ) r
9f90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 63  eturn 1;.      c
9fa0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
9fb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9fc0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
9fd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
9fe0: 45 20 69 66 20 74 68 65 20 6c 69 6e 65 20 74 79  E if the line ty
9ff0: 70 65 64 20 69 6e 20 69 73 20 61 6e 20 53 51 4c  ped in is an SQL
a000: 20 63 6f 6d 6d 61 6e 64 20 74 65 72 6d 69 6e 61   command termina
a010: 74 6f 72 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  tor other.** tha
a020: 6e 20 61 20 73 65 6d 69 2d 63 6f 6c 6f 6e 2e 20  n a semi-colon. 
a030: 20 54 68 65 20 53 51 4c 20 53 65 72 76 65 72 20   The SQL Server 
a040: 73 74 79 6c 65 20 22 67 6f 22 20 63 6f 6d 6d 61  style "go" comma
a050: 6e 64 20 69 73 20 75 6e 64 65 72 73 74 6f 6f 64  nd is understood
a060: 0a 2a 2a 20 61 73 20 69 73 20 74 68 65 20 4f 72  .** as is the Or
a070: 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f 0a 73 74 61  acle "/"..*/.sta
a080: 74 69 63 20 69 6e 74 20 5f 69 73 5f 63 6f 6d 6d  tic int _is_comm
a090: 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72 28 63  and_terminator(c
a0a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65  onst char *zLine
a0b0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  ){.  while( issp
a0c0: 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64 20 63  ace(*(unsigned c
a0d0: 68 61 72 2a 29 7a 4c 69 6e 65 29 20 29 7b 20 7a  har*)zLine) ){ z
a0e0: 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28  Line++; };.  if(
a0f0: 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26   zLine[0]=='/' &
a100: 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  & _all_whitespac
a110: 65 28 26 7a 4c 69 6e 65 5b 31 5d 29 20 29 20 72  e(&zLine[1]) ) r
a120: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
a130: 63 6c 65 20 2a 2f 0a 20 20 69 66 28 20 74 6f 6c  cle */.  if( tol
a140: 6f 77 65 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d  ower(zLine[0])==
a150: 27 67 27 20 26 26 20 74 6f 6c 6f 77 65 72 28 7a  'g' && tolower(z
a160: 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20  Line[1])=='o'.  
a170: 20 20 20 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77         && _all_w
a180: 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65  hitespace(&zLine
a190: 5b 32 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [2]) ){.    retu
a1a0: 72 6e 20 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65  rn 1;  /* SQL Se
a1b0: 72 76 65 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  rver */.  }.  re
a1c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
a1d0: 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
a1e0: 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73 73   *in and process
a1f0: 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30 20   it.  If *in==0 
a200: 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69 73  then input.** is
a210: 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20 74   interactive - t
a220: 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69 6e  he user is typin
a230: 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72 77  g it it.  Otherw
a240: 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73  ise, input.** is
a250: 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 66   coming from a f
a260: 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20 20  ile or device.  
a270: 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73 75  A prompt is issu
a280: 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a 2a  ed and history.*
a290: 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79 20  * is saved only 
a2a0: 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65  if input is inte
a2b0: 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e 74  ractive.  An int
a2c0: 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77 69  errupt signal wi
a2d0: 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69 73  ll.** cause this
a2e0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69 74   routine to exit
a2f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75 6e   immediately, un
a300: 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69 6e  less input is in
a310: 74 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74  teractive..*/.st
a320: 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63 65 73  atic void proces
a330: 73 5f 69 6e 70 75 74 28 73 74 72 75 63 74 20 63  s_input(struct c
a340: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c  allback_data *p,
a350: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
a360: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 63 68 61  ar *zLine;.  cha
a370: 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 69  r *zSql = 0;.  i
a380: 6e 74 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 63  nt nSql = 0;.  c
a390: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
a3a0: 69 6e 74 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  int rc;.  while(
a3b0: 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 2c   fflush(p->out),
a3c0: 20 28 7a 4c 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e   (zLine = one_in
a3d0: 70 75 74 5f 6c 69 6e 65 28 7a 53 71 6c 2c 20 69  put_line(zSql, i
a3e0: 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  n))!=0 ){.    if
a3f0: 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  ( seenInterrupt 
a400: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21  ){.      if( in!
a410: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
a420: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
a430: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
a440: 66 28 20 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70  f( p->echoOn ) p
a450: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c  rintf("%s\n", zL
a460: 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ine);.    if( (z
a470: 53 71 6c 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 30  Sql==0 || zSql[0
a480: 5d 3d 3d 30 29 20 26 26 20 5f 61 6c 6c 5f 77 68  ]==0) && _all_wh
a490: 69 74 65 73 70 61 63 65 28 7a 4c 69 6e 65 29 20  itespace(zLine) 
a4a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a4b0: 69 66 28 20 7a 4c 69 6e 65 20 26 26 20 7a 4c 69  if( zLine && zLi
a4c0: 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 6e 53  ne[0]=='.' && nS
a4d0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ql==0 ){.      i
a4e0: 6e 74 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f  nt rc = do_meta_
a4f0: 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20 70  command(zLine, p
a500: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
a510: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
a520: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
a530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
a540: 7d 0a 20 20 20 20 69 66 28 20 5f 69 73 5f 63 6f  }.    if( _is_co
a550: 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72  mmand_terminator
a560: 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 20  (zLine) ){.     
a570: 20 73 74 72 63 70 79 28 7a 4c 69 6e 65 2c 22 3b   strcpy(zLine,";
a580: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
a590: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
a5a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a5b0: 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69  for(i=0; zLine[i
a5c0: 5d 20 26 26 20 69 73 73 70 61 63 65 28 28 75 6e  ] && isspace((un
a5d0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e  signed char)zLin
a5e0: 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  e[i]); i++){}.  
a5f0: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
a600: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  !=0 ){.        n
a610: 53 71 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 4c 69  Sql = strlen(zLi
a620: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  ne);.        zSq
a630: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 71 6c  l = malloc( nSql
a640: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +1 );.        if
a650: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
a660: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
a670: 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d  tderr, "out of m
a680: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
a690: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
a6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a6b0: 73 74 72 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69  strcpy(zSql, zLi
a6c0: 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ne);.      }.   
a6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
a6e0: 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  t len = strlen(z
a6f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7a 53 71  Line);.      zSq
a700: 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 53 71  l = realloc( zSq
a710: 6c 2c 20 6e 53 71 6c 20 2b 20 6c 65 6e 20 2b 20  l, nSql + len + 
a720: 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  2 );.      if( z
a730: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
a740: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a750: 2c 22 25 73 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  ,"%s: out of mem
a760: 6f 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b  ory!\n", Argv0);
a770: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
a780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a790: 73 74 72 63 70 79 28 26 7a 53 71 6c 5b 6e 53 71  strcpy(&zSql[nSq
a7a0: 6c 2b 2b 5d 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  l++], "\n");.   
a7b0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 71 6c 5b     strcpy(&zSql[
a7c0: 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20  nSql], zLine);. 
a7d0: 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20 6c 65 6e       nSql += len
a7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
a7f0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28  (zLine);.    if(
a800: 20 7a 53 71 6c 20 26 26 20 5f 65 6e 64 73 5f 77   zSql && _ends_w
a810: 69 74 68 5f 73 65 6d 69 63 6f 6c 6f 6e 28 7a 53  ith_semicolon(zS
a820: 71 6c 2c 20 6e 53 71 6c 29 20 26 26 20 73 71 6c  ql, nSql) && sql
a830: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53  ite3_complete(zS
a840: 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ql) ){.      p->
a850: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f  cnt = 0;.      o
a860: 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 20  pen_db(p);.     
a870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
a880: 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
a890: 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45  callback, p, &zE
a8a0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
a8b0: 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20  ( rc || zErrMsg 
a8c0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  ){.        /* if
a8d0: 28 20 69 6e 21 3d 30 20 26 26 20 21 70 2d 3e 65  ( in!=0 && !p->e
a8e0: 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22  choOn ) printf("
a8f0: 25 73 5c 6e 22 2c 7a 53 71 6c 29 3b 20 2a 2f 0a  %s\n",zSql); */.
a900: 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72          if( zErr
a910: 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
a920: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20      printf("SQL 
a930: 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  error: %s\n", zE
a940: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
a950: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a960: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
a970: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
a980: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a990: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
a9a0: 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
a9b0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
a9c0: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
a9d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9e0: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
a9f0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a 20       zSql = 0;. 
aa00: 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20       nSql = 0;. 
aa10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
aa20: 53 71 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  Sql ){.    if( !
aa30: 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28  _all_whitespace(
aa40: 7a 53 71 6c 29 20 29 20 70 72 69 6e 74 66 28 22  zSql) ) printf("
aa50: 49 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a 20  Incomplete SQL: 
aa60: 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
aa70: 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
aa80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
aa90: 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77 68 69  n a pathname whi
aaa0: 63 68 20 69 73 20 74 68 65 20 75 73 65 72 27 73  ch is the user's
aab0: 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e   home directory.
aac0: 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e 20    A.** 0 return 
aad0: 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72 72  indicates an err
aae0: 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  or of some kind.
aaf0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
ab00: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67  the.** resulting
ab10: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
ab20: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
ab30: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  ).  The calling.
ab40: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ** function shou
ab50: 6c 64 20 66 72 65 65 20 74 68 65 20 72 65 73 75  ld free the resu
ab60: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  lt..*/.static ch
ab70: 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  ar *find_home_di
ab80: 72 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20  r(void){.  char 
ab90: 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c  *home_dir = NULL
aba0: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
abb0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
abc0: 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21 64  ned(WIN32) && !d
abd0: 65 66 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f  efined(__MACOS__
abe0: 29 0a 20 20 73 74 72 75 63 74 20 70 61 73 73 77  ).  struct passw
abf0: 64 20 2a 70 77 65 6e 74 3b 0a 20 20 75 69 64 5f  d *pwent;.  uid_
ac00: 74 20 75 69 64 20 3d 20 67 65 74 75 69 64 28 29  t uid = getuid()
ac10: 3b 0a 20 20 69 66 28 20 28 70 77 65 6e 74 3d 67  ;.  if( (pwent=g
ac20: 65 74 70 77 75 69 64 28 75 69 64 29 29 20 21 3d  etpwuid(uid)) !=
ac30: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d   NULL) {.    hom
ac40: 65 5f 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70  e_dir = pwent->p
ac50: 77 5f 64 69 72 3b 0a 20 20 7d 0a 23 65 6e 64 69  w_dir;.  }.#endi
ac60: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 4d 41 43 4f  f..#ifdef __MACO
ac70: 53 5f 5f 0a 20 20 63 68 61 72 20 68 6f 6d 65 5f  S__.  char home_
ac80: 70 61 74 68 5b 5f 4d 41 58 5f 50 41 54 48 2b 31  path[_MAX_PATH+1
ac90: 5d 3b 0a 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  ];.  home_dir = 
aca0: 67 65 74 63 77 64 28 68 6f 6d 65 5f 70 61 74 68  getcwd(home_path
acb0: 2c 20 5f 4d 41 58 5f 50 41 54 48 29 3b 0a 23 65  , _MAX_PATH);.#e
acc0: 6e 64 69 66 0a 0a 20 20 69 66 20 28 21 68 6f 6d  ndif..  if (!hom
acd0: 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d  e_dir) {.    hom
ace0: 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22  e_dir = getenv("
acf0: 48 4f 4d 45 22 29 3b 0a 20 20 20 20 69 66 20 28  HOME");.    if (
ad00: 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
ad10: 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65     home_dir = ge
ad20: 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29  tenv("HOMEPATH")
ad30: 3b 20 2f 2a 20 57 69 6e 64 6f 77 73 3f 20 2a 2f  ; /* Windows? */
ad40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
ad50: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
ad60: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
ad70: 29 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69  ).  if (!home_di
ad80: 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69  r) {.    home_di
ad90: 72 20 3d 20 22 63 3a 22 3b 0a 20 20 7d 0a 23 65  r = "c:";.  }.#e
ada0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 68 6f 6d 65  ndif..  if( home
adb0: 5f 64 69 72 20 29 7b 0a 20 20 20 20 63 68 61 72  _dir ){.    char
adc0: 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74   *z = malloc( st
add0: 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29 2b 31  rlen(home_dir)+1
ade0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 20   );.    if( z ) 
adf0: 73 74 72 63 70 79 28 7a 2c 20 68 6f 6d 65 5f 64  strcpy(z, home_d
ae00: 69 72 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69  ir);.    home_di
ae10: 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = z;.  }..  re
ae20: 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d  turn home_dir;.}
ae30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70  ../*.** Read inp
ae40: 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
ae50: 20 67 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65   given by sqlite
ae60: 72 63 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72  rc_override.  Or
ae70: 20 69 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61   if that.** para
ae80: 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  meter is NULL, t
ae90: 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e  ake input from ~
aea0: 2f 2e 73 71 6c 69 74 65 72 63 0a 2a 2f 0a 73 74  /.sqliterc.*/.st
aeb0: 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63 65 73  atic void proces
aec0: 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20 73 74  s_sqliterc(.  st
aed0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
aee0: 74 61 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ta *p,        /*
aef0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64   Configuration d
af00: 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
af10: 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76  har *sqliterc_ov
af20: 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65  erride   /* Name
af30: 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e   of config file.
af40: 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66   NULL to use def
af50: 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ault */.){.  cha
af60: 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55  r *home_dir = NU
af70: 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  LL;.  const char
af80: 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c   *sqliterc = sql
af90: 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a  iterc_override;.
afa0: 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30    char *zBuf = 0
afb0: 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e  ;.  FILE *in = N
afc0: 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 73 71 6c 69  ULL;..  if (sqli
afd0: 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  terc == NULL) {.
afe0: 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 66      home_dir = f
aff0: 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
b000: 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72      if( home_dir
b010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
b020: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
b030: 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79   cannot locate y
b040: 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  our home directo
b050: 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ry!\n", Argv0);.
b060: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b070: 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 6d    }.    zBuf = m
b080: 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 68 6f 6d  alloc(strlen(hom
b090: 65 5f 64 69 72 29 20 2b 20 31 35 29 3b 0a 20 20  e_dir) + 15);.  
b0a0: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b    if( zBuf==0 ){
b0b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
b0c0: 74 64 65 72 72 2c 22 25 73 3a 20 6f 75 74 20 6f  tderr,"%s: out o
b0d0: 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20 41 72  f memory!\n", Ar
b0e0: 67 76 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74  gv0);.      exit
b0f0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (1);.    }.    s
b100: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 73 2f  printf(zBuf,"%s/
b110: 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
b120: 64 69 72 29 3b 0a 20 20 20 20 66 72 65 65 28 68  dir);.    free(h
b130: 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73 71  ome_dir);.    sq
b140: 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e 73 74 20  literc = (const 
b150: 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 7d 0a  char*)zBuf;.  }.
b160: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c    in = fopen(sql
b170: 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69  iterc,"rb");.  i
b180: 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28  f( in ){.    if(
b190: 20 69 73 61 74 74 79 28 66 69 6c 65 6e 6f 28 73   isatty(fileno(s
b1a0: 74 64 6f 75 74 29 29 20 29 7b 0a 20 20 20 20 20  tdout)) ){.     
b1b0: 20 70 72 69 6e 74 66 28 22 4c 6f 61 64 69 6e 67   printf("Loading
b1c0: 20 72 65 73 6f 75 72 63 65 73 20 66 72 6f 6d 20   resources from 
b1d0: 25 73 5c 6e 22 2c 73 71 6c 69 74 65 72 63 29 3b  %s\n",sqliterc);
b1e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 65  .    }.    proce
b1f0: 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a  ss_input(p,in);.
b200: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
b210: 20 20 7d 0a 20 20 66 72 65 65 28 7a 42 75 66 29    }.  free(zBuf)
b220: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b230: 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c 61  *.** Show availa
b240: 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ble command line
b250: 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
b260: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4f  ic const char zO
b270: 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22 20  ptions[] = .  " 
b280: 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61 6d 65    -init filename
b290: 20 20 20 20 20 20 20 72 65 61 64 2f 70 72 6f 63         read/proc
b2a0: 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65 5c 6e  ess named file\n
b2b0: 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
b2d0: 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo
b2e0: 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a  re execution\n".
b2f0: 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65    "   -[no]heade
b300: 72 20 20 20 20 20 20 20 20 20 20 74 75 72 6e 20  r          turn 
b310: 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
b320: 66 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75  f\n".  "   -colu
b330: 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mn              
b340: 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
b350: 74 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20  to 'column'\n". 
b360: 20 22 20 20 20 2d 68 74 6d 6c 20 20 20 20 20 20   "   -html      
b370: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75            set ou
b380: 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 48 54 4d  tput mode to HTM
b390: 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 6c 69 6e 65  L\n".  "   -line
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
b3c0: 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a 20 20 22  to 'line'\n".  "
b3d0: 20 20 20 2d 6c 69 73 74 20 20 20 20 20 20 20 20     -list        
b3e0: 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
b3f0: 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c 69 73 74  ut mode to 'list
b400: 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73 65 70 61  '\n".  "   -sepa
b410: 72 61 74 6f 72 20 27 78 27 20 20 20 20 20 20 20  rator 'x'       
b420: 73 65 74 20 6f 75 74 70 75 74 20 66 69 65 6c 64  set output field
b430: 20 73 65 70 61 72 61 74 6f 72 20 28 7c 29 5c 6e   separator (|)\n
b440: 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c 76 61 6c  ".  "   -nullval
b450: 75 65 20 27 74 65 78 74 27 20 20 20 20 73 65 74  ue 'text'    set
b460: 20 74 65 78 74 20 73 74 72 69 6e 67 20 66 6f 72   text string for
b470: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a   NULL values\n".
b480: 20 20 22 20 20 20 2d 76 65 72 73 69 6f 6e 20 20    "   -version  
b490: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20             show 
b4a0: 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 5c 6e  SQLite version\n
b4b0: 22 0a 20 20 22 20 20 20 2d 68 65 6c 70 20 20 20  ".  "   -help   
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
b4d0: 77 20 74 68 69 73 20 74 65 78 74 2c 20 61 6c 73  w this text, als
b4e0: 6f 20 73 68 6f 77 20 64 6f 74 2d 63 6f 6d 6d 61  o show dot-comma
b4f0: 6e 64 73 5c 6e 22 0a 3b 0a 73 74 61 74 69 63 20  nds\n".;.static 
b500: 76 6f 69 64 20 75 73 61 67 65 28 69 6e 74 20 73  void usage(int s
b510: 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20 66 70  howDetail){.  fp
b520: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
b530: 73 61 67 65 3a 20 25 73 20 5b 4f 50 54 49 4f 4e  sage: %s [OPTION
b540: 53 5d 20 46 49 4c 45 4e 41 4d 45 20 5b 53 51 4c  S] FILENAME [SQL
b550: 5d 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20  ]\n", Argv0);.  
b560: 69 66 28 20 73 68 6f 77 44 65 74 61 69 6c 20 29  if( showDetail )
b570: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b580: 64 65 72 72 2c 20 22 4f 70 74 69 6f 6e 73 20 61  derr, "Options a
b590: 72 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f  re:\n%s", zOptio
b5a0: 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ns);.  }else{.  
b5b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b5c0: 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70  , "Use the -help
b5d0: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69   option for addi
b5e0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
b5f0: 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78  on\n");.  }.  ex
b600: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
b610: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
b620: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
b630: 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74   in data.*/.stat
b640: 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69  ic void main_ini
b650: 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  t(struct callbac
b660: 6b 5f 64 61 74 61 20 2a 64 61 74 61 29 20 7b 0a  k_data *data) {.
b670: 20 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20 30    memset(data, 0
b680: 2c 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29 29  , sizeof(*data))
b690: 3b 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d  ;.  data->mode =
b6a0: 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 73 74   MODE_List;.  st
b6b0: 72 63 70 79 28 64 61 74 61 2d 3e 73 65 70 61 72  rcpy(data->separ
b6c0: 61 74 6f 72 2c 22 7c 22 29 3b 0a 20 20 64 61 74  ator,"|");.  dat
b6d0: 61 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  a->showHeader = 
b6e0: 30 3b 0a 20 20 73 74 72 63 70 79 28 6d 61 69 6e  0;.  strcpy(main
b6f0: 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20  Prompt,"sqlite> 
b700: 22 29 3b 0a 20 20 73 74 72 63 70 79 28 63 6f 6e  ");.  strcpy(con
b710: 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20  tinuePrompt,"   
b720: 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e 74 20  ...> ");.}..int 
b730: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
b740: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  har **argv){.  c
b750: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
b760: 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ;.  struct callb
b770: 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
b780: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
b790: 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68  itFile = 0;.  ch
b7a0: 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20  ar *zFirstCmd = 
b7b0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  0;.  int i;..#if
b7c0: 64 65 66 20 5f 5f 4d 41 43 4f 53 5f 5f 0a 20 20  def __MACOS__.  
b7d0: 61 72 67 63 20 3d 20 63 63 6f 6d 6d 61 6e 64 28  argc = ccommand(
b7e0: 26 61 72 67 76 29 3b 0a 23 65 6e 64 69 66 0a 0a  &argv);.#endif..
b7f0: 20 20 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30    Argv0 = argv[0
b800: 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26  ];.  main_init(&
b810: 64 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  data);..  /* Mak
b820: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
b830: 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61   valid signal ha
b840: 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66  ndler early, bef
b850: 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  ore anything.  *
b860: 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a  * else is done..
b870: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49    */.#ifdef SIGI
b880: 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49  NT.  signal(SIGI
b890: 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61  NT, interrupt_ha
b8a0: 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  ndler);.#endif..
b8b0: 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69    /* Do an initi
b8c0: 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
b8d0: 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
b8e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63   argument to loc
b8f0: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d  ate.  ** the nam
b900: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
b910: 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65  e file, the name
b920: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
b930: 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a  zation file,.  *
b940: 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  * and the first 
b950: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75  command to execu
b960: 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  te..  */.  for(i
b970: 3d 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20 69 2b  =1; i<argc-1; i+
b980: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76  +){.    if( argv
b990: 5b 69 5d 5b 30 5d 21 3d 27 2d 27 20 29 20 62 72  [i][0]!='-' ) br
b9a0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 74 72  eak;.    if( str
b9b0: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 73 65  cmp(argv[i],"-se
b9c0: 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 7c 7c 20  parator")==0 || 
b9d0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
b9e0: 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20  -nullvalue")==0 
b9f0: 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
ba00: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
ba10: 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 69 6e 69  mp(argv[i],"-ini
ba20: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
ba30: 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 49 6e 69 74  i++;.      zInit
ba40: 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  File = argv[i];.
ba50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
ba60: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 6b  rcmp(argv[i],"-k
ba70: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
ba80: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 64 61 74 61   i++;.      data
ba90: 2e 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  .zKey = sqlite3_
baa0: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 61 72 67  mprintf("%s",arg
bab0: 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v[i]);.    }.  }
bac0: 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b  .  if( i<argc ){
bad0: 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c  .    data.zDbFil
bae0: 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b 69 2b 2b  ename = argv[i++
baf0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  ];.  }else{.#ifn
bb00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bb10: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 64 61 74  MEMORYDB.    dat
bb20: 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  a.zDbFilename = 
bb30: 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6c 73  ":memory:";.#els
bb40: 65 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69  e.    data.zDbFi
bb50: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  lename = 0;.#end
bb60: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 61  if.  }.  if( i<a
bb70: 72 67 63 20 29 7b 0a 20 20 20 20 7a 46 69 72 73  rgc ){.    zFirs
bb80: 74 43 6d 64 20 3d 20 61 72 67 76 5b 69 2b 2b 5d  tCmd = argv[i++]
bb90: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74  ;.  }.  data.out
bba0: 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 23 69 66 64   = stdout;..#ifd
bbb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
bbc0: 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 64 61  EMORYDB.  if( da
bbd0: 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  ta.zDbFilename==
bbe0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
bbf0: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6e 6f 20  (stderr,"%s: no 
bc00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
bc10: 65 20 73 70 65 63 69 66 69 65 64 5c 6e 22 2c 20  e specified\n", 
bc20: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78  argv[0]);.    ex
bc30: 69 74 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  it(1);.  }.#endi
bc40: 66 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64  f..  /* Go ahead
bc50: 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61   and open the da
bc60: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
bc70: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
bc80: 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66  .  If the.  ** f
bc90: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
bca0: 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e  st, delay openin
bcb0: 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65 76  g it.  This prev
bcc0: 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61 62  ents empty datab
bcd0: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66  ase.  ** files f
bce0: 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65  rom being create
bcf0: 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73 74  d if a user mist
bd00: 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ypes the databas
bd10: 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a  e name argument.
bd20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69    ** to the sqli
bd30: 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  te command-line 
bd40: 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tool..  */.  if(
bd50: 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62   access(data.zDb
bd60: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20  Filename, 0)==0 
bd70: 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26  ){.    open_db(&
bd80: 64 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  data);.  }..  /*
bd90: 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 69   Process the ini
bda0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65  tialization file
bdb0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
bdc0: 2e 20 20 49 66 20 6e 6f 20 2d 69 6e 69 74 20 6f  .  If no -init o
bdd0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 67 69  ption.  ** is gi
bde0: 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ven on the comma
bdf0: 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f  nd line, look fo
be00: 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 7e  r a file named ~
be10: 2f 2e 73 71 6c 69 74 65 72 63 20 61 6e 64 0a 20  /.sqliterc and. 
be20: 20 2a 2a 20 74 72 79 20 74 6f 20 70 72 6f 63 65   ** try to proce
be30: 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 70 72  ss it..  */.  pr
be40: 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26  ocess_sqliterc(&
be50: 64 61 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b  data,zInitFile);
be60: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65  ..  /* Make a se
be70: 63 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75 67  cond pass throug
be80: 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  h the command-li
be90: 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ne argument and 
bea0: 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73  set.  ** options
beb0: 2e 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20 70  .  This second p
bec0: 61 73 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  ass is delayed u
bed0: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 69  ntil after the i
bee0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
bef0: 2a 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63 65  ** file is proce
bf00: 73 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ssed so that the
bf10: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
bf20: 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65  guments will ove
bf30: 72 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74 69  rride.  ** setti
bf40: 6e 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ngs in the initi
bf50: 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a  alization file..
bf60: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
bf70: 69 3c 61 72 67 63 20 26 26 20 61 72 67 76 5b 69  i<argc && argv[i
bf80: 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b  ][0]=='-'; i++){
bf90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
bfa0: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rgv[i];.    if( 
bfb0: 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22  strcmp(z,"-init"
bfc0: 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
bfd0: 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  ,"-key")==0 ){. 
bfe0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65       i++;.    }e
bff0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
c000: 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a  ,"-html")==0 ){.
c010: 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
c020: 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20  = MODE_Html;.   
c030: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
c040: 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30 20  p(z,"-list")==0 
c050: 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  ){.      data.mo
c060: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
c070: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
c080: 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29 3d  rcmp(z,"-line")=
c090: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
c0a0: 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e  .mode = MODE_Lin
c0b0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
c0c0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c 75   strcmp(z,"-colu
c0d0: 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mn")==0 ){.     
c0e0: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
c0f0: 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65  E_Column;.    }e
c100: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
c110: 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d  ,"-separator")==
c120: 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
c130: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 64 61        sprintf(da
c140: 74 61 2e 73 65 70 61 72 61 74 6f 72 2c 22 25 2e  ta.separator,"%.
c150: 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28  *s",(int)sizeof(
c160: 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72 29 2d  data.separator)-
c170: 31 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  1,argv[i]);.    
c180: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
c190: 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29  (z,"-nullvalue")
c1a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
c1b0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
c1c0: 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 2c 22  data.nullvalue,"
c1d0: 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f  %.*s",(int)sizeo
c1e0: 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65  f(data.nullvalue
c1f0: 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  )-1,argv[i]);.  
c200: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
c210: 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22 29 3d  mp(z,"-header")=
c220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
c230: 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b  .showHeader = 1;
c240: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
c250: 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65 61 64  trcmp(z,"-nohead
c260: 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
c270: 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
c280: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c290: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65  if( strcmp(z,"-e
c2a0: 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cho")==0 ){.    
c2b0: 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e 20 3d 20    data.echoOn = 
c2c0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
c2d0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72 73   strcmp(z,"-vers
c2e0: 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
c2f0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
c300: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
c310: 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 72 65  ion());.      re
c320: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
c330: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
c340: 2d 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20  -help")==0 ){.  
c350: 20 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20 20      usage(1);.  
c360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
c370: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
c380: 73 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  s: unknown optio
c390: 6e 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c  n: %s\n", Argv0,
c3a0: 20 7a 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e   z);.      fprin
c3b0: 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d  tf(stderr,"Use -
c3c0: 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20  help for a list 
c3d0: 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b  of options.\n");
c3e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
c3f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
c400: 28 20 7a 46 69 72 73 74 43 6d 64 20 29 7b 0a 20  ( zFirstCmd ){. 
c410: 20 20 20 2f 2a 20 52 75 6e 20 6a 75 73 74 20 74     /* Run just t
c420: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20  he command that 
c430: 66 6f 6c 6c 6f 77 73 20 74 68 65 20 64 61 74 61  follows the data
c440: 62 61 73 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2f  base name.    */
c450: 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 43  .    if( zFirstC
c460: 6d 64 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20  md[0]=='.' ){.  
c470: 20 20 20 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d      do_meta_comm
c480: 61 6e 64 28 7a 46 69 72 73 74 43 6d 64 2c 20 26  and(zFirstCmd, &
c490: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 65 78 69  data);.      exi
c4a0: 74 28 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(0);.    }else{
c4b0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
c4c0: 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61       open_db(&da
c4d0: 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ta);.      rc = 
c4e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 61 74  sqlite3_exec(dat
c4f0: 61 2e 64 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c  a.db, zFirstCmd,
c500: 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
c510: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
c520: 20 20 20 69 66 28 20 72 63 21 3d 30 20 26 26 20     if( rc!=0 && 
c530: 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20  zErrMsg!=0 ){.  
c540: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
c550: 64 65 72 72 2c 22 53 51 4c 20 65 72 72 6f 72 3a  derr,"SQL error:
c560: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
c570: 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
c580: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
c5a0: 20 52 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65   Run commands re
c5b0: 63 65 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e  ceived from stan
c5c0: 64 61 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a  dard input.    *
c5d0: 2f 0a 20 20 20 20 69 66 28 20 69 73 61 74 74 79  /.    if( isatty
c5e0: 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29 29  (fileno(stdout))
c5f0: 20 26 26 20 69 73 61 74 74 79 28 66 69 6c 65 6e   && isatty(filen
c600: 6f 28 73 74 64 69 6e 29 29 20 29 7b 0a 20 20 20  o(stdin)) ){.   
c610: 20 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a     char *zHome;.
c620: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 69 73        char *zHis
c630: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  tory = 0;.      
c640: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
c650: 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20  "SQLite version 
c660: 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 45  %s\n".        "E
c670: 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66  nter \".help\" f
c680: 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c  or instructions\
c690: 6e 22 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n",.        sqli
c6a0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
c6b0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
c6c0: 7a 48 6f 6d 65 20 3d 20 66 69 6e 64 5f 68 6f 6d  zHome = find_hom
c6d0: 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 20 20 69  e_dir();.      i
c6e0: 66 28 20 7a 48 6f 6d 65 20 26 26 20 28 7a 48 69  f( zHome && (zHi
c6f0: 73 74 6f 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  story = malloc(s
c700: 74 72 6c 65 6e 28 7a 48 6f 6d 65 29 2b 32 30 29  trlen(zHome)+20)
c710: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
c720: 73 70 72 69 6e 74 66 28 7a 48 69 73 74 6f 72 79  sprintf(zHistory
c730: 2c 22 25 73 2f 2e 73 71 6c 69 74 65 5f 68 69 73  ,"%s/.sqlite_his
c740: 74 6f 72 79 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20  tory", zHome);. 
c750: 20 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e       }.#if defin
c760: 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  ed(HAVE_READLINE
c770: 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49  ) && HAVE_READLI
c780: 4e 45 3d 3d 31 0a 20 20 20 20 20 20 69 66 28 20  NE==1.      if( 
c790: 7a 48 69 73 74 6f 72 79 20 29 20 72 65 61 64 5f  zHistory ) read_
c7a0: 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79  history(zHistory
c7b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
c7c0: 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64  process_input(&d
c7d0: 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ata, 0);.      i
c7e0: 66 28 20 7a 48 69 73 74 6f 72 79 20 29 7b 0a 20  f( zHistory ){. 
c7f0: 20 20 20 20 20 20 20 73 74 69 66 6c 65 5f 68 69         stifle_hi
c800: 73 74 6f 72 79 28 31 30 30 29 3b 0a 20 20 20 20  story(100);.    
c810: 20 20 20 20 77 72 69 74 65 5f 68 69 73 74 6f 72      write_histor
c820: 79 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  y(zHistory);.   
c830: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c840: 20 20 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e        process_in
c850: 70 75 74 28 26 64 61 74 61 2c 20 73 74 64 69 6e  put(&data, stdin
c860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
c870: 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26 64  et_table_name(&d
c880: 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  ata, 0);.  if( d
c890: 62 20 29 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  b ) sqlite3_clos
c8a0: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
c8b0: 30 3b 0a 7d 0a                                   0;.}.