System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 628db89ec5fde0ed4b7f5f1d14f1f5fa03d013f0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 73  es..**.** $Id: s
01f0: 68 65 6c 6c 2e 63 2c 76 20 31 2e 31 38 20 32 30  hell.c,v 1.18 20
0200: 30 36 2f 30 32 2f 30 32 20 32 32 3a 34 35 3a 31  06/02/02 22:45:1
0210: 30 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78 70 20  0 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 69 6e  ed..*/.static in
0640: 74 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  t seenInterrupt 
0650: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  = 0;../*.** This
0660: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
0670: 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20  our program. It 
0680: 69 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29  is set in main()
0690: 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e  , used.** in a n
06a0: 75 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70  umber of other p
06b0: 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f  laces, mostly fo
06c0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
06d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
06e0: 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20   *Argv0;../*.** 
06f0: 50 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20  Prompt strings. 
0700: 49 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d  Initialized in m
0710: 61 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69  ain. Settable wi
0720: 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20  th.**   .prompt 
0730: 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f  main continue.*/
0740: 0a 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 69  .static char mai
0750: 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20  nPrompt[20];    
0760: 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70   /* First line p
0770: 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20  rompt. default: 
0780: 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61  "sqlite> "*/.sta
0790: 74 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75  tic char continu
07a0: 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20  ePrompt[20]; /* 
07b0: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f  Continuation pro
07c0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20  mpt. default: " 
07d0: 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 0a 2f 2a    ...> " */.../*
07e0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
07f0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
0800: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
0810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
0820: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
0830: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
0840: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
0850: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
0860: 2b 2b 3b 0a 20 20 69 66 28 20 21 69 73 64 69 67  ++;.  if( !isdig
0870: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
0880: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
0890: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
08a0: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
08b0: 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69  .  while( isdigi
08c0: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
08d0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
08e0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
08f0: 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20 29  ( !isdigit(*z) )
0900: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
0910: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a  hile( isdigit(*z
0920: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
0930: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
0940: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
0950: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
0960: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
0970: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
0980: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
0990: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
09a0: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65  isdigit(*z) ) re
09b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
09c0: 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29  e( isdigit(*z) )
09d0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
09e0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
09f0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
0a00: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
0a10: 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 63  /*.** A global c
0a20: 68 61 72 2a 20 61 6e 64 20 61 6e 20 53 51 4c 20  har* and an SQL 
0a30: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 63 65  function to acce
0a40: 73 73 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  ss its current v
0a50: 61 6c 75 65 20 0a 2a 2a 20 66 72 6f 6d 20 77 69  alue .** from wi
0a60: 74 68 69 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  thin an SQL stat
0a70: 65 6d 65 6e 74 2e 20 54 68 69 73 20 70 72 6f 67  ement. This prog
0a80: 72 61 6d 20 75 73 65 64 20 74 6f 20 75 73 65 20  ram used to use 
0a90: 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 65  the .** sqlite_e
0aa0: 78 65 63 5f 70 72 69 6e 74 66 28 29 20 41 50 49  xec_printf() API
0ab0: 20 74 6f 20 73 75 62 73 74 69 74 75 65 20 61 20   to substitue a 
0ac0: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53  string into an S
0ad0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
0ae0: 20 54 68 65 20 63 6f 72 72 65 63 74 20 77 61 79   The correct way
0af0: 20 74 6f 20 64 6f 20 74 68 69 73 20 77 69 74 68   to do this with
0b00: 20 73 71 6c 69 74 65 33 20 69 73 20 74 6f 20 75   sqlite3 is to u
0b10: 73 65 20 74 68 65 20 62 69 6e 64 20 41 50 49 2c  se the bind API,
0b20: 20 62 75 74 0a 2a 2a 20 73 69 6e 63 65 20 74 68   but.** since th
0b30: 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c 74  e shell is built
0b40: 20 61 72 6f 75 6e 64 20 74 68 65 20 63 61 6c 6c   around the call
0b50: 62 61 63 6b 20 70 61 72 61 64 69 67 6d 20 69 74  back paradigm it
0b60: 20 77 6f 75 6c 64 20 62 65 20 61 20 6c 6f 74 0a   would be a lot.
0b70: 2a 2a 20 6f 66 20 77 6f 72 6b 2e 20 49 6e 73 74  ** of work. Inst
0b80: 65 61 64 20 6a 75 73 74 20 75 73 65 20 74 68 69  ead just use thi
0b90: 73 20 68 61 63 6b 2c 20 77 68 69 63 68 20 69 73  s hack, which is
0ba0: 20 71 75 69 74 65 20 68 61 72 6d 6c 65 73 73 2e   quite harmless.
0bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0bc0: 20 63 68 61 72 20 2a 7a 53 68 65 6c 6c 53 74 61   char *zShellSta
0bd0: 74 69 63 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  tic = 0;.static 
0be0: 76 6f 69 64 20 73 68 65 6c 6c 73 74 61 74 69 63  void shellstatic
0bf0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0c00: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0c10: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0c20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0c30: 61 72 67 76 0a 29 7b 0a 20 20 61 73 73 65 72 74  argv.){.  assert
0c40: 28 20 30 3d 3d 61 72 67 63 20 29 3b 0a 20 20 61  ( 0==argc );.  a
0c50: 73 73 65 72 74 28 20 7a 53 68 65 6c 6c 53 74 61  ssert( zShellSta
0c60: 74 69 63 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  tic );.  sqlite3
0c70: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
0c80: 74 65 78 74 2c 20 7a 53 68 65 6c 6c 53 74 61 74  text, zShellStat
0c90: 69 63 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  ic, -1, SQLITE_S
0ca0: 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TATIC);.}.../*.*
0cb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
0cc0: 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74  eads a line of t
0cd0: 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ext from FILE in
0ce0: 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20  , stores.** the 
0cf0: 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  text in memory o
0d00: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
0d10: 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e  loc() and return
0d20: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
0d30: 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c  o the text.  NUL
0d40: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74  L is returned at
0d50: 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72   end of file, or
0d60: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20   if malloc().** 
0d70: 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fails..**.** The
0d80: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69   interface is li
0d90: 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75  ke "readline" bu
0da0: 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  t no command-lin
0db0: 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20  e editing.** is 
0dc0: 64 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  done..*/.static 
0dd0: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
0de0: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
0df0: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
0e00: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
0e10: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
0e20: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
0e30: 20 69 66 28 20 7a 50 72 6f 6d 70 74 20 26 26 20   if( zPrompt && 
0e40: 2a 7a 50 72 6f 6d 70 74 20 29 7b 0a 20 20 20 20  *zPrompt ){.    
0e50: 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 50 72 6f  printf("%s",zPro
0e60: 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  mpt);.    fflush
0e70: 28 73 74 64 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  (stdout);.  }.  
0e80: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
0e90: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
0ea0: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
0eb0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
0ec0: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f  0;.  n = 0;.  eo
0ed0: 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  l = 0;.  while( 
0ee0: 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  !eol ){.    if( 
0ef0: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
0f00: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
0f10: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
0f20: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
0f30: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
0f40: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
0f50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0f60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
0f70: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
0f80: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
0f90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
0fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
0fb0: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
0fc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0fd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
0fe0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
0ff0: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ol = 1;.      br
1000: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
1010: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
1020: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { n++; }.    if(
1030: 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d   n>0 && zLine[n-
1040: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
1050: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69    n--;.      zLi
1060: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
1070: 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   eol = 1;.    }.
1080: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
1090: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
10a0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
10b0: 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ine;.}../*.** Re
10c0: 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20  trieve a single 
10d0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65  line of input te
10e0: 78 74 2e 20 20 22 69 73 61 74 74 79 22 20 69 73  xt.  "isatty" is
10f0: 20 74 72 75 65 20 69 66 20 74 65 78 74 0a 2a 2a   true if text.**
1100: 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20   is coming from 
1110: 61 20 74 65 72 6d 69 6e 61 6c 2e 20 20 49 6e 20  a terminal.  In 
1120: 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 69 73  that case, we is
1130: 73 75 65 20 61 20 70 72 6f 6d 70 74 20 61 6e 64  sue a prompt and
1140: 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 75  .** attempt to u
1150: 73 65 20 22 72 65 61 64 6c 69 6e 65 22 20 66 6f  se "readline" fo
1160: 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  r command-line e
1170: 64 69 74 69 6e 67 2e 20 20 49 66 20 22 69 73 61  diting.  If "isa
1180: 74 74 79 22 0a 2a 2a 20 69 73 20 66 61 6c 73 65  tty".** is false
1190: 2c 20 75 73 65 20 22 6c 6f 63 61 6c 5f 67 65 74  , use "local_get
11a0: 6c 69 6e 65 22 20 69 6e 73 74 65 61 64 20 6f 66  line" instead of
11b0: 20 22 72 65 61 64 6c 69 6e 65 22 20 61 6e 64 20   "readline" and 
11c0: 69 73 73 75 65 20 6e 6f 20 70 72 6f 6d 70 74 2e  issue no prompt.
11d0: 0a 2a 2a 0a 2a 2a 20 7a 50 72 69 6f 72 20 69 73  .**.** zPrior is
11e0: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 70 72 69   a string of pri
11f0: 6f 72 20 74 65 78 74 20 72 65 74 72 69 65 76 65  or text retrieve
1200: 64 2e 20 20 49 66 20 6e 6f 74 20 74 68 65 20 65  d.  If not the e
1210: 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20  mpty.** string, 
1220: 74 68 65 6e 20 69 73 73 75 65 20 61 20 63 6f 6e  then issue a con
1230: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
1240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1250: 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65   *one_input_line
1260: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72  (const char *zPr
1270: 69 6f 72 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  ior, FILE *in){.
1280: 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b    char *zPrompt;
1290: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
12a0: 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b  ;.  if( in!=0 ){
12b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61  .    return loca
12c0: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
12d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 72 69  ;.  }.  if( zPri
12e0: 6f 72 20 26 26 20 7a 50 72 69 6f 72 5b 30 5d 20  or && zPrior[0] 
12f0: 29 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  ){.    zPrompt =
1300: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 3b   continuePrompt;
1310: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
1320: 72 6f 6d 70 74 20 3d 20 6d 61 69 6e 50 72 6f 6d  rompt = mainProm
1330: 70 74 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c  pt;.  }.  zResul
1340: 74 20 3d 20 72 65 61 64 6c 69 6e 65 28 7a 50 72  t = readline(zPr
1350: 6f 6d 70 74 29 3b 0a 23 69 66 20 64 65 66 69 6e  ompt);.#if defin
1360: 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  ed(HAVE_READLINE
1370: 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49  ) && HAVE_READLI
1380: 4e 45 3d 3d 31 0a 20 20 69 66 28 20 7a 52 65 73  NE==1.  if( zRes
1390: 75 6c 74 20 29 20 61 64 64 5f 68 69 73 74 6f 72  ult ) add_histor
13a0: 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64  y(zResult);.#end
13b0: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73  if.  return zRes
13c0: 75 6c 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 70  ult;.}..struct p
13d0: 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74  revious_mode_dat
13e0: 61 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b  a {.  int valid;
13f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68          /* Is th
1400: 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69  ere legit data i
1410: 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74  n here? */.  int
1420: 20 6d 6f 64 65 3b 0a 20 20 69 6e 74 20 73 68 6f   mode;.  int sho
1430: 77 48 65 61 64 65 72 3b 0a 20 20 69 6e 74 20 63  wHeader;.  int c
1440: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 0a 7d 3b  olWidth[100];.};
1450: 0a 2f 2a 0a 2a 2a 20 41 6e 20 70 6f 69 6e 74 65  ./*.** An pointe
1460: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
1470: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1480: 72 65 20 69 73 20 70 61 73 73 65 64 20 66 72 6f  re is passed fro
1490: 6d 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 70 72  m.** the main pr
14a0: 6f 67 72 61 6d 20 74 6f 20 74 68 65 20 63 61 6c  ogram to the cal
14b0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 69 73 20  lback.  This is 
14c0: 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  used to communic
14d0: 61 74 65 0a 2a 2a 20 73 74 61 74 65 20 61 6e 64  ate.** state and
14e0: 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f   mode informatio
14f0: 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 61 6c  n..*/.struct cal
1500: 6c 62 61 63 6b 5f 64 61 74 61 20 7b 0a 20 20 73  lback_data {.  s
1510: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1530: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
1540: 65 63 68 6f 4f 6e 3b 20 20 20 20 20 20 20 20 20  echoOn;         
1550: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 63     /* True to ec
1560: 68 6f 20 69 6e 70 75 74 20 63 6f 6d 6d 61 6e 64  ho input command
1570: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1590: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
15a0: 64 73 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20  ds displayed so 
15b0: 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f  far */.  FILE *o
15c0: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
15d0: 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73  /* Write results
15e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d   here */.  int m
15f0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1600: 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d    /* An output m
1610: 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ode setting */. 
1620: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
1630: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1640: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
1650: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
1660: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
1670: 20 63 68 61 72 20 2a 7a 44 65 73 74 54 61 62 6c   char *zDestTabl
1680: 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e;      /* Name 
1690: 6f 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  of destination t
16a0: 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49  able when MODE_I
16b0: 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20  nsert */.  char 
16c0: 73 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 20  separator[20];  
16d0: 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 63    /* Separator c
16e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44  haracter for MOD
16f0: 45 5f 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  E_List */.  int 
1700: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
1710: 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20     /* Requested 
1720: 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f  width of each co
1730: 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c  lumn when in col
1740: 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74  umn mode*/.  int
1750: 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30   actualWidth[100
1760: 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69  ];  /* Actual wi
1770: 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  dth of each colu
1780: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c  mn */.  char nul
1790: 6c 76 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f  lvalue[20];    /
17a0: 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72  * The text to pr
17b0: 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  int when a NULL 
17c0: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a  comes back from.
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
17f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74  database */.  st
1800: 72 75 63 74 20 70 72 65 76 69 6f 75 73 5f 6d 6f  ruct previous_mo
1810: 64 65 5f 64 61 74 61 20 65 78 70 6c 61 69 6e 50  de_data explainP
1820: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rev;.           
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1840: 20 48 6f 6c 64 73 20 74 68 65 20 6d 6f 64 65 20   Holds the mode 
1850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6a 75 73 74  information just
1860: 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20   before.        
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 2a 2a 20 2e 65 78 70 6c 61 69 6e 20 4f 4e 20   ** .explain ON 
1890: 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c  */.  char outfil
18a0: 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b  e[FILENAME_MAX];
18b0: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72   /* Filename for
18c0: 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   *out */.  const
18d0: 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61   char *zDbFilena
18e0: 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  me;    /* name o
18f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1900: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
1910: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
1920: 20 20 20 20 20 2f 2a 20 45 6e 63 72 79 70 74 69       /* Encrypti
1930: 6f 6e 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  on key */.};../*
1940: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
1950: 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e  e allowed modes.
1960: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45  .*/.#define MODE
1970: 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20  _Line     0  /* 
1980: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c  One column per l
1990: 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65  ine.  Blank line
19a0: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73   between records
19b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
19c0: 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20  _Column   1  /* 
19d0: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
19e0: 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75  ine in neat colu
19f0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mns */.#define M
1a00: 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20  ODE_List     2  
1a10: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
1a20: 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65  r line with a se
1a30: 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  parator */.#defi
1a40: 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20  ne MODE_Semi    
1a50: 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d   3  /* Same as M
1a60: 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70  ODE_List but app
1a70: 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20  end ";" to each 
1a80: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
1a90: 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20  MODE_Html     4 
1aa0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20   /* Generate an 
1ab0: 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23  XHTML table */.#
1ac0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65  define MODE_Inse
1ad0: 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72  rt   5  /* Gener
1ae0: 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22  ate SQL "insert"
1af0: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23   statements */.#
1b00: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20  define MODE_Tcl 
1b10: 20 20 20 20 20 36 20 20 2f 2a 20 47 65 6e 65 72       6  /* Gener
1b20: 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43  ate ANSI-C or TC
1b30: 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74  L quoted element
1b40: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
1b50: 45 5f 43 73 76 20 20 20 20 20 20 37 20 20 2f 2a  E_Csv      7  /*
1b60: 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20   Quote strings, 
1b70: 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69  numbers are plai
1b80: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  n */.#define MOD
1b90: 45 5f 4e 55 4d 5f 4f 46 20 20 20 38 20 20 2f 2a  E_NUM_OF   8  /*
1ba0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   The number of m
1bb0: 6f 64 65 73 20 28 6e 6f 74 20 61 20 6d 6f 64 65  odes (not a mode
1bc0: 20 69 74 73 65 6c 66 29 20 2a 2f 0a 0a 73 74 61   itself) */..sta
1bd0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1be0: 6d 6f 64 65 44 65 73 63 72 5b 4d 4f 44 45 5f 4e  modeDescr[MODE_N
1bf0: 55 4d 5f 4f 46 5d 20 3d 20 7b 0a 20 20 22 6c 69  UM_OF] = {.  "li
1c00: 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c  ne",.  "column",
1c10: 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65  .  "list",.  "se
1c20: 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20  mi",.  "html",. 
1c30: 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 74 63   "insert",.  "tc
1c40: 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a 7d 3b 0a  l",.  "csv",.};.
1c50: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
1c60: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
1c70: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
1c80: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
1c90: 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66  sizeof(X)/sizeof
1ca0: 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f  (X[0]))../*.** O
1cb0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
1cc0: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
1cd0: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
1ce0: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
1cf0: 65 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  entions..*/.stat
1d00: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
1d10: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c  uoted_string(FIL
1d20: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
1d30: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
1d40: 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d  .  int nSingle =
1d50: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   0;.  for(i=0; z
1d60: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
1d70: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 20  f( z[i]=='\'' ) 
1d80: 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 7d 0a 20  nSingle++;.  }. 
1d90: 20 69 66 28 20 6e 53 69 6e 67 6c 65 3d 3d 30 20   if( nSingle==0 
1da0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1db0: 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20  ut,"'%s'",z);.  
1dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1dd0: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 20  tf(out,"'");.   
1de0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
1df0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
1e00: 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b  ] && z[i]!='\'';
1e10: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
1e20: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
1e30: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27    fprintf(out,"'
1e40: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 2b 2b  '");.        z++
1e50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e60: 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a  ( z[i]=='\'' ){.
1e70: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1e80: 6f 75 74 2c 22 25 2e 2a 73 27 27 22 2c 69 2c 7a  out,"%.*s''",i,z
1e90: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  );.        z += 
1ea0: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i+1;.      }else
1eb0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1ec0: 66 28 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a 20  f(out,"%s",z);. 
1ed0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ef0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
1f00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
1f10: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
1f20: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
1f30: 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1f40: 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67  C or TCL quoting
1f50: 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   rules..*/.stati
1f60: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f  c void output_c_
1f70: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
1f80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
1f90: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
1fa0: 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c   c;.  fputc('"',
1fb0: 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20   out);.  while( 
1fc0: 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20  (c = *(z++))!=0 
1fd0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
1fe0: 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  \' ){.      fput
1ff0: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
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 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
2020: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\t' ){.      f
2030: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
2040: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27  .      fputc('t'
2050: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
2060: 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b  e if( c=='\n' ){
2070: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
2080: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
2090: 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a  putc('n', out);.
20a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20b0: 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\r' ){.      f
20c0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
20d0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27  .      fputc('r'
20e0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
20f0: 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63  e if( !isprint(c
2100: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
2110: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
2120: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
2130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
2140: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
2150: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
2160: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
2170: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
2180: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
2190: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
21a0: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
21b0: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
21c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
21d0: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
21e0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
21f0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
2200: 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   i;.  while( *z 
2210: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2220: 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 3c  z[i] && z[i]!='<
2230: 27 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 3b 20  ' && z[i]!='&'; 
2240: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
2250: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  >0 ){.      fpri
2260: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
2270: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
2280: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
2290: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
22a0: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
22b0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
22c0: 26 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  &' ){.      fpri
22d0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
22e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2300: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
2310: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74    }.}../*.** Out
2320: 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72  put a single ter
2330: 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61  m of CSV.  Actua
2340: 6c 6c 79 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  lly, p->separato
2350: 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  r is used for.**
2360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20   the separator, 
2370: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
2380: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e   not be a comma.
2390: 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 20 69    p->nullvalue i
23a0: 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61  s.** the null va
23b0: 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72  lue.  Strings ar
23c0: 65 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 41  e quoted using A
23d0: 4e 53 49 2d 43 20 72 75 6c 65 73 2e 20 20 4e 75  NSI-C rules.  Nu
23e0: 6d 62 65 72 73 0a 2a 2a 20 61 70 70 65 61 72 20  mbers.** appear 
23f0: 6f 75 74 73 69 64 65 20 6f 66 20 71 75 6f 74 65  outside of quote
2400: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2410: 64 20 6f 75 74 70 75 74 5f 63 73 76 28 73 74 72  d output_csv(str
2420: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
2430: 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  a *p, const char
2440: 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a   *z, int bSep){.
2450: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
2460: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
2470: 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76 61 6c  ,"%s",p->nullval
2480: 75 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ue);.  }else if(
2490: 20 69 73 4e 75 6d 62 65 72 28 7a 2c 20 30 29 20   isNumber(z, 0) 
24a0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
24b0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a 20  ->out,"%s",z);. 
24c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70   }else{.    outp
24d0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
24e0: 75 74 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ut, z);.  }.  if
24f0: 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 66 70  ( bSep ){.    fp
2500: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d  rintf(p->out, p-
2510: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  >separator);.  }
2520: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 49 47 49 4e  .}..#ifdef SIGIN
2530: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
2540: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
2550: 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20  he user presses 
2560: 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63  Ctrl-C.*/.static
2570: 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f   void interrupt_
2580: 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55  handler(int NotU
2590: 73 65 64 29 7b 0a 20 20 73 65 65 6e 49 6e 74 65  sed){.  seenInte
25a0: 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 69 66 28  rrupt = 1;.  if(
25b0: 20 64 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e   db ) sqlite3_in
25c0: 74 65 72 72 75 70 74 28 64 62 29 3b 0a 7d 0a 23  terrupt(db);.}.#
25d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
25e0: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
25f0: 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74  k routine that t
2600: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2610: 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  y.** invokes for
2620: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
2630: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
2640: 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62  static int callb
2650: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
2660: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
2670: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
2680: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
2690: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
26a0: 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72  k_data *p = (str
26b0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
26c0: 61 2a 29 70 41 72 67 3b 0a 20 20 73 77 69 74 63  a*)pArg;.  switc
26d0: 68 28 20 70 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20  h( p->mode ){.  
26e0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
26f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
2700: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
2710: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
2720: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2730: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2740: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
2750: 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29  strlen(azCol[i])
2760: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
2770: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2790: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 66 70   p->cnt++>0 ) fp
27a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
27b0: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
27c0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
27d0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
27e0: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
27f0: 73 5c 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s\n", w, azCol[i
2800: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
2810: 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61      azArg[i] ? a
2820: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
2830: 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  lvalue);.      }
2840: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2850: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
2860: 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20  E_Column: {.    
2870: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
2880: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
2890: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
28a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
28b0: 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t w, n;.        
28c0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
28d0: 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29  e(p->colWidth) )
28e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 77  {.             w
28f0: 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69   = p->colWidth[i
2900: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ];.          }el
2910: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2920: 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   w = 0;.        
2930: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2940: 28 20 77 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( w<=0 ){.      
2950: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
2960: 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  (azCol[i] ? azCo
2970: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
2980: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 31 30          if( w<10
2990: 20 29 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20   ) w = 10;.     
29a0: 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
29b0: 6e 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  n(azArg && azArg
29c0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
29d0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29f0: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
2a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a10: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
2a20: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
2a30: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
2a40: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
2a50: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
2a60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2a70: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
2a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a90: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
2aa0: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a  %-*.*s%s",w,w,az
2ab0: 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d  Col[i], i==nArg-
2ac0: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
2ad0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2af0: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
2b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
2b10: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
2b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2b30: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
2b40: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
2b50: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
2b60: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
2b70: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
2b80: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
2b90: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2bb0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
2bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2bd0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
2be0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22  "%-*.*s%s",w,w,"
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20  ---".           
2c20: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ---",.          
2c70: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
2c80: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
2c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cb0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
2cc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2cd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
2ce0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2cf0: 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20    int w;.       
2d00: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
2d10: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
2d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77   ){.           w
2d30: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
2d40: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  h[i];.        }e
2d50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d60: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
2d70: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
2d80: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
2d90: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
2da0: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
2db0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
2dc0: 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67  llvalue, i==nArg
2dd0: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
2de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2df0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2e00: 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a   case MODE_Semi:
2e10: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
2e20: 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ist: {.      if(
2e30: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
2e40: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
2e50: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2e60: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2e70: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2e80: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
2e90: 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72  azCol[i], i==nAr
2ea0: 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d 3e  g-1 ? "\n" : p->
2eb0: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
2ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ed0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
2ee0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2ef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
2f00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
2f10: 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
2f20: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
2f30: 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c  ==0 ) z = p->nul
2f40: 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lvalue;.        
2f50: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
2f60: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
2f70: 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29    if( i<nArg-1 )
2f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
2f90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
2fa0: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  , p->separator);
2fb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2fc0: 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
2fd0: 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20 20  _Semi ){.       
2fe0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
2ff0: 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t, ";\n");.     
3000: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3010: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3020: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
3030: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3050: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74      case MODE_Ht
3060: 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ml: {.      if( 
3070: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
3080: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
3090: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
30a0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
30b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
30c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
30d0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
30e0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 25 73 3c  (p->out,"<TH>%s<
30f0: 2f 54 48 3e 22 2c 61 7a 43 6f 6c 5b 69 5d 29 3b  /TH>",azCol[i]);
3100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3110: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
3120: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
3130: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3140: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
3150: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
3160: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
3170: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3180: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
3190: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
31a0: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
31b0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
31c0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
31d0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
31e0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
31f0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ue);.        fpr
3200: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
3210: 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  D>\n");.      }.
3220: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
3230: 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b  >out,"</TR>\n");
3240: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3250: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
3260: 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69  E_Tcl: {.      i
3270: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
3280: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
3290: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
32a0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
32b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
32c0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
32d0: 75 74 2c 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ut,azCol[i]);.  
32e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
32f0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
3300: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
3310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3320: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
3330: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
3340: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
3350: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
3360: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
3370: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
3380: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
3390: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
33a0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
33b0: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullvalue);.     
33c0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
33d0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61  t, "%s", p->sepa
33e0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
33f0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
3400: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
3410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3420: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
3430: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
3440: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
3450: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
3460: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3470: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
3480: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
3490: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 69  v(p, azCol[i], i
34a0: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
34b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69    }.        fpri
34c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
34d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34e0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
34f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
3500: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
3510: 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  ){.        outpu
3520: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
3530: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
3540: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
3550: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
3560: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3570: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
3580: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
3590: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
35a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
35b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
35c0: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41  NSERT INTO %s VA
35d0: 4c 55 45 53 28 22 2c 70 2d 3e 7a 44 65 73 74 54  LUES(",p->zDestT
35e0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  able);.      for
35f0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
3600: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3610: 20 2a 7a 53 65 70 20 3d 20 69 3e 30 20 3f 20 22   *zSep = i>0 ? "
3620: 2c 22 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ,": "";.        
3630: 69 66 28 20 61 7a 41 72 67 5b 69 5d 3d 3d 30 20  if( azArg[i]==0 
3640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
3650: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e  intf(p->out,"%sN
3660: 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20  ULL",zSep);.    
3670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
3680: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
3690: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
36a0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
36b0: 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41  "%s%s",zSep, azA
36c0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
36d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36e0: 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66   if( zSep[0] ) f
36f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
3700: 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  s",zSep);.      
3710: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
3720: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
3730: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
3740: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3750: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3760: 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut,");\n");.    
3770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3780: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3790: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
37a0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
37b0: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
37c0: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 73 74 72  allback_data str
37d0: 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65  ucture to.** the
37e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
37f0: 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70  le given.  Escap
3800: 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72  e any quote char
3810: 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  acters in the.**
3820: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a   table name..*/.
3830: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f  static void set_
3840: 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74 72 75 63  table_name(struc
3850: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
3860: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
3870: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  zName){.  int i,
3880: 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75   n;.  int needQu
3890: 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ote;.  char *z;.
38a0: 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54  .  if( p->zDestT
38b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65  able ){.    free
38c0: 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  (p->zDestTable);
38d0: 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
38e0: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
38f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
3900: 75 72 6e 3b 0a 20 20 6e 65 65 64 51 75 6f 74 65  urn;.  needQuote
3910: 20 3d 20 21 69 73 61 6c 70 68 61 28 28 75 6e 73   = !isalpha((uns
3920: 69 67 6e 65 64 20 63 68 61 72 29 2a 7a 4e 61 6d  igned char)*zNam
3930: 65 29 20 26 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f  e) && *zName!='_
3940: 27 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  ';.  for(i=n=0; 
3950: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e  zName[i]; i++, n
3960: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
3970: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
3980: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
3990: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
39a0: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f  ){.      needQuo
39b0: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  te = 1;.      if
39c0: 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27  ( zName[i]=='\''
39d0: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
39e0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
39f0: 65 20 29 20 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20  e ) n += 2;.  z 
3a00: 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  = p->zDestTable 
3a10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b  = malloc( n+1 );
3a20: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
3a30: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
3a40: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
3a50: 21 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  !\n");.    exit(
3a60: 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b  1);.  }.  n = 0;
3a70: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
3a80: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
3a90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
3aa0: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
3ab0: 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
3ac0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
3ad0: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 6e  e[i]=='\'' ) z[n
3ae0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
3af0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
3b00: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
3b10: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
3b20: 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65 72  /* zIn is either
3b30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3b40: 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
3b50: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
3b60: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
3b70: 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61  m malloc(), or a
3b80: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54   NULL pointer. T
3b90: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
3ba0: 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64 20  d to by zAppend 
3bb0: 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a  is.** added to z
3bc0: 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73 75  In, and the resu
3bd0: 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20 6d  lt returned in m
3be0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3bf0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  rom malloc()..**
3c00: 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73 20   zIn, if it was 
3c10: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65  not NULL, is fre
3c20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
3c30: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c   third argument,
3c40: 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27   quote, is not '
3c50: 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  \0', then it is 
3c60: 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71 75  used as a .** qu
3c70: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ote character fo
3c80: 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74  r zAppend..*/.st
3c90: 61 74 69 63 20 63 68 61 72 20 2a 20 61 70 70 65  atic char * appe
3ca0: 6e 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e  ndText(char *zIn
3cb0: 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41  , char const *zA
3cc0: 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74  ppend, char quot
3cd0: 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  e){.  int len;. 
3ce0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41   int i;.  int nA
3cf0: 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 28 7a  ppend = strlen(z
3d00: 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74 20 6e  Append);.  int n
3d10: 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c 65 6e  In = (zIn?strlen
3d20: 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20 20 6c 65 6e  (zIn):0);..  len
3d30: 20 3d 20 6e 41 70 70 65 6e 64 2b 6e 49 6e 2b 31   = nAppend+nIn+1
3d40: 3b 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b  ;.  if( quote ){
3d50: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20  .    len += 2;. 
3d60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
3d70: 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ppend; i++){.   
3d80: 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69     if( zAppend[i
3d90: 5d 3d 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b  ]==quote ) len++
3da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a  ;.    }.  }..  z
3db0: 49 6e 20 3d 20 28 63 68 61 72 20 2a 29 72 65 61  In = (char *)rea
3dc0: 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65 6e 29 3b 0a  lloc(zIn, len);.
3dd0: 20 20 69 66 28 20 21 7a 49 6e 20 29 7b 0a 20 20    if( !zIn ){.  
3de0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3df0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
3e00: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
3e10: 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a 20 20 20 20   &zIn[nIn];.    
3e20: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
3e30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3e40: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
3e50: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
3e60: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
3e70: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
3e80: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
3e90: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
3ea0: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
3eb0: 6f 74 65 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  ote;.    *zCsr++
3ec0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 61 73 73   = '\0';.    ass
3ed0: 65 72 74 28 20 28 7a 43 73 72 2d 7a 49 6e 29 3d  ert( (zCsr-zIn)=
3ee0: 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  =len );.  }else{
3ef0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 49 6e  .    memcpy(&zIn
3f00: 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65 6e 64 2c 20  [nIn], zAppend, 
3f10: 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 7a 49  nAppend);.    zI
3f20: 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27 5c 30 27 3b  n[len-1] = '\0';
3f30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a  .  }..  return z
3f40: 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78  In;.}.../*.** Ex
3f50: 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74  ecute a query st
3f60: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73  atement that has
3f70: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
3f80: 20 63 6f 6c 75 6d 6e 2e 20 20 50 72 69 6e 74 0a   column.  Print.
3f90: 2a 2a 20 74 68 61 74 20 72 65 73 75 6c 74 20 63  ** that result c
3fa0: 6f 6c 75 6d 6e 20 6f 6e 20 61 20 6c 69 6e 65 20  olumn on a line 
3fb0: 62 79 20 69 74 73 65 6c 66 20 77 69 74 68 20 61  by itself with a
3fc0: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
3fd0: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
3fe0: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
3ff0: 75 6d 70 5f 71 75 65 72 79 28 46 49 4c 45 20 2a  ump_query(FILE *
4000: 6f 75 74 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  out, sqlite3 *db
4010: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
4020: 65 6c 65 63 74 29 7b 0a 20 20 73 71 6c 69 74 65  elect){.  sqlite
4030: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b  3_stmt *pSelect;
4040: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
4050: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
4060: 65 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d  e(db, zSelect, -
4070: 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
4080: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4090: 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74  E_OK || !pSelect
40a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
40b0: 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
40c0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
40d0: 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ct);.  while( rc
40e0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
40f0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
4100: 20 22 25 73 3b 5c 6e 22 2c 20 73 71 6c 69 74 65   "%s;\n", sqlite
4110: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
4120: 65 6c 65 63 74 2c 20 30 29 29 3b 0a 20 20 20 20  elect, 0));.    
4130: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
4140: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  p(pSelect);.  }.
4150: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4160: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63  _finalize(pSelec
4170: 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  t);.}.../*.** Th
4180: 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
4190: 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
41a0: 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
41b0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
41c0: 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
41d0: 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
41e0: 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
41f0: 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
4200: 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
4210: 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
4220: 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
4230: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
4240: 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
4250: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
4260: 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
4270: 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
4280: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
4290: 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
42a0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
42b0: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
42c0: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
42d0: 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 72  *azCol){.  int r
42e0: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
42f0: 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *zTable;.  const
4300: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
4310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
4320: 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ;.  struct callb
4330: 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73  ack_data *p = (s
4340: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
4350: 61 74 61 20 2a 29 70 41 72 67 3b 0a 0a 20 20 69  ata *)pArg;..  i
4360: 66 28 20 6e 41 72 67 21 3d 33 20 29 20 72 65 74  f( nArg!=3 ) ret
4370: 75 72 6e 20 31 3b 0a 20 20 7a 54 61 62 6c 65 20  urn 1;.  zTable 
4380: 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54  = azArg[0];.  zT
4390: 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ype = azArg[1];.
43a0: 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32    zSql = azArg[2
43b0: 5d 3b 0a 20 20 0a 20 20 69 66 28 20 73 74 72 63  ];.  .  if( strc
43c0: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
43d0: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
43e0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
43f0: 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20  p->out, "DELETE 
4400: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75  FROM sqlite_sequ
4410: 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ence;\n");.  }el
4420: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
4430: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  able, "sqlite_st
4440: 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  at1")==0 ){.    
4450: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
4460: 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
4470: 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
4480: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
4490: 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
44a0: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
44b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
44c0: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
44d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  p->out, "%s;\n",
44e0: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69   zSql);.  }..  i
44f0: 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  f( strcmp(zType,
4500: 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a   "table")==0 ){.
4510: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4520: 20 2a 70 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30   *pTableInfo = 0
4530: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6c  ;.    char *zSel
4540: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ect = 0;.    cha
4550: 72 20 2a 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20  r *zTableInfo = 
4560: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 6d  0;.    char *zTm
4570: 70 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a  p = 0;.   .    z
4580: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
4590: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
45a0: 6f 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  o, "PRAGMA table
45b0: 5f 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20  _info(", 0);.   
45c0: 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70   zTableInfo = ap
45d0: 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49  pendText(zTableI
45e0: 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  nfo, zTable, '"'
45f0: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
4600: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
4610: 54 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c  TableInfo, ");",
4620: 20 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73   0);..    rc = s
4630: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
4640: 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f  ->db, zTableInfo
4650: 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e 66  , -1, &pTableInf
4660: 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  o, 0);.    if( z
4670: 54 61 62 6c 65 49 6e 66 6f 20 29 20 66 72 65 65  TableInfo ) free
4680: 28 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20  (zTableInfo);.  
4690: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
46a0: 5f 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e  _OK || !pTableIn
46b0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  fo ){.      retu
46c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
46d0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
46e0: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
46f0: 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49  SELECT 'INSERT I
4700: 4e 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a  NTO ' || ", 0);.
4710: 20 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e      zTmp = appen
4720: 64 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62  dText(zTmp, zTab
4730: 6c 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66  le, '"');.    if
4740: 28 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20  ( zTmp ){.      
4750: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
4760: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
4770: 6d 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 7d  mp, '\'');.    }
4780: 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61  .    zSelect = a
4790: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
47a0: 74 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45 53  t, " || ' VALUES
47b0: 28 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20  (' || ", 0);.   
47c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
47d0: 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a  ep(pTableInfo);.
47e0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
47f0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
4800: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4810: 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
4820: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
4830: 75 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65 49  umn_text(pTableI
4840: 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a  nfo, 1);.      z
4850: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
4860: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71 75  ext(zSelect, "qu
4870: 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  ote(", 0);.     
4880: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
4890: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a  dText(zSelect, z
48a0: 54 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20 20  Text, '"');.    
48b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
48c0: 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  tep(pTableInfo);
48d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
48e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
48f0: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
4900: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
4910: 74 2c 20 22 29 20 7c 7c 20 27 2c 20 27 20 7c 7c  t, ") || ', ' ||
4920: 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   ", 0);.      }e
4930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  lse{.        zSe
4940: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
4950: 74 28 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c  t(zSelect, ") ",
4960: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4970: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
4980: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61  te3_finalize(pTa
4990: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  bleInfo);.    if
49a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
49b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65  ){.      if( zSe
49c0: 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c  lect ) free(zSel
49d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ect);.      retu
49e0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
49f0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
4a00: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c  Text(zSelect, "|
4a10: 7c 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20 30  | ')' FROM  ", 0
4a20: 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d  );.    zSelect =
4a30: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c   appendText(zSel
4a40: 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  ect, zTable, '"'
4a50: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75 6e  );..    rc = run
4a60: 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
4a70: 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c  y(p->out, p->db,
4a80: 20 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69   zSelect);.    i
4a90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
4aa0: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a  RRUPT ){.      z
4ab0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
4ac0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f  ext(zSelect, " O
4ad0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
4ae0: 53 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  SC", 0);.      r
4af0: 63 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  c = run_table_du
4b00: 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c  mp_query(p->out,
4b10: 20 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 29   p->db, zSelect)
4b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4b30: 7a 53 65 6c 65 63 74 20 29 20 66 72 65 65 28 7a  zSelect ) free(z
4b40: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
4b50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4b60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4b70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4b80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4b90: 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 70   Run zQuery.  Up
4ba0: 64 61 74 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61  date dump_callba
4bb0: 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
4bc0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  back routine..**
4bd0: 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51 4c   If we get a SQL
4be0: 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
4bf0: 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75 65  r, rerun the que
4c00: 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64 69  ry after appendi
4c10: 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20  ng.** "ORDER BY 
4c20: 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20 74  rowid DESC" to t
4c30: 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  he end..*/.stati
4c40: 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61  c int run_schema
4c50: 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 73  _dump_query(.  s
4c60: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
4c70: 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74  ata *p, .  const
4c80: 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 0a 20   char *zQuery,. 
4c90: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
4ca0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
4cb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
4cc0: 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  c(p->db, zQuery,
4cd0: 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
4ce0: 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  p, pzErrMsg);.  
4cf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
4d00: 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68  ORRUPT ){.    ch
4d10: 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74  ar *zQ2;.    int
4d20: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 51   len = strlen(zQ
4d30: 75 65 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  uery);.    if( p
4d40: 7a 45 72 72 4d 73 67 20 29 20 73 71 6c 69 74 65  zErrMsg ) sqlite
4d50: 33 5f 66 72 65 65 28 2a 70 7a 45 72 72 4d 73 67  3_free(*pzErrMsg
4d60: 29 3b 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c  );.    zQ2 = mal
4d70: 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a  loc( len+100 );.
4d80: 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29      if( zQ2==0 )
4d90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
4da0: 73 70 72 69 6e 74 66 28 7a 51 32 2c 20 22 25 73  sprintf(zQ2, "%s
4db0: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
4dc0: 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a  DESC", zQuery);.
4dd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4de0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32  _exec(p->db, zQ2
4df0: 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
4e00: 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20   p, pzErrMsg);. 
4e10: 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20     free(zQ2);.  
4e20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4e30: 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20  ../*.** Text of 
4e40: 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65 0a 2a  a help message.*
4e50: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 48  /.static char zH
4e60: 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 64 61 74 61  elp[] =.  ".data
4e70: 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
4e80: 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
4e90: 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
4ea0: 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a  ed databases\n".
4eb0: 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f    ".dump ?TABLE?
4ec0: 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74   ...      Dump t
4ed0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61  he database in a
4ee0: 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61  n SQL text forma
4ef0: 74 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f 4e  t\n".  ".echo ON
4f00: 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 54  |OFF           T
4f10: 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f  urn command echo
4f20: 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
4f30: 22 2e 65 78 69 74 20 20 20 20 20 20 20 20 20 20  ".exit          
4f40: 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69          Exit thi
4f50: 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22  s program\n".  "
4f60: 2e 65 78 70 6c 61 69 6e 20 4f 4e 7c 4f 46 46 20  .explain ON|OFF 
4f70: 20 20 20 20 20 20 20 54 75 72 6e 20 6f 75 74 70         Turn outp
4f80: 75 74 20 6d 6f 64 65 20 73 75 69 74 61 62 6c 65  ut mode suitable
4f90: 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e 20   for EXPLAIN on 
4fa0: 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 2e 68  or off.\n".  ".h
4fb0: 65 61 64 65 72 28 73 29 20 4f 4e 7c 4f 46 46 20  eader(s) ON|OFF 
4fc0: 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61       Turn displa
4fd0: 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20  y of headers on 
4fe0: 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65  or off\n".  ".he
4ff0: 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lp              
5000: 20 20 20 20 53 68 6f 77 20 74 68 69 73 20 6d 65      Show this me
5010: 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70  ssage\n".  ".imp
5020: 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20  ort FILE TABLE  
5030: 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66     Import data f
5040: 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41  rom FILE into TA
5050: 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e 64 69 63  BLE\n".  ".indic
5060: 65 73 20 54 41 42 4c 45 20 20 20 20 20 20 20 20  es TABLE        
5070: 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61   Show names of a
5080: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 54 41  ll indices on TA
5090: 42 4c 45 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20  BLE\n".  ".mode 
50a0: 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20  MODE ?TABLE?    
50b0: 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   Set output mode
50c0: 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f   where MODE is o
50d0: 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20  ne of:\n".  "   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43        csv      C
5100: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76  omma-separated v
5110: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  alues\n".  "    
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
5140: 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
5150: 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
5160: 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  )\n".  "        
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c   html     HTML <
5190: 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20  table> code\n". 
51a0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
51b0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72             inser
51c0: 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
51d0: 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
51e0: 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  BLE\n".  "      
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
5210: 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e  value per line\n
5220: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
5240: 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
5250: 6c 69 6d 69 74 65 64 20 62 79 20 2e 73 65 70 61  limited by .sepa
5260: 72 61 74 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a  rator string\n".
5270: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
5280: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73              tabs
5290: 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
52a0: 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20           tcl    
52d0: 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65    TCL list eleme
52e0: 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76  nts\n".  ".nullv
52f0: 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
5300: 20 50 72 69 6e 74 20 53 54 52 49 4e 47 20 69 6e   Print STRING in
5310: 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
5320: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 75 74  alues\n".  ".out
5330: 70 75 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  put FILENAME    
5340: 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
5350: 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  o FILENAME\n".  
5360: 22 2e 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20  ".output stdout 
5370: 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
5380: 70 75 74 20 74 6f 20 74 68 65 20 73 63 72 65 65  put to the scree
5390: 6e 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  n\n".  ".prompt 
53a0: 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
53b0: 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
53c0: 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
53d0: 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
53e0: 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
53f0: 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
5400: 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
5410: 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
5420: 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
5430: 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54  n".  ".schema ?T
5440: 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f  ABLE?        Sho
5450: 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
5460: 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 73  tements\n".  ".s
5470: 65 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20  eparator STRING 
5480: 20 20 20 20 20 43 68 61 6e 67 65 20 73 65 70 61       Change sepa
5490: 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75  rator used by ou
54a0: 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69  tput mode and .i
54b0: 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e 73 68 6f  mport\n".  ".sho
54c0: 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
54d0: 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
54e0: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
54f0: 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
5500: 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 50  n".  ".tables ?P
5510: 41 54 54 45 52 4e 3f 20 20 20 20 20 20 4c 69 73  ATTERN?      Lis
5520: 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
5530: 73 20 6d 61 74 63 68 69 6e 67 20 61 20 4c 49 4b  s matching a LIK
5540: 45 20 70 61 74 74 65 72 6e 5c 6e 22 0a 20 20 22  E pattern\n".  "
5550: 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
5560: 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
5570: 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
5580: 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
5590: 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 77 69 64 74  onds\n".  ".widt
55a0: 68 20 4e 55 4d 20 4e 55 4d 20 2e 2e 2e 20 20 20  h NUM NUM ...   
55b0: 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64    Set column wid
55c0: 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e  ths for \"column
55d0: 5c 22 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a 2f 2a  \" mode\n".;../*
55e0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
55f0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
5600: 64 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  d process_input(
5610: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
5620: 64 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69  data *p, FILE *i
5630: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  n);../*.** Make 
5640: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
5650: 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69  e is open.  If i
5660: 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f  t is not, then o
5670: 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  pen it.  If.** t
5680: 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c  he database fail
5690: 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74  s to open, print
56a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
56b0: 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73  e and exit..*/.s
56c0: 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f  tatic void open_
56d0: 64 62 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61  db(struct callba
56e0: 63 6b 5f 64 61 74 61 20 2a 70 29 7b 0a 20 20 69  ck_data *p){.  i
56f0: 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
5700: 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
5710: 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
5720: 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 64 62 20  &p->db);.    db 
5730: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  = p->db;.    sql
5740: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5750: 74 69 6f 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73  tion(db, "shells
5760: 74 61 74 69 63 22 2c 20 30 2c 20 53 51 4c 49 54  tatic", 0, SQLIT
5770: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
5780: 20 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75     shellstaticFu
5790: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
57a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
57b0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
57c0: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
57d0: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
57e0: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
57f0: 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
5800: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
5810: 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  zDbFilename, sql
5820: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
5830: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
5840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5850: 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
5860: 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
5870: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 74 20 20  g..**.**    \t  
5880: 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c    -> tab.**    \
5890: 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a  n    -> newline.
58a0: 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63  **    \r    -> c
58b0: 61 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a  arriage return.*
58c0: 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73  *    \NNN  -> as
58d0: 63 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e  cii character NN
58e0: 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2a 20 20 20  N in octal.**   
58f0: 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c   \\    -> backsl
5900: 61 73 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ash.*/.static vo
5910: 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
5920: 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
5930: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a  .  int i, j, c;.
5940: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
5950: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
5960: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
5970: 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
5980: 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20  c = z[++i];.    
5990: 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a    if( c=='n' ){.
59a0: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
59b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
59c0: 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
59d0: 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
59e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
59f0: 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='r' ){.        
5a00: 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
5a10: 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27  }else if( c>='0'
5a20: 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20   && c<='7' ){.  
5a30: 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a        c -= '0';.
5a40: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
5a50: 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
5a60: 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
5a70: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
5a80: 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
5a90: 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
5aa0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
5ab0: 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
5ac0: 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
5ad0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
5ae0: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
5af0: 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
5b00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5b20: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a  }.    z[j] = c;.
5b30: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
5b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  }../*.** If an i
5b50: 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
5b60: 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
5b70: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
5b80: 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
5b90: 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
5ba0: 2a 20 52 65 74 75 72 6e 20 31 20 74 6f 20 65 78  * Return 1 to ex
5bb0: 69 74 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74  it and 0 to cont
5bc0: 69 6e 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inue..*/.static 
5bd0: 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  int do_meta_comm
5be0: 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  and(char *zLine,
5bf0: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
5c00: 5f 64 61 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74  _data *p){.  int
5c10: 20 69 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41   i = 1;.  int nA
5c20: 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  rg = 0;.  int n,
5c30: 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   c;.  int rc = 0
5c40: 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  ;.  char *azArg[
5c50: 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  50];..  /* Parse
5c60: 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
5c70: 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  into tokens..  *
5c80: 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65  /.  while( zLine
5c90: 5b 69 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61  [i] && nArg<Arra
5ca0: 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a  ySize(azArg) ){.
5cb0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
5cc0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
5cd0: 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  r)zLine[i]) ){ i
5ce0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c  ++; }.    if( zL
5cf0: 69 6e 65 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61  ine[i]==0 ) brea
5d00: 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  k;.    if( zLine
5d10: 5b 69 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69  [i]=='\'' || zLi
5d20: 6e 65 5b 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  ne[i]=='"' ){.  
5d30: 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20      int delim = 
5d40: 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20  zLine[i++];.    
5d50: 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20    azArg[nArg++] 
5d60: 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20  = &zLine[i];.   
5d70: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
5d80: 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  i] && zLine[i]!=
5d90: 64 65 6c 69 6d 20 29 7b 20 69 2b 2b 3b 20 7d 0a  delim ){ i++; }.
5da0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
5db0: 69 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  i]==delim ){.   
5dc0: 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20       zLine[i++] 
5dd0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5de0: 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22     if( delim=='"
5df0: 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ' ) resolve_back
5e00: 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
5e10: 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg-1]);.    }els
5e20: 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  e{.      azArg[n
5e30: 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
5e40: 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
5e50: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73   zLine[i] && !is
5e60: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
5e70: 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29  char)zLine[i]) )
5e80: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { i++; }.      i
5e90: 66 28 20 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c  f( zLine[i] ) zL
5ea0: 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20  ine[i++] = 0;.  
5eb0: 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b      resolve_back
5ec0: 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
5ed0: 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg-1]);.    }.  
5ee0: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
5ef0: 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a  the input line..
5f00: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d    */.  if( nArg=
5f10: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
5f20: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41    n = strlen(azA
5f30: 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a  rg[0]);.  c = az
5f40: 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69 66 28  Arg[0][0];.  if(
5f50: 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26   c=='d' && n>1 &
5f60: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
5f70: 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c  0], "databases",
5f80: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
5f90: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
5fa0: 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
5fb0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
5fc0: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
5fd0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
5fe0: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
5ff0: 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
6000: 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
6010: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
6020: 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61  E_Column;.    da
6030: 74 61 2e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d  ta.colWidth[0] =
6040: 20 33 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c   3;.    data.col
6050: 57 69 64 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20  Width[1] = 15;. 
6060: 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
6070: 5b 32 5d 20 3d 20 35 38 3b 0a 20 20 20 20 64 61  [2] = 58;.    da
6080: 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
6090: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
60a0: 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61  db, "PRAGMA data
60b0: 62 61 73 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61  base_list; ", ca
60c0: 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
60d0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
60e0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
60f0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
6100: 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
6110: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
6120: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
6130: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
6140: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
6150: 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
6160: 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c  zArg[0], "dump",
6170: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
6180: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
6190: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
61a0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
61b0: 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
61c0: 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
61d0: 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
61e0: 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
61f0: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20  a_dump_query(p, 
6200: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
6210: 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
6220: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
6230: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
6240: 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
6250: 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  L AND type=='tab
6260: 6c 65 27 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  le'", 0.      );
6270: 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
6280: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20  a_dump_query(p, 
6290: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
62a0: 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
62b0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
62c0: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
62d0: 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
62e0: 4c 20 41 4e 44 20 74 79 70 65 21 3d 27 74 61 62  L AND type!='tab
62f0: 6c 65 27 20 41 4e 44 20 74 79 70 65 21 3d 27 6d  le' AND type!='m
6300: 65 74 61 27 22 2c 20 30 0a 20 20 20 20 20 20 29  eta'", 0.      )
6310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6320: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
6330: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b  for(i=1; i<nArg;
6340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
6350: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a  ShellStatic = az
6360: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
6370: 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
6380: 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
6390: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
63a0: 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
63b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
63c0: 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
63d0: 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73   tbl_name LIKE s
63e0: 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44  hellstatic() AND
63f0: 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a   type=='table'".
6400: 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e 44            "  AND
6410: 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
6420: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 5f  0);.        run_
6430: 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
6440: 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20 22  y(p,.          "
6450: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
6460: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
6470: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
6480: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
6490: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
64a0: 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79 70  static() AND typ
64b0: 65 21 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20  e!='table'".    
64c0: 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70        "  AND typ
64d0: 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
64e0: 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 30 29 3b  l NOT NULL", 0);
64f0: 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  .        zShellS
6500: 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 20  tatic = 0;.     
6510: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6520: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
6530: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
6540: 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
6550: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
6560: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
6570: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rMsg);.    }else
6580: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
6590: 70 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b  p->out, "COMMIT;
65a0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  \n");.    }.  }e
65b0: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
65c0: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
65d0: 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e  rg[0], "echo", n
65e0: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 29  )==0 && nArg>1 )
65f0: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
6600: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
6610: 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  [1];.    int val
6620: 20 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d   = atoi(azArg[1]
6630: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  );.    for(j=0; 
6640: 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  z[j]; j++){.    
6650: 20 20 7a 5b 6a 5d 20 3d 20 74 6f 6c 6f 77 65 72    z[j] = tolower
6660: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
6670: 7a 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  z[j]);.    }.   
6680: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6f   if( strcmp(z,"o
6690: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
66a0: 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  val = 1;.    }el
66b0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
66c0: 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "yes")==0 ){.   
66d0: 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20     val = 1;.    
66e0: 7d 0a 20 20 20 20 70 2d 3e 65 63 68 6f 4f 6e 20  }.    p->echoOn 
66f0: 3d 20 76 61 6c 3b 0a 20 20 7d 65 6c 73 65 0a 0a  = val;.  }else..
6700: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
6710: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
6720: 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20  , "exit", n)==0 
6730: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
6740: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
6750: 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
6760: 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
6770: 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
6780: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 61    int j;.    sta
6790: 74 69 63 20 63 68 61 72 20 7a 4f 6e 65 5b 5d 20  tic char zOne[] 
67a0: 3d 20 22 31 22 3b 0a 20 20 20 20 63 68 61 72 20  = "1";.    char 
67b0: 2a 7a 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  *z = nArg>=2 ? a
67c0: 7a 41 72 67 5b 31 5d 20 3a 20 7a 4f 6e 65 3b 0a  zArg[1] : zOne;.
67d0: 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 74      int val = at
67e0: 6f 69 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a  oi(z);.    for(j
67f0: 3d 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  =0; z[j]; j++){.
6800: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 74 6f 6c        z[j] = tol
6810: 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63  ower((unsigned c
6820: 68 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20 20 20 7d  har)z[j]);.    }
6830: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6840: 7a 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  z,"on")==0 ){.  
6850: 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20      val = 1;.   
6860: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6870: 70 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  p(z,"yes")==0 ){
6880: 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  .      val = 1;.
6890: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 76 61 6c      }.    if(val
68a0: 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69   == 1) {.      i
68b0: 66 28 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65  f(!p->explainPre
68c0: 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20 20 20  v.valid) {.     
68d0: 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65     p->explainPre
68e0: 76 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  v.valid = 1;.   
68f0: 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50       p->explainP
6900: 72 65 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  rev.mode = p->mo
6910: 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  de;.        p->e
6920: 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48  xplainPrev.showH
6930: 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48  eader = p->showH
6940: 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  eader;.        m
6950: 65 6d 63 70 79 28 70 2d 3e 65 78 70 6c 61 69 6e  emcpy(p->explain
6960: 50 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70 2d  Prev.colWidth,p-
6970: 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  >colWidth,sizeof
6980: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
6990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
69a0: 20 57 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68   We could put th
69b0: 69 73 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68  is code under th
69c0: 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c  e !p->explainVal
69d0: 69 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64  id.      ** cond
69e0: 69 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ition so that it
69f0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74   does not execut
6a00: 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  e if we are alre
6a10: 61 64 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ady in.      ** 
6a20: 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f  explain mode. Ho
6a30: 77 65 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78  wever, always ex
6a40: 65 63 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77  ecuting it allow
6a50: 73 20 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20  s us an easy.   
6a60: 20 20 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73     ** was to res
6a70: 65 74 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f  et to explain mo
6a80: 64 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 75  de in case the u
6a90: 73 65 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ser previously. 
6aa0: 20 20 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e       ** did an .
6ab0: 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64  explain followed
6ac0: 20 62 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d   by a .width, .m
6ad0: 6f 64 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20  ode or .header. 
6ae0: 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e       ** command.
6af0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6b00: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
6b10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 2d 3e  olumn;.      p->
6b20: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a  showHeader = 1;.
6b30: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e        memset(p->
6b40: 63 6f 6c 57 69 64 74 68 2c 30 2c 41 72 72 61 79  colWidth,0,Array
6b50: 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
6b60: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  ));.      p->col
6b70: 57 69 64 74 68 5b 30 5d 20 3d 20 34 3b 0a 20 20  Width[0] = 4;.  
6b80: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
6b90: 31 5d 20 3d 20 31 34 3b 0a 20 20 20 20 20 20 70  1] = 14;.      p
6ba0: 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20  ->colWidth[2] = 
6bb0: 31 30 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  10;.      p->col
6bc0: 57 69 64 74 68 5b 33 5d 20 3d 20 31 30 3b 0a 20  Width[3] = 10;. 
6bd0: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
6be0: 5b 34 5d 20 3d 20 33 33 3b 0a 20 20 20 20 7d 65  [4] = 33;.    }e
6bf0: 6c 73 65 20 69 66 20 28 70 2d 3e 65 78 70 6c 61  lse if (p->expla
6c00: 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a  inPrev.valid) {.
6c10: 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e        p->explain
6c20: 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 30 3b 0a  Prev.valid = 0;.
6c30: 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
6c40: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d  p->explainPrev.m
6c50: 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ode;.      p->sh
6c60: 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 65 78  owHeader = p->ex
6c70: 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65  plainPrev.showHe
6c80: 61 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ader;.      memc
6c90: 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70  py(p->colWidth,p
6ca0: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f  ->explainPrev.co
6cb0: 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d  lWidth,sizeof(p-
6cc0: 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20  >colWidth));.   
6cd0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
6ce0: 28 20 63 3d 3d 27 68 27 20 26 26 20 28 73 74 72  ( c=='h' && (str
6cf0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
6d00: 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d 30 0a 20  header", n)==0. 
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
6d30: 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72      strncmp(azAr
6d40: 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c  g[0], "headers",
6d50: 20 6e 29 3d 3d 30 20 29 26 26 20 6e 41 72 67 3e   n)==0 )&& nArg>
6d60: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  1 ){.    int j;.
6d70: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
6d80: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[1];.    int 
6d90: 76 61 6c 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  val = atoi(azArg
6da0: 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  [1]);.    for(j=
6db0: 30 3b 20 7a 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  0; z[j]; j++){. 
6dc0: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 74 6f 6c 6f       z[j] = tolo
6dd0: 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  wer((unsigned ch
6de0: 61 72 29 7a 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a  ar)z[j]);.    }.
6df0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6e00: 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"on")==0 ){.   
6e10: 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20     val = 1;.    
6e20: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6e30: 28 7a 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a  (z,"yes")==0 ){.
6e40: 20 20 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20        val = 1;. 
6e50: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 73 68 6f 77     }.    p->show
6e60: 48 65 61 64 65 72 20 3d 20 76 61 6c 3b 0a 20 20  Header = val;.  
6e70: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
6e80: 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
6e90: 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c  zArg[0], "help",
6ea0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   n)==0 ){.    fp
6eb0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 7a 48 65  rintf(stderr,zHe
6ec0: 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  lp);.  }else..  
6ed0: 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
6ee0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
6ef0: 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20  "import", n)==0 
6f00: 26 26 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  && nArg>=3 ){.  
6f10: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d    char *zTable =
6f20: 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 2f 2a   azArg[2];    /*
6f30: 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
6f40: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
6f50: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 20      char *zFile 
6f60: 3d 20 61 7a 41 72 67 5b 31 5d 3b 20 20 20 20 20  = azArg[1];     
6f70: 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d  /* The file from
6f80: 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63   which to extrac
6f90: 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 73 71  t data */.    sq
6fa0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
6fb0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
6fc0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
6fd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6ff0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
7000: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7020: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
7030: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
7040: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
7050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7060: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7070: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
7080: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
7090: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
70a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
70b0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
70c0: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
70f0: 20 69 6e 20 70 2d 3e 73 65 70 61 72 61 74 6f 72   in p->separator
7100: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
7110: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7120: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
7130: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
7140: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7160: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
7170: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
7180: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
7190: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
71a0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
71b0: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
71c0: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
71d0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
71f0: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
7200: 61 6e 67 65 73 20 2a 2f 20 20 20 0a 20 20 20 20  anges */   .    
7210: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
7220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7230: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
7240: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
7250: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7260: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
7270: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
7280: 0a 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ..    nSep = str
7290: 6c 65 6e 28 70 2d 3e 73 65 70 61 72 61 74 6f 72  len(p->separator
72a0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
72b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
72c0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 6e  ntf(stderr, "non
72d0: 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
72e0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
72f0: 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
7300: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
7310: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
7320: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
7330: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
7340: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
7350: 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
7360: 6e 20 30 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  n 0;.    nByte =
7370: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
7380: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7390: 70 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a  prepare(p->db, z
73a0: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
73b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
73c0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
73d0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
73e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
73f0: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
7400: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
7410: 29 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ));.      nCol =
7420: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
7430: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
7440: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
7450: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
7460: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
7470: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
7480: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  if( nCol==0 ) re
7490: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 53 71 6c  turn 0;.    zSql
74a0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
74b0: 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
74c0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
74d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
74e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
74f0: 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71  tf(nByte+20, zSq
7500: 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  l, "INSERT INTO 
7510: 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 20  '%q' VALUES(?", 
7520: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
7530: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
7540: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
7550: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7560: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
7570: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
7580: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
7590: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
75a0: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
75b0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
75c0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
75d0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
75e0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
75f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
7600: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70  ( rc ){.      fp
7610: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
7620: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
7630: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
7640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7650: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
7660: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
7680: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
7690: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
76a0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
76b0: 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
76c0: 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73  ot open file: %s
76d0: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
76e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
76f0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
7700: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7710: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
7720: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
7730: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
7740: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
7750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7760: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
7770: 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c  (p->db, "BEGIN",
7780: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a   0, 0, 0);.    z
7790: 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54  Commit = "COMMIT
77a0: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  ";.    while( (z
77b0: 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  Line = local_get
77c0: 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20  line(0, in))!=0 
77d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
77e0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  ;.      i = 0;. 
77f0: 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
7800: 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
7810: 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
7820: 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
7830: 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26  z && *z!='\n' &&
7840: 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b 29 7b   *z!='\r'; z++){
7850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
7860: 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d  =p->separator[0]
7870: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 70   && strncmp(z, p
7880: 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e 53 65  ->separator, nSe
7890: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
78a0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
78b0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
78c0: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
78d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
78e0: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
78f0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
7900: 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
7910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7930: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  *z = 0;.      if
7940: 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
7950: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
7960: 74 64 65 72 72 2c 22 25 73 20 6c 69 6e 65 20 25  tderr,"%s line %
7970: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
7980: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
7990: 75 74 20 66 6f 75 6e 64 20 25 64 5c 6e 22 2c 0a  ut found %d\n",.
79a0: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
79b0: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
79c0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  i+1);.        zC
79d0: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
79e0: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
79f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
7a00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
7a10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7a20: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
7a30: 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
7a40: 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
7a50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7a60: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7a70: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
7a80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7a90: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
7aa0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
7ab0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
7ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7ad0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
7ae0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
7af0: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
7b00: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
7b10: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
7b20: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
7b30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7b40: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43    }.    free(azC
7b50: 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  ol);.    fclose(
7b60: 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
7b70: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
7b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
7b90: 65 63 28 70 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  ec(p->db, zCommi
7ba0: 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  t, 0, 0, 0);.  }
7bb0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
7bc0: 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
7bd0: 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73  Arg[0], "indices
7be0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
7bf0: 3e 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >1 ){.    struct
7c00: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64   callback_data d
7c10: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
7c20: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
7c30: 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
7c40: 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
7c50: 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
7c60: 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
7c70: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
7c80: 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  a.mode = MODE_Li
7c90: 73 74 3b 0a 20 20 20 20 7a 53 68 65 6c 6c 53 74  st;.    zShellSt
7ca0: 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  atic = azArg[1];
7cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
7cc0: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 22  c(p->db,.      "
7cd0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
7ce0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
7cf0: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79  .      "WHERE ty
7d00: 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
7d10: 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65  bl_name LIKE she
7d20: 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20 20  llstatic() ".   
7d30: 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
7d40: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
7d50: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  me FROM sqlite_t
7d60: 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  emp_master ".   
7d70: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
7d80: 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
7d90: 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74  ame LIKE shellst
7da0: 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20 22  atic() ".      "
7db0: 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20  ORDER BY 1",.   
7dc0: 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
7dd0: 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
7de0: 20 29 3b 0a 20 20 20 20 7a 53 68 65 6c 6c 53 74   );.    zShellSt
7df0: 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 69 66  atic = 0;.    if
7e00: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
7e10: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7e20: 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
7e30: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
7e40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
7e50: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
7e60: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
7e70: 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'm' && strncmp(a
7e80: 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c  zArg[0], "mode",
7e90: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d   n)==0 && nArg>=
7ea0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32 20  2 ){.    int n2 
7eb0: 3d 20 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 31  = strlen(azArg[1
7ec0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  ]);.    if( strn
7ed0: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
7ee0: 6e 65 22 2c 6e 32 29 3d 3d 30 0a 20 20 20 20 20  ne",n2)==0.     
7ef0: 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 73 74     ||.        st
7f00: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
7f10: 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lines",n2)==0 ){
7f20: 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
7f30: 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20   MODE_Line;.    
7f40: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
7f50: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
7f60: 6d 6e 22 2c 6e 32 29 3d 3d 30 0a 20 20 20 20 20  mn",n2)==0.     
7f70: 20 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20           ||.    
7f80: 20 20 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d            strncm
7f90: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
7fa0: 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  mns",n2)==0 ){. 
7fb0: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
7fc0: 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
7fd0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
7fe0: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74  p(azArg[1],"list
7ff0: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
8000: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
8010: 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  _List;.    }else
8020: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
8030: 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29  rg[1],"html",n2)
8040: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
8050: 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c  mode = MODE_Html
8060: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8070: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
8080: 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"tcl",n2)==0 ){
8090: 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
80a0: 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 7d   MODE_Tcl;.    }
80b0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
80c0: 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c  (azArg[1],"csv",
80d0: 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
80e0: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
80f0: 73 76 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79  sv;.      strcpy
8100: 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22  (p->separator, "
8110: 2c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ,");.    }else i
8120: 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
8130: 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d  [1],"tabs",n2)==
8140: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
8150: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
8160: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 2d 3e        strcpy(p->
8170: 73 65 70 61 72 61 74 6f 72 2c 20 22 5c 74 22 29  separator, "\t")
8180: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8190: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
81a0: 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30  ,"insert",n2)==0
81b0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
81c0: 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
81d0: 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
81e0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =3 ){.        se
81f0: 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20  t_table_name(p, 
8200: 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
8210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8220: 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
8230: 2c 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  , "table");.    
8240: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a    }.    }else {.
8250: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
8260: 64 65 72 72 2c 22 6d 6f 64 65 20 73 68 6f 75 6c  derr,"mode shoul
8270: 64 20 62 65 20 6f 6e 20 6f 66 3a 20 22 0a 20 20  d be on of: ".  
8280: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63         "column c
8290: 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c  sv html insert l
82a0: 69 6e 65 20 6c 69 73 74 20 74 61 62 73 20 74 63  ine list tabs tc
82b0: 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l\n");.    }.  }
82c0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
82d0: 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  n' && strncmp(az
82e0: 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c  Arg[0], "nullval
82f0: 75 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ue", n)==0 && nA
8300: 72 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20 73 70  rg==2 ) {.    sp
8310: 72 69 6e 74 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c  rintf(p->nullval
8320: 75 65 2c 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74  ue, "%.*s", (int
8330: 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
8340: 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llvalue)-1, azAr
8350: 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
8360: 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
8370: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
8380: 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
8390: 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
83a0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 21 3d      if( p->out!=
83b0: 73 74 64 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  stdout ){.      
83c0: 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  fclose(p->out);.
83d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
83e0: 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73  rcmp(azArg[1],"s
83f0: 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20  tdout")==0 ){.  
8400: 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
8410: 6f 75 74 3b 0a 20 20 20 20 20 20 73 74 72 63 70  out;.      strcp
8420: 79 28 70 2d 3e 6f 75 74 66 69 6c 65 2c 22 73 74  y(p->outfile,"st
8430: 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73  dout");.    }els
8440: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  e{.      p->out 
8450: 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
8460: 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
8470: 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
8480: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
8490: 73 74 64 65 72 72 2c 22 63 61 6e 27 74 20 77 72  stderr,"can't wr
84a0: 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
84b0: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
84c0: 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
84d0: 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d 20 65 6c  dout;.      } el
84e0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 73 74  se {.         st
84f0: 72 63 70 79 28 70 2d 3e 6f 75 74 66 69 6c 65 2c  rcpy(p->outfile,
8500: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
8510: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
8520: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
8530: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
8540: 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29  0], "prompt", n)
8550: 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32 20  ==0 && (nArg==2 
8560: 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20 20  || nArg==3)){.  
8570: 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29    if( nArg >= 2)
8580: 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
8590: 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72  (mainPrompt,azAr
85a0: 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[1],(int)ArrayS
85b0: 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d  ize(mainPrompt)-
85c0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
85d0: 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20  ( nArg >= 3) {. 
85e0: 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e       strncpy(con
85f0: 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72  tinuePrompt,azAr
8600: 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[2],(int)ArrayS
8610: 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  ize(continueProm
8620: 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
8630: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
8640: 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
8650: 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c  zArg[0], "quit",
8660: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
8670: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 1;.  }else.. 
8680: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 73   if( c=='r' && s
8690: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
86a0: 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26   "read", n)==0 &
86b0: 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  & nArg==2 ){.   
86c0: 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70   FILE *alt = fop
86d0: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
86e0: 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
86f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
8700: 6e 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27  ntf(stderr,"can'
8710: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
8720: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
8730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72   }else{.      pr
8740: 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
8750: 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
8760: 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
8770: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
8780: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
8790: 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
87a0: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
87b0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
87c0: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
87d0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
87e0: 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ;.    open_db(p)
87f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
8800: 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
8810: 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
8820: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
8830: 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
8840: 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
8850: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
8860: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
8870: 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d  or(i=0; azArg[1]
8880: 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b  [i]; i++) azArg[
8890: 31 5d 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  1][i] = tolower(
88a0: 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20 20  azArg[1][i]);.  
88b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
88c0: 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
88d0: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
88e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
88f0: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
8900: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
8910: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
8920: 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69  REATE TABLE sqli
8930: 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  te_master (\n". 
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
8960: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
8970: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
8980: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
89b0: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
89d0: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
89e0: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
8a00: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
8a30: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
8a40: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
8a50: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
8a60: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
8a70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
8a80: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
8a90: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
8aa0: 6c 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lv);.      }else
8ab0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
8ac0: 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d  g[1],"sqlite_tem
8ad0: 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  p_master")==0 ){
8ae0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
8af0: 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
8b00: 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
8b10: 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
8b20: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
8b30: 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  LE sqlite_temp_m
8b40: 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20  aster (\n".     
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
8b70: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
8b80: 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
8b90: 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8bb0: 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
8bc0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
8bd0: 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
8be0: 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
8bf0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
8c00: 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
8c10: 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
8c30: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
8c40: 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
8c50: 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
8c60: 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
8c70: 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
8c80: 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
8c90: 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
8ca0: 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
8cb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8cc0: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
8cd0: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
8ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
8cf0: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
8d00: 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
8d10: 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20   FROM ".        
8d20: 20 20 22 20 20 28 53 45 4c 45 43 54 20 2a 20 46    "  (SELECT * F
8d30: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
8d40: 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
8d50: 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
8d60: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
8d70: 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
8d80: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
8d90: 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
8da0: 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20  ellstatic() AND 
8db0: 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
8dc0: 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20   sql NOTNULL ". 
8dd0: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
8de0: 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c 32  BY substr(type,2
8df0: 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20  ,1), name",.    
8e00: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
8e10: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
8e20: 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
8e30: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
8e40: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8e50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
8e60: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
8e70: 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
8e80: 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  OM ".         " 
8e90: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
8ea0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
8eb0: 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
8ec0: 20 20 22 20 20 20 53 45 4c 45 43 54 20 2a 20 46    "   SELECT * F
8ed0: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
8ee0: 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20  master) ".      
8ef0: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
8f00: 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
8f10: 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
8f20: 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
8f30: 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f  _%'".         "O
8f40: 52 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74  RDER BY substr(t
8f50: 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c  ype,2,1), name",
8f60: 0a 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  .         callba
8f70: 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
8f80: 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Msg.      );.   
8f90: 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
8fa0: 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
8fb0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
8fc0: 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
8fd0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
8fe0: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
8ff0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
9000: 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
9010: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
9020: 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20 6e  , "separator", n
9030: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
9040: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70  ){.    sprintf(p
9050: 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 25 2e  ->separator, "%.
9060: 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
9070: 69 7a 65 28 70 2d 3e 73 65 70 61 72 61 74 6f 72  ize(p->separator
9080: 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
9090: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
90a0: 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
90b0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77  (azArg[0], "show
90c0: 22 2c 20 6e 29 3d 3d 30 29 7b 0a 20 20 20 20 69  ", n)==0){.    i
90d0: 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e 74  nt i;.    fprint
90e0: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
90f0: 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70   %s\n","echo", p
9100: 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20  ->echoOn ? "on" 
9110: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
9120: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
9130: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  .9s: %s\n","expl
9140: 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e  ain", p->explain
9150: 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e  Prev.valid ? "on
9160: 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66  " :"off");.    f
9170: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
9180: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61  9.9s: %s\n","hea
9190: 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65  ders", p->showHe
91a0: 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  ader ? "on" : "o
91b0: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
91c0: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
91d0: 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
91e0: 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
91f0: 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
9200: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
9210: 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
9220: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
9230: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
9240: 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
9250: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
9260: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
9270: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
9280: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  .9s: %s\n","outp
9290: 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
92c0: 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75  outfile) ? p->ou
92d0: 74 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22  tfile : "stdout"
92e0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
92f0: 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c  ->out,"%9.9s: ",
9300: 20 22 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20   "separator");. 
9310: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
9320: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
9330: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
9340: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
9350: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72  , "\n");.    fpr
9360: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
9370: 39 73 3a 20 22 2c 22 77 69 64 74 68 22 29 3b 0a  9s: ","width");.
9380: 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28      for (i=0;i<(
9390: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
93a0: 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d  >colWidth) && p-
93b0: 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20  >colWidth[i] != 
93c0: 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66  0;i++) {.      f
93d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
93e0: 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b  d ",p->colWidth[
93f0: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
9400: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
9410: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
9420: 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
9430: 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
9440: 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c  rg[0], "tables",
9450: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
9460: 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20  ar **azResult;. 
9470: 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 72 63 3b     int nRow, rc;
9480: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
9490: 73 67 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  sg;.    open_db(
94a0: 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
94b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
94c0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
94d0: 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  ble(p->db,.     
94e0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
94f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9500: 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
9510: 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61  ERE type IN ('ta
9520: 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44  ble','view') AND
9530: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
9540: 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20  sqlite_%'".     
9550: 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
9560: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9570: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
9580: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20  _temp_master ". 
9590: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
95a0: 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
95b0: 76 69 65 77 27 29 20 22 0a 20 20 20 20 20 20 20  view') ".       
95c0: 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20   "ORDER BY 1",. 
95d0: 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c 74         &azResult
95e0: 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45 72  , &nRow, 0, &zEr
95f0: 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  rMsg.      );.  
9600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
9610: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a  ShellStatic = az
9620: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63  Arg[1];.      rc
9630: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
9640: 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20  able(p->db,.    
9650: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
9660: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
9670: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
9680: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
9690: 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e  able','view') AN
96a0: 44 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 27 7c  D name LIKE '%'|
96b0: 7c 73 68 65 6c 6c 73 74 61 74 69 63 28 29 7c 7c  |shellstatic()||
96c0: 27 25 27 20 22 0a 20 20 20 20 20 20 20 20 22 55  '%' ".        "U
96d0: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
96e0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
96f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
9700: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
9710: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
9720: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
9730: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
9740: 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61 74 69 63  '%'||shellstatic
9750: 28 29 7c 7c 27 25 27 20 22 0a 20 20 20 20 20 20  ()||'%' ".      
9760: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
9770: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
9780: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
9790: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
97a0: 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
97b0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
97c0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
97d0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
97e0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
97f0: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
9800: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9810: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  (zErrMsg);.    }
9820: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9830: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9840: 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20  int len, maxlen 
9850: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
9860: 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  , j;.      int n
9870: 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74  PrintCol, nPrint
9880: 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Row;.      for(i
9890: 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b 2b  =1; i<=nRow; i++
98a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
98b0: 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29 20  zResult[i]==0 ) 
98c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
98d0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61    len = strlen(a
98e0: 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20  zResult[i]);.   
98f0: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78       if( len>max
9900: 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
9910: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
9920: 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30    nPrintCol = 80
9930: 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20  /(maxlen+2);.   
9940: 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c     if( nPrintCol
9950: 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d  <1 ) nPrintCol =
9960: 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74   1;.      nPrint
9970: 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50  Row = (nRow + nP
9980: 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72  rintCol - 1)/nPr
9990: 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f  intCol;.      fo
99a0: 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52  r(i=0; i<nPrintR
99b0: 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
99c0: 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 3d    for(j=i+1; j<=
99d0: 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52  nRow; j+=nPrintR
99e0: 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ow){.          c
99f0: 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 3d 6e 50  har *zSp = j<=nP
9a00: 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
9a10: 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 70    ";.          p
9a20: 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c 20  rintf("%s%-*s", 
9a30: 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a 52  zSp, maxlen, azR
9a40: 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73  esult[j] ? azRes
9a50: 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20 20  ult[j] : "");.  
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9a70: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
9a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9a90: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
9aa0: 6c 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  le(azResult);.  
9ab0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
9ac0: 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
9ad0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
9ae0: 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30  "timeout", n)==0
9af0: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
9b00: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
9b10: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
9b20: 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 61  timeout(p->db, a
9b30: 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a  toi(azArg[1]));.
9b40: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
9b50: 3d 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70  =='w' && strncmp
9b60: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64 74  (azArg[0], "widt
9b70: 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
9b80: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
9b90: 6a 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a  j=1; j<nArg && j
9ba0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
9bb0: 6c 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20  lWidth); j++){. 
9bc0: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
9bd0: 5b 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41  [j-1] = atoi(azA
9be0: 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[j]);.    }.  
9bf0: 7d 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66  }else..  {.    f
9c00: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
9c10: 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20  unknown command 
9c20: 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
9c30: 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20  ents: ".      " 
9c40: 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22  \"%s\". Enter \"
9c50: 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70  .help\" for help
9c60: 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
9c70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9c90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 61  n TRUE if the la
9ca0: 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63  st non-whitespac
9cb0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
9cc0: 5b 5d 20 69 73 20 61 20 73 65 6d 69 63 6f 6c 6f  [] is a semicolo
9cd0: 6e 2e 0a 2a 2a 20 7a 5b 5d 20 69 73 20 4e 20 63  n..** z[] is N c
9ce0: 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 0a  haracters long..
9cf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 65  */.static int _e
9d00: 6e 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c  nds_with_semicol
9d10: 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
9d20: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c  , int N){.  whil
9d30: 65 28 20 4e 3e 30 20 26 26 20 69 73 73 70 61 63  e( N>0 && isspac
9d40: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
9d50: 29 7a 5b 4e 2d 31 5d 29 20 29 7b 20 4e 2d 2d 3b  )z[N-1]) ){ N--;
9d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3e 30 20   }.  return N>0 
9d70: 26 26 20 7a 5b 4e 2d 31 5d 3d 3d 27 3b 27 3b 0a  && z[N-1]==';';.
9d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  }../*.** Test to
9d90: 20 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63   see if a line c
9da0: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
9db0: 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a   of whitespace..
9dc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61  */.static int _a
9dd0: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f  ll_whitespace(co
9de0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9df0: 66 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  for(; *z; z++){.
9e00: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
9e10: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
9e20: 29 7a 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  )z) ) continue;.
9e30: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
9e40: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
9e50: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
9e60: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
9e70: 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31   (*z!='*' || z[1
9e80: 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20  ]!='/') ){ z++; 
9e90: 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
9ea0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9eb0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63      z++;.      c
9ec0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
9ed0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26     if( *z=='-' &
9ee0: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
9ef0: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
9f00: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
9f10: 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b  *z!='\n' ){ z++;
9f20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d   }.      if( *z=
9f30: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9f40: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9f50: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
9f60: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9f70: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
9f80: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c  rn TRUE if the l
9f90: 69 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20  ine typed in is 
9fa0: 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74  an SQL command t
9fb0: 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a  erminator other.
9fc0: 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63  ** than a semi-c
9fd0: 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53  olon.  The SQL S
9fe0: 65 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22  erver style "go"
9ff0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65   command is unde
a000: 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20  rstood.** as is 
a010: 74 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a  the Oracle "/"..
a020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69  */.static int _i
a030: 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e  s_command_termin
a040: 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
a050: 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65  *zLine){.  while
a060: 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69  ( isspace(*(unsi
a070: 67 6e 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65  gned char*)zLine
a080: 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b  ) ){ zLine++; };
a090: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
a0a0: 3d 27 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69  ='/' && _all_whi
a0b0: 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31  tespace(&zLine[1
a0c0: 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  ]) ) return 1;  
a0d0: 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a 20 20 69  /* Oracle */.  i
a0e0: 66 28 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65  f( tolower(zLine
a0f0: 5b 30 5d 29 3d 3d 27 67 27 20 26 26 20 74 6f 6c  [0])=='g' && tol
a100: 6f 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d  ower(zLine[1])==
a110: 27 6f 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'o'.         && 
a120: 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28  _all_whitespace(
a130: 26 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20  &zLine[2]) ){.  
a140: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
a150: 53 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20  SQL Server */.  
a160: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
a170: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
a180: 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70  t from *in and p
a190: 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a  rocess it.  If *
a1a0: 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74  in==0 then input
a1b0: 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69  .** is interacti
a1c0: 76 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73  ve - the user is
a1d0: 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20   typing it it.  
a1e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74  Otherwise, input
a1f0: 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  .** is coming fr
a200: 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76  om a file or dev
a210: 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69  ice.  A prompt i
a220: 73 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73  s issued and his
a230: 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64  tory.** is saved
a240: 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69   only if input i
a250: 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20  s interactive.  
a260: 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67  An interrupt sig
a270: 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  nal will.** caus
a280: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
a290: 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  o exit immediate
a2a0: 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74  ly, unless input
a2b0: 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
a2c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a2d0: 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74  process_input(st
a2e0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
a2f0: 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  ta *p, FILE *in)
a300: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b  {.  char *zLine;
a310: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  .  char *zSql = 
a320: 30 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20  0;.  int nSql = 
a330: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  0;.  char *zErrM
a340: 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
a350: 77 68 69 6c 65 28 20 66 66 6c 75 73 68 28 70 2d  while( fflush(p-
a360: 3e 6f 75 74 29 2c 20 28 7a 4c 69 6e 65 20 3d 20  >out), (zLine = 
a370: 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a  one_input_line(z
a380: 53 71 6c 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  Sql, in))!=0 ){.
a390: 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
a3a0: 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
a3b0: 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
a3c0: 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
a3d0: 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
a3e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f  .    if( p->echo
a3f0: 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c  On ) printf("%s\
a400: 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n", zLine);.    
a410: 69 66 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20  if( (zSql==0 || 
a420: 7a 53 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f  zSql[0]==0) && _
a430: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
a440: 4c 69 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Line) ) continue
a450: 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20  ;.    if( zLine 
a460: 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  && zLine[0]=='.'
a470: 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20   && nSql==0 ){. 
a480: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 6f       int rc = do
a490: 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c  _meta_command(zL
a4a0: 69 6e 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 66  ine, p);.      f
a4b0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
a4c0: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
a4d0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
a4e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a4f0: 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d  _is_command_term
a500: 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 29 7b  inator(zLine) ){
a510: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 4c  .      strcpy(zL
a520: 69 6e 65 2c 22 3b 22 29 3b 0a 20 20 20 20 7d 0a  ine,";");.    }.
a530: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
a540: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a550: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
a560: 4c 69 6e 65 5b 69 5d 20 26 26 20 69 73 73 70 61  Line[i] && isspa
a570: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
a580: 72 29 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b  r)zLine[i]); i++
a590: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ){}.      if( zL
a5a0: 69 6e 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20  ine[i]!=0 ){.   
a5b0: 20 20 20 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c       nSql = strl
a5c0: 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  en(zLine);.     
a5d0: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
a5e0: 28 20 6e 53 71 6c 2b 31 20 29 3b 0a 20 20 20 20  ( nSql+1 );.    
a5f0: 20 20 20 20 73 74 72 63 70 79 28 7a 53 71 6c 2c      strcpy(zSql,
a600: 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d   zLine);.      }
a610: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a620: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
a630: 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  en(zLine);.     
a640: 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28   zSql = realloc(
a650: 20 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20 6c 65   zSql, nSql + le
a660: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 69  n + 2 );.      i
a670: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
a680: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
a690: 64 65 72 72 2c 22 25 73 3a 20 6f 75 74 20 6f 66  derr,"%s: out of
a6a0: 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20 41 72 67   memory!\n", Arg
a6b0: 76 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  v0);.        exi
a6c0: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
a6d0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 71 6c      strcpy(&zSql
a6e0: 5b 6e 53 71 6c 2b 2b 5d 2c 20 22 5c 6e 22 29 3b  [nSql++], "\n");
a6f0: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
a700: 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65  Sql[nSql], zLine
a710: 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d  );.      nSql +=
a720: 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20   len;.    }.    
a730: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
a740: 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f 65 6e   if( zSql && _en
a750: 64 73 5f 77 69 74 68 5f 73 65 6d 69 63 6f 6c 6f  ds_with_semicolo
a760: 6e 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 26 26  n(zSql, nSql) &&
a770: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
a780: 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  e(zSql) ){.     
a790: 20 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20   p->cnt = 0;.   
a7a0: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
a7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a7c0: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53  3_exec(p->db, zS
a7d0: 71 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ql, callback, p,
a7e0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
a7f0: 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
a800: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Msg ){.        i
a810: 66 28 20 69 6e 21 3d 30 20 26 26 20 21 70 2d 3e  f( in!=0 && !p->
a820: 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28  echoOn ) printf(
a830: 22 25 73 5c 6e 22 2c 7a 53 71 6c 29 3b 0a 20 20  "%s\n",zSql);.  
a840: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
a850: 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
a860: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20 65 72    printf("SQL er
a870: 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
a880: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
a890: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
a8a0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
a8b0: 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
a8c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a8d0: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 53         printf("S
a8e0: 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
a8f0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
a900: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
a910: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a920: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
a930: 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20     zSql = 0;.   
a940: 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20     nSql = 0;.   
a950: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71   }.  }.  if( zSq
a960: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 5f 61  l ){.    if( !_a
a970: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53  ll_whitespace(zS
a980: 71 6c 29 20 29 20 70 72 69 6e 74 66 28 22 49 6e  ql) ) printf("In
a990: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a 20 25 73  complete SQL: %s
a9a0: 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
a9b0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
a9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a9d0: 61 20 70 61 74 68 6e 61 6d 65 20 77 68 69 63 68  a pathname which
a9e0: 20 69 73 20 74 68 65 20 75 73 65 72 27 73 20 68   is the user's h
a9f0: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ome directory.  
aa00: 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e 20 69 6e  A.** 0 return in
aa10: 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72  dicates an error
aa20: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
aa30: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
aa40: 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 73  e.** resulting s
aa50: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
aa60: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
aa70: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
aa80: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
aa90: 20 66 72 65 65 20 74 68 65 20 72 65 73 75 6c 74   free the result
aaa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
aab0: 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28   *find_home_dir(
aac0: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 68  void){.  char *h
aad0: 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a  ome_dir = NULL;.
aae0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
aaf0: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
ab00: 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  d(WIN32) && !def
ab10: 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f 5f 29 0a  ined(__MACOS__).
ab20: 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20    struct passwd 
ab30: 2a 70 77 65 6e 74 3b 0a 20 20 75 69 64 5f 74 20  *pwent;.  uid_t 
ab40: 75 69 64 20 3d 20 67 65 74 75 69 64 28 29 3b 0a  uid = getuid();.
ab50: 20 20 69 66 28 20 28 70 77 65 6e 74 3d 67 65 74    if( (pwent=get
ab60: 70 77 75 69 64 28 75 69 64 29 29 20 21 3d 20 4e  pwuid(uid)) != N
ab70: 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
ab80: 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f  dir = pwent->pw_
ab90: 64 69 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dir;.  }.#endif.
aba0: 0a 23 69 66 64 65 66 20 5f 5f 4d 41 43 4f 53 5f  .#ifdef __MACOS_
abb0: 5f 0a 20 20 63 68 61 72 20 68 6f 6d 65 5f 70 61  _.  char home_pa
abc0: 74 68 5b 5f 4d 41 58 5f 50 41 54 48 2b 31 5d 3b  th[_MAX_PATH+1];
abd0: 0a 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65  .  home_dir = ge
abe0: 74 63 77 64 28 68 6f 6d 65 5f 70 61 74 68 2c 20  tcwd(home_path, 
abf0: 5f 4d 41 58 5f 50 41 54 48 29 3b 0a 23 65 6e 64  _MAX_PATH);.#end
ac00: 69 66 0a 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f  if..  if (!home_
ac10: 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  dir) {.    home_
ac20: 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  dir = getenv("HO
ac30: 4d 45 22 29 3b 0a 20 20 20 20 69 66 20 28 21 68  ME");.    if (!h
ac40: 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 20  ome_dir) {.     
ac50: 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65   home_dir = gete
ac60: 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29 3b 20  nv("HOMEPATH"); 
ac70: 2f 2a 20 57 69 6e 64 6f 77 73 3f 20 2a 2f 0a 20  /* Windows? */. 
ac80: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 64 65     }.  }..#if de
ac90: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
aca0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
acb0: 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29    if (!home_dir)
acc0: 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
acd0: 3d 20 22 63 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64  = "c:";.  }.#end
ace0: 69 66 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64  if..  if( home_d
acf0: 69 72 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ir ){.    char *
ad00: 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  z = malloc( strl
ad10: 65 6e 28 68 6f 6d 65 5f 64 69 72 29 2b 31 20 29  en(home_dir)+1 )
ad20: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 20 73 74  ;.    if( z ) st
ad30: 72 63 70 79 28 7a 2c 20 68 6f 6d 65 5f 64 69 72  rcpy(z, home_dir
ad40: 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  );.    home_dir 
ad50: 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = z;.  }..  retu
ad60: 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a  rn home_dir;.}..
ad70: 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
ad80: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67   from the file g
ad90: 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63  iven by sqliterc
ada0: 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69  _override.  Or i
adb0: 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65  f that.** parame
adc0: 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b  ter is NULL, tak
add0: 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e  e input from ~/.
ade0: 73 71 6c 69 74 65 72 63 0a 2a 2f 0a 73 74 61 74  sqliterc.*/.stat
adf0: 69 63 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f  ic void process_
ae00: 73 71 6c 69 74 65 72 63 28 0a 20 20 73 74 72 75  sqliterc(.  stru
ae10: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
ae20: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43   *p,        /* C
ae30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
ae40: 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
ae50: 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72  r *sqliterc_over
ae60: 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ride   /* Name o
ae70: 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e  f config file. N
ae80: 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75  ULL to use defau
ae90: 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  lt */.){.  char 
aea0: 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c  *home_dir = NULL
aeb0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
aec0: 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74  sqliterc = sqlit
aed0: 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20  erc_override;.  
aee0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 46 49  char *zBuf;.  FI
aef0: 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 0a  LE *in = NULL;..
af00: 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20 3d    if (sqliterc =
af10: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f  = NULL) {.    ho
af20: 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f  me_dir = find_ho
af30: 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 69 66  me_dir();.    if
af40: 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b  ( home_dir==0 ){
af50: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
af60: 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e 6e 6f  tderr,"%s: canno
af70: 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20 68 6f  t locate your ho
af80: 6d 65 20 64 69 72 65 63 74 6f 72 79 21 5c 6e 22  me directory!\n"
af90: 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20  , Argv0);.      
afa0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
afb0: 20 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28    zBuf = malloc(
afc0: 73 74 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29  strlen(home_dir)
afd0: 20 2b 20 31 35 29 3b 0a 20 20 20 20 69 66 28 20   + 15);.    if( 
afe0: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
aff0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b000: 22 25 73 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  "%s: out of memo
b010: 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ry!\n", Argv0);.
b020: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
b030: 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66     }.    sprintf
b040: 28 7a 42 75 66 2c 22 25 73 2f 2e 73 71 6c 69 74  (zBuf,"%s/.sqlit
b050: 65 72 63 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a  erc",home_dir);.
b060: 20 20 20 20 66 72 65 65 28 68 6f 6d 65 5f 64 69      free(home_di
b070: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 72 63  r);.    sqliterc
b080: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
b090: 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  zBuf;.  }.  in =
b0a0: 20 66 6f 70 65 6e 28 73 71 6c 69 74 65 72 63 2c   fopen(sqliterc,
b0b0: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
b0c0: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61 74 74  ){.    if( isatt
b0d0: 79 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29  y(fileno(stdout)
b0e0: 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  ) ){.      print
b0f0: 66 28 22 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75  f("Loading resou
b100: 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c  rces from %s\n",
b110: 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d  sqliterc);.    }
b120: 0a 20 20 20 20 70 72 6f 63 65 73 73 5f 69 6e 70  .    process_inp
b130: 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20 20 66 63  ut(p,in);.    fc
b140: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20  lose(in);.  }.  
b150: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b160: 20 53 68 6f 77 20 61 76 61 69 6c 61 62 6c 65 20   Show available 
b170: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
b180: 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ions.*/.static c
b190: 6f 6e 73 74 20 63 68 61 72 20 7a 4f 70 74 69 6f  onst char zOptio
b1a0: 6e 73 5b 5d 20 3d 20 0a 20 20 22 20 20 20 2d 69  ns[] = .  "   -i
b1b0: 6e 69 74 20 66 69 6c 65 6e 61 6d 65 20 20 20 20  nit filename    
b1c0: 20 20 20 72 65 61 64 2f 70 72 6f 63 65 73 73 20     read/process 
b1d0: 6e 61 6d 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20  named file\n".  
b1e0: 22 20 20 20 2d 65 63 68 6f 20 20 20 20 20 20 20  "   -echo       
b1f0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 63           print c
b200: 6f 6d 6d 61 6e 64 73 20 62 65 66 6f 72 65 20 65  ommands before e
b210: 78 65 63 75 74 69 6f 6e 5c 6e 22 0a 20 20 22 20  xecution\n".  " 
b220: 20 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20 20    -[no]header   
b230: 20 20 20 20 20 20 20 74 75 72 6e 20 68 65 61 64         turn head
b240: 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ers on or off\n"
b250: 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20  .  "   -column  
b260: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
b270: 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
b280: 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20  column'\n".  "  
b290: 20 2d 68 74 6d 6c 20 20 20 20 20 20 20 20 20 20   -html          
b2a0: 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
b2b0: 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c 5c 6e 22   mode to HTML\n"
b2c0: 0a 20 20 22 20 20 20 2d 6c 69 6e 65 20 20 20 20  .  "   -line    
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
b2e0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
b2f0: 6c 69 6e 65 27 5c 6e 22 0a 20 20 22 20 20 20 2d  line'\n".  "   -
b300: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
b310: 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
b320: 6f 64 65 20 74 6f 20 27 6c 69 73 74 27 5c 6e 22  ode to 'list'\n"
b330: 0a 20 20 22 20 20 20 2d 73 65 70 61 72 61 74 6f  .  "   -separato
b340: 72 20 27 78 27 20 20 20 20 20 20 20 73 65 74 20  r 'x'       set 
b350: 6f 75 74 70 75 74 20 66 69 65 6c 64 20 73 65 70  output field sep
b360: 61 72 61 74 6f 72 20 28 7c 29 5c 6e 22 0a 20 20  arator (|)\n".  
b370: 22 20 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 27  "   -nullvalue '
b380: 74 65 78 74 27 20 20 20 20 73 65 74 20 74 65 78  text'    set tex
b390: 74 20 73 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c  t string for NUL
b3a0: 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  L values\n".  " 
b3b0: 20 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20 20    -version      
b3c0: 20 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c 69         show SQLi
b3d0: 74 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20  te version\n".  
b3e0: 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20  "   -help       
b3f0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
b400: 69 73 20 74 65 78 74 2c 20 61 6c 73 6f 20 73 68  is text, also sh
b410: 6f 77 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 73 5c  ow dot-commands\
b420: 6e 22 0a 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  n".;.static void
b430: 20 75 73 61 67 65 28 69 6e 74 20 73 68 6f 77 44   usage(int showD
b440: 65 74 61 69 6c 29 7b 0a 20 20 66 70 72 69 6e 74  etail){.  fprint
b450: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
b460: 3a 20 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46  : %s [OPTIONS] F
b470: 49 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22  ILENAME [SQL]\n"
b480: 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20  , Argv0);.  if( 
b490: 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20  showDetail ){.  
b4a0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b4b0: 2c 20 22 4f 70 74 69 6f 6e 73 20 61 72 65 3a 5c  , "Options are:\
b4c0: 6e 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b  n%s", zOptions);
b4d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
b4e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
b4f0: 73 65 20 74 68 65 20 2d 68 65 6c 70 20 6f 70 74  se the -help opt
b500: 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
b510: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  al information\n
b520: 22 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 31  ");.  }.  exit(1
b530: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
b540: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65  ialize the state
b550: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
b560: 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  data.*/.static v
b570: 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74 28 73 74  oid main_init(st
b580: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
b590: 74 61 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65  ta *data) {.  me
b5a0: 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73 69  mset(data, 0, si
b5b0: 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20 20  zeof(*data));.  
b5c0: 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44  data->mode = MOD
b5d0: 45 5f 4c 69 73 74 3b 0a 20 20 73 74 72 63 70 79  E_List;.  strcpy
b5e0: 28 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f 72  (data->separator
b5f0: 2c 22 7c 22 29 3b 0a 20 20 64 61 74 61 2d 3e 73  ,"|");.  data->s
b600: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
b610: 20 73 74 72 63 70 79 28 6d 61 69 6e 50 72 6f 6d   strcpy(mainProm
b620: 70 74 2c 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a  pt,"sqlite> ");.
b630: 20 20 73 74 72 63 70 79 28 63 6f 6e 74 69 6e 75    strcpy(continu
b640: 65 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e  ePrompt,"   ...>
b650: 20 22 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e   ");.}..int main
b660: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
b670: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
b680: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
b690: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
b6a0: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 63 6f 6e  data data;.  con
b6b0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 46 69  st char *zInitFi
b6c0: 6c 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  le = 0;.  char *
b6d0: 7a 46 69 72 73 74 43 6d 64 20 3d 20 30 3b 0a 20  zFirstCmd = 0;. 
b6e0: 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
b6f0: 5f 5f 4d 41 43 4f 53 5f 5f 0a 20 20 61 72 67 63  __MACOS__.  argc
b700: 20 3d 20 63 63 6f 6d 6d 61 6e 64 28 26 61 72 67   = ccommand(&arg
b710: 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 41 72  v);.#endif..  Ar
b720: 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  gv0 = argv[0];. 
b730: 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74 61   main_init(&data
b740: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
b750: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
b760: 69 64 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c 65  id signal handle
b770: 72 20 65 61 72 6c 79 2c 20 62 65 66 6f 72 65 20  r early, before 
b780: 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 65 6c  anything.  ** el
b790: 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  se is done..  */
b7a0: 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a 20  .#ifdef SIGINT. 
b7b0: 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20   signal(SIGINT, 
b7c0: 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65  interrupt_handle
b7d0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  r);.#endif..  /*
b7e0: 20 44 6f 20 61 6e 20 69 6e 69 74 69 61 6c 20 70   Do an initial p
b7f0: 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
b800: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
b810: 75 6d 65 6e 74 20 74 6f 20 6c 6f 63 61 74 65 0a  ument to locate.
b820: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
b830: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b840: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  le, the name of 
b850: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
b860: 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 61 6e  on file,.  ** an
b870: 64 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  d the first comm
b880: 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  and to execute..
b890: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
b8a0: 69 3c 61 72 67 63 2d 31 3b 20 69 2b 2b 29 7b 0a  i<argc-1; i++){.
b8b0: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
b8c0: 30 5d 21 3d 27 2d 27 20 29 20 62 72 65 61 6b 3b  0]!='-' ) break;
b8d0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
b8e0: 61 72 67 76 5b 69 5d 2c 22 2d 73 65 70 61 72 61  argv[i],"-separa
b8f0: 74 6f 72 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  tor")==0 || strc
b900: 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 6e 75 6c  mp(argv[i],"-nul
b910: 6c 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20  lvalue")==0 ){. 
b920: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65       i++;.    }e
b930: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
b940: 72 67 76 5b 69 5d 2c 22 2d 69 6e 69 74 22 29 3d  rgv[i],"-init")=
b950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
b960: 0a 20 20 20 20 20 20 7a 49 6e 69 74 46 69 6c 65  .      zInitFile
b970: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
b980: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
b990: 28 61 72 67 76 5b 69 5d 2c 22 2d 6b 65 79 22 29  (argv[i],"-key")
b9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
b9b0: 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 4b 65  ;.      data.zKe
b9c0: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
b9d0: 6e 74 66 28 22 25 73 22 2c 61 72 67 76 5b 69 5d  ntf("%s",argv[i]
b9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
b9f0: 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 20 20 20  f( i<argc ){.   
ba00: 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d   data.zDbFilenam
ba10: 65 20 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20  e = argv[i++];. 
ba20: 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
ba30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
ba40: 52 59 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44  RYDB.    data.zD
ba50: 62 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65  bFilename = ":me
ba60: 6d 6f 72 79 3a 22 3b 0a 23 65 6c 73 65 0a 20 20  mory:";.#else.  
ba70: 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61    data.zDbFilena
ba80: 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  me = 0;.#endif. 
ba90: 20 7d 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20   }.  if( i<argc 
baa0: 29 7b 0a 20 20 20 20 7a 46 69 72 73 74 43 6d 64  ){.    zFirstCmd
bab0: 20 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20   = argv[i++];.  
bac0: 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73  }.  data.out = s
bad0: 74 64 6f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53  tdout;..#ifdef S
bae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
baf0: 59 44 42 0a 20 20 69 66 28 20 64 61 74 61 2e 7a  YDB.  if( data.z
bb00: 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  DbFilename==0 ){
bb10: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
bb20: 65 72 72 2c 22 25 73 3a 20 6e 6f 20 64 61 74 61  err,"%s: no data
bb30: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70  base filename sp
bb40: 65 63 69 66 69 65 64 5c 6e 22 2c 20 61 72 67 76  ecified\n", argv
bb50: 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
bb60: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
bb70: 20 2f 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64   /* Go ahead and
bb80: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
bb90: 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c  se file if it al
bba0: 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 49  ready exists.  I
bbb0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  f the.  ** file 
bbc0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
bbd0: 64 65 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74  delay opening it
bbe0: 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  .  This prevents
bbf0: 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a   empty database.
bc00: 20 20 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20    ** files from 
bc10: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 69 66  being created if
bc20: 20 61 20 75 73 65 72 20 6d 69 73 74 79 70 65 73   a user mistypes
bc30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
bc40: 6d 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a  me argument.  **
bc50: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63   to the sqlite c
bc60: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c  ommand-line tool
bc70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63  ..  */.  if( acc
bc80: 65 73 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65  ess(data.zDbFile
bc90: 6e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  name, 0)==0 ){. 
bca0: 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
bcb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f  );.  }..  /* Pro
bcc0: 63 65 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c  cess the initial
bcd0: 69 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20  ization file if 
bce0: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
bcf0: 66 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f  f no -init optio
bd00: 6e 0a 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20  n.  ** is given 
bd10: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
bd20: 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20  ine, look for a 
bd30: 66 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71  file named ~/.sq
bd40: 6c 69 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20  literc and.  ** 
bd50: 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69  try to process i
bd60: 74 2e 0a 20 20 2a 2f 0a 20 20 70 72 6f 63 65 73  t..  */.  proces
bd70: 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74 61  s_sqliterc(&data
bd80: 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 0a 20 20  ,zInitFile);..  
bd90: 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64  /* Make a second
bda0: 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
bdb0: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
bdc0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a  rgument and set.
bdd0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54    ** options.  T
bde0: 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20  his second pass 
bdf0: 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
be00: 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74 69   after the initi
be10: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66  alization.  ** f
be20: 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ile is processed
be30: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d   so that the com
be40: 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65  mand-line argume
be50: 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64  nts will overrid
be60: 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20  e.  ** settings 
be70: 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
be80: 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f  ation file..  */
be90: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
bea0: 67 63 20 26 26 20 61 72 67 76 5b 69 5d 5b 30 5d  gc && argv[i][0]
beb0: 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  =='-'; i++){.   
bec0: 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
bed0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  i];.    if( strc
bee0: 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30  mp(z,"-init")==0
bef0: 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6b   || strcmp(z,"-k
bf00: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
bf10: 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   i++;.    }else 
bf20: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
bf30: 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tml")==0 ){.    
bf40: 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
bf50: 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c  DE_Html;.    }el
bf60: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
bf70: 22 2d 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20  "-list")==0 ){. 
bf80: 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d       data.mode =
bf90: 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
bfa0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
bfb0: 28 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29  (z,"-line")==0 )
bfc0: 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
bfd0: 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20  e = MODE_Line;. 
bfe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
bff0: 63 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29  cmp(z,"-column")
c000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
c010: 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f  a.mode = MODE_Co
c020: 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20  lumn;.    }else 
c030: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73  if( strcmp(z,"-s
c040: 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 29 7b  eparator")==0 ){
c050: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
c060: 20 20 73 70 72 69 6e 74 66 28 64 61 74 61 2e 73    sprintf(data.s
c070: 65 70 61 72 61 74 6f 72 2c 22 25 2e 2a 73 22 2c  eparator,"%.*s",
c080: 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74 61  (int)sizeof(data
c090: 2e 73 65 70 61 72 61 74 6f 72 29 2d 31 2c 61 72  .separator)-1,ar
c0a0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  gv[i]);.    }els
c0b0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
c0c0: 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20  -nullvalue")==0 
c0d0: 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
c0e0: 20 20 20 20 73 70 72 69 6e 74 66 28 64 61 74 61      sprintf(data
c0f0: 2e 6e 75 6c 6c 76 61 6c 75 65 2c 22 25 2e 2a 73  .nullvalue,"%.*s
c100: 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61  ",(int)sizeof(da
c110: 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c  ta.nullvalue)-1,
c120: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  argv[i]);.    }e
c130: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
c140: 2c 22 2d 68 65 61 64 65 72 22 29 3d 3d 30 20 29  ,"-header")==0 )
c150: 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68 6f  {.      data.sho
c160: 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
c170: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
c180: 70 28 7a 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29  p(z,"-noheader")
c190: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
c1a0: 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
c1b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c1c0: 73 74 72 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22  strcmp(z,"-echo"
c1d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
c1e0: 74 61 2e 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20  ta.echoOn = 1;. 
c1f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
c200: 63 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22  cmp(z,"-version"
c210: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
c220: 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 73 71 6c  intf("%s\n", sql
c230: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
c240: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
c250: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
c260: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c  ( strcmp(z,"-hel
c270: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
c280: 75 73 61 67 65 28 31 29 3b 0a 20 20 20 20 7d 65  usage(1);.    }e
c290: 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
c2a0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 75  tf(stderr,"%s: u
c2b0: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
c2c0: 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b  s\n", Argv0, z);
c2d0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
c2e0: 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
c2f0: 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
c300: 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
c310: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
c320: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 46   }.  }..  if( zF
c330: 69 72 73 74 43 6d 64 20 29 7b 0a 20 20 20 20 2f  irstCmd ){.    /
c340: 2a 20 52 75 6e 20 6a 75 73 74 20 74 68 65 20 63  * Run just the c
c350: 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66 6f 6c 6c  ommand that foll
c360: 6f 77 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ows the database
c370: 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a 20 20 20   name.    */.   
c380: 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 5b 30   if( zFirstCmd[0
c390: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
c3a0: 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
c3b0: 7a 46 69 72 73 74 43 6d 64 2c 20 26 64 61 74 61  zFirstCmd, &data
c3c0: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30 29  );.      exit(0)
c3d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c3e0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
c3f0: 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b   open_db(&data);
c400: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c410: 74 65 33 5f 65 78 65 63 28 64 61 74 61 2e 64 62  te3_exec(data.db
c420: 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20 63 61 6c  , zFirstCmd, cal
c430: 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
c440: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  ErrMsg);.      i
c450: 66 28 20 72 63 21 3d 30 20 26 26 20 7a 45 72 72  f( rc!=0 && zErr
c460: 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
c470: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
c480: 2c 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c  ,"SQL error: %s\
c490: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
c4a0: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
c4b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c4c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e  else{.    /* Run
c4d0: 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65 69 76   commands receiv
c4e0: 65 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64  ed from standard
c4f0: 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20   input.    */.  
c500: 20 20 69 66 28 20 69 73 61 74 74 79 28 66 69 6c    if( isatty(fil
c510: 65 6e 6f 28 73 74 64 6f 75 74 29 29 20 26 26 20  eno(stdout)) && 
c520: 69 73 61 74 74 79 28 66 69 6c 65 6e 6f 28 73 74  isatty(fileno(st
c530: 64 69 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 63  din)) ){.      c
c540: 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20  har *zHome;.    
c550: 20 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79    char *zHistory
c560: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 72 69 6e   = 0;.      prin
c570: 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 51 4c  tf(.        "SQL
c580: 69 74 65 20 76 65 72 73 69 6f 6e 20 25 73 5c 6e  ite version %s\n
c590: 22 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72  ".        "Enter
c5a0: 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 69   \".help\" for i
c5b0: 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 2c 0a  nstructions\n",.
c5c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c5d0: 6c 69 62 76 65 72 73 69 6f 6e 28 29 0a 20 20 20  libversion().   
c5e0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 48 6f 6d     );.      zHom
c5f0: 65 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  e = find_home_di
c600: 72 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  r();.      if( z
c610: 48 6f 6d 65 20 26 26 20 28 7a 48 69 73 74 6f 72  Home && (zHistor
c620: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 74 72 6c 65  y = malloc(strle
c630: 6e 28 7a 48 6f 6d 65 29 2b 32 30 29 29 21 3d 30  n(zHome)+20))!=0
c640: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
c650: 6e 74 66 28 7a 48 69 73 74 6f 72 79 2c 22 25 73  ntf(zHistory,"%s
c660: 2f 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79  /.sqlite_history
c670: 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20  ", zHome);.     
c680: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48   }.#if defined(H
c690: 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26  AVE_READLINE) &&
c6a0: 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d   HAVE_READLINE==
c6b0: 31 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69 73  1.      if( zHis
c6c0: 74 6f 72 79 20 29 20 72 65 61 64 5f 68 69 73 74  tory ) read_hist
c6d0: 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b 0a 23  ory(zHistory);.#
c6e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 72 6f 63  endif.      proc
c6f0: 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c  ess_input(&data,
c700: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
c710: 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
c720: 20 20 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72     stifle_histor
c730: 79 28 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20  y(100);.        
c740: 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48  write_history(zH
c750: 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d  istory);.      }
c760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c770: 20 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28    process_input(
c780: 26 64 61 74 61 2c 20 73 74 64 69 6e 29 3b 0a 20  &data, stdin);. 
c790: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 5f 74     }.  }.  set_t
c7a0: 61 62 6c 65 5f 6e 61 6d 65 28 26 64 61 74 61 2c  able_name(&data,
c7b0: 20 30 29 3b 0a 20 20 69 66 28 20 64 62 20 29 20   0);.  if( db ) 
c7c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
c7d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c7e0: 0a                                               .