/ Hex Artifact Content
Login

Artifact 4b835fe734304ac22a3385868cd3790c1e4f7aa1:


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 34 20 32  hell.c,v 1.184 2
0200: 30 30 38 2f 30 37 2f 31 31 20 31 37 3a 32 33 3a  008/07/11 17:23:
0210: 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  25 drh Exp $.*/.
0220: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0230: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0240: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0250: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0260: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0270: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0280: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0290: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
02a0: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23 69 66 20  <stdarg.h>..#if 
02b0: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
02c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e   && !defined(WIN
02d0: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
02e0: 5f 5f 4f 53 32 5f 5f 29 0a 23 20 69 6e 63 6c 75  __OS2__).# inclu
02f0: 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 20  de <signal.h>.# 
0300: 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a  include <pwd.h>.
0310: 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  # include <unist
0320: 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  d.h>.# include <
0330: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 65 6e  sys/types.h>.#en
0340: 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 4f 53  dif..#ifdef __OS
0350: 32 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  2__.# include <u
0360: 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a  nistd.h>.#endif.
0370: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
0380: 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48  E_READLINE) && H
0390: 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a  AVE_READLINE==1.
03a0: 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c  # include <readl
03b0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
03c0: 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c  # include <readl
03d0: 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23  ine/history.h>.#
03e0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 65  else.# define re
03f0: 61 64 6c 69 6e 65 28 70 29 20 6c 6f 63 61 6c 5f  adline(p) local_
0400: 67 65 74 6c 69 6e 65 28 70 2c 73 74 64 69 6e 29  getline(p,stdin)
0410: 0a 23 20 64 65 66 69 6e 65 20 61 64 64 5f 68 69  .# define add_hi
0420: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0430: 65 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  e read_history(X
0440: 29 0a 23 20 64 65 66 69 6e 65 20 77 72 69 74 65  ).# define write
0450: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0460: 66 69 6e 65 20 73 74 69 66 6c 65 5f 68 69 73 74  fine stifle_hist
0470: 6f 72 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 23  ory(X).#endif..#
0480: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0490: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
04a0: 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  N32).# include <
04b0: 69 6f 2e 68 3e 0a 23 65 6c 73 65 0a 2f 2a 20 4d  io.h>.#else./* M
04c0: 61 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28  ake sure isatty(
04d0: 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70  ) has a prototyp
04e0: 65 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  e..*/.extern int
04f0: 20 69 73 61 74 74 79 28 29 3b 0a 23 65 6e 64 69   isatty();.#endi
0500: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0510: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0520: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0530: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0540: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0550: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0560: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0570: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
0580: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
0590: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
05a0: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
05b0: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
05c0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
05d0: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
05e0: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  x) 1.#endif..#if
05f0: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
0600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
0610: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
0620: 28 5f 5f 4f 53 32 5f 5f 29 0a 23 69 6e 63 6c 75  (__OS2__).#inclu
0630: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0640: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
0650: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 53 61  source.h>../* Sa
0660: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
0670: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
0680: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
0690: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
06a0: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
06b0: 67 65 20 73 42 65 67 69 6e 3b 0a 0a 2f 2a 20 54  ge sBegin;../* T
06c0: 72 75 65 20 69 66 20 74 68 65 20 74 69 6d 65 72  rue if the timer
06d0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
06e0: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65  tatic int enable
06f0: 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  Timer = 0;../*.*
0700: 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61  * Begin timing a
0710: 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73  n operation.*/.s
0720: 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e  tatic void begin
0730: 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  Timer(void){.  i
0740: 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29  f( enableTimer )
0750: 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  {.    getrusage(
0760: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 42  RUSAGE_SELF, &sB
0770: 65 67 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  egin);.  }.}../*
0780: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
0790: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69  erence of two ti
07a0: 6d 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65  me_structs in se
07b0: 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  conds */.static 
07c0: 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28  double timeDiff(
07d0: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a  struct timeval *
07e0: 70 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74  pStart, struct t
07f0: 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20  imeval *pEnd){. 
0800: 20 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74   return (pEnd->t
0810: 76 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d  v_usec - pStart-
0820: 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30  >tv_usec)*0.0000
0830: 30 31 20 2b 20 0a 20 20 20 20 20 20 20 20 20 28  01 + .         (
0840: 64 6f 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76  double)(pEnd->tv
0850: 5f 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74  _sec - pStart->t
0860: 76 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  v_sec);.}../*.**
0870: 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e   Print the timin
0880: 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  g results..*/.st
0890: 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d  atic void endTim
08a0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
08b0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
08c0: 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65     struct rusage
08d0: 20 73 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75   sEnd;.    getru
08e0: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
08f0: 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72  , &sEnd);.    pr
0900: 69 6e 74 66 28 22 43 50 55 20 54 69 6d 65 3a 20  intf("CPU Time: 
0910: 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e  user %f sys %f\n
0920: 22 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ",.       timeDi
0930: 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 75 74  ff(&sBegin.ru_ut
0940: 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74  ime, &sEnd.ru_ut
0950: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 74 69 6d  ime),.       tim
0960: 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75  eDiff(&sBegin.ru
0970: 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75  _stime, &sEnd.ru
0980: 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a  _stime));.  }.}.
0990: 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49  #define BEGIN_TI
09a0: 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29  MER beginTimer()
09b0: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
09c0: 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64  ER endTimer().#d
09d0: 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20  efine HAS_TIMER 
09e0: 31 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  1.#else.#define 
09f0: 42 45 47 49 4e 5f 54 49 4d 45 52 20 0a 23 64 65  BEGIN_TIMER .#de
0a00: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23  fine END_TIMER.#
0a10: 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52  define HAS_TIMER
0a20: 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
0a30: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0a40: 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ng flag is set, 
0a50: 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65  then command exe
0a60: 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20  cution stops.** 
0a70: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77  at an error if w
0a80: 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61  e are not intera
0a90: 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ctive..*/.static
0aa0: 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72   int bail_on_err
0ab0: 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  or = 0;../*.** T
0ac0: 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20 61  hreat stdin as a
0ad0: 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  n interactive in
0ae0: 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  put if the follo
0af0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a  wing variable.**
0b00: 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72   is true.  Other
0b10: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64  wise, assume std
0b20: 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  in is connected 
0b30: 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70  to a file or pip
0b40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0b50: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
0b60: 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  ctive = 1;../*.*
0b70: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0b80: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
0b90: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
0ba0: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
0bb0: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
0bc0: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
0bd0: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
0be0: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
0bf0: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
0c00: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
0c10: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
0c20: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
0c30: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 64  tatic sqlite3 *d
0c40: 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  b = 0;../*.** Tr
0c50: 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75  ue if an interru
0c60: 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68  pt (Control-C) h
0c70: 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64  as been received
0c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61  ..*/.static vola
0c90: 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74  tile int seenInt
0ca0: 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  errupt = 0;../*.
0cb0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  ** This is the n
0cc0: 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72  ame of our progr
0cd0: 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e  am. It is set in
0ce0: 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a   main(), used.**
0cf0: 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   in a number of 
0d00: 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f  other places, mo
0d10: 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d  stly for error m
0d20: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
0d30: 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a  ic char *Argv0;.
0d40: 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74  ./*.** Prompt st
0d50: 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a  rings. Initializ
0d60: 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74  ed in main. Sett
0d70: 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e  able with.**   .
0d80: 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74  prompt main cont
0d90: 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  inue.*/.static c
0da0: 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32  har mainPrompt[2
0db0: 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0];     /* First
0dc0: 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65   line prompt. de
0dd0: 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20  fault: "sqlite> 
0de0: 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  "*/.static char 
0df0: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32  continuePrompt[2
0e00: 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74  0]; /* Continuat
0e10: 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ion prompt. defa
0e20: 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20  ult: "   ...> " 
0e30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  */../*.** Write 
0e40: 49 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68  I/O traces to th
0e50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65  e following stre
0e60: 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  am..*/.#ifdef SQ
0e70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
0e80: 41 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20  ACE.static FILE 
0e90: 2a 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65  *iotrace = 0;.#e
0ea0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0eb0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
0ec0: 69 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68  ike printf in th
0ed0: 61 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67  at its first arg
0ee0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f  ument is a.** fo
0ef0: 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20  rmat string and 
0f00: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
0f10: 65 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20  ents are values 
0f20: 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
0f30: 64 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66  d.** in place of
0f40: 20 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20   % fields.  The 
0f50: 72 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74  result of format
0f60: 74 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67  ting this string
0f70: 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74  .** is written t
0f80: 6f 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69  o iotrace..*/.#i
0f90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0fa0: 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69  LE_IOTRACE.stati
0fb0: 63 20 76 6f 69 64 20 69 6f 74 72 61 63 65 50 72  c void iotracePr
0fc0: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
0fd0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
0fe0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0ff0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69  char *z;.  if( i
1000: 6f 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  otrace==0 ) retu
1010: 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rn;.  va_start(a
1020: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
1030: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
1040: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
1050: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1060: 20 20 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63    fprintf(iotrac
1070: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
1080: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1090: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
10a0: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
10b0: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
10c0: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
10d0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
10e0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
10f0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
1100: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
1110: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
1120: 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28  .  if( !isdigit(
1130: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
1140: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
1150: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
1160: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
1170: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
1180: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
1190: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
11a0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
11b0: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65  isdigit(*z) ) re
11c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
11d0: 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29  e( isdigit(*z) )
11e0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
11f0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
1200: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
1210: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
1220: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
1230: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
1240: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
1250: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64  ++;.    if( !isd
1260: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
1270: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
1280: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  isdigit(*z) ){ z
1290: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
12a0: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
12b0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
12c0: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
12d0: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 63 68 61 72  ** A global char
12e0: 2a 20 61 6e 64 20 61 6e 20 53 51 4c 20 66 75 6e  * and an SQL fun
12f0: 63 74 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20  ction to access 
1300: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
1310: 65 20 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69  e .** from withi
1320: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
1330: 6e 74 2e 20 54 68 69 73 20 70 72 6f 67 72 61 6d  nt. This program
1340: 20 75 73 65 64 20 74 6f 20 75 73 65 20 74 68 65   used to use the
1350: 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63   .** sqlite_exec
1360: 5f 70 72 69 6e 74 66 28 29 20 41 50 49 20 74 6f  _printf() API to
1370: 20 73 75 62 73 74 69 74 75 65 20 61 20 73 74 72   substitue a str
1380: 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53 51 4c 20  ing into an SQL 
1390: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
13a0: 65 20 63 6f 72 72 65 63 74 20 77 61 79 20 74 6f  e correct way to
13b0: 20 64 6f 20 74 68 69 73 20 77 69 74 68 20 73 71   do this with sq
13c0: 6c 69 74 65 33 20 69 73 20 74 6f 20 75 73 65 20  lite3 is to use 
13d0: 74 68 65 20 62 69 6e 64 20 41 50 49 2c 20 62 75  the bind API, bu
13e0: 74 0a 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73  t.** since the s
13f0: 68 65 6c 6c 20 69 73 20 62 75 69 6c 74 20 61 72  hell is built ar
1400: 6f 75 6e 64 20 74 68 65 20 63 61 6c 6c 62 61 63  ound the callbac
1410: 6b 20 70 61 72 61 64 69 67 6d 20 69 74 20 77 6f  k paradigm it wo
1420: 75 6c 64 20 62 65 20 61 20 6c 6f 74 0a 2a 2a 20  uld be a lot.** 
1430: 6f 66 20 77 6f 72 6b 2e 20 49 6e 73 74 65 61 64  of work. Instead
1440: 20 6a 75 73 74 20 75 73 65 20 74 68 69 73 20 68   just use this h
1450: 61 63 6b 2c 20 77 68 69 63 68 20 69 73 20 71 75  ack, which is qu
1460: 69 74 65 20 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f  ite harmless..*/
1470: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1480: 61 72 20 2a 7a 53 68 65 6c 6c 53 74 61 74 69 63  ar *zShellStatic
1490: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69   = 0;.static voi
14a0: 64 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e  d shellstaticFun
14b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
14c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
14d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
14e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
14f0: 76 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30  v.){.  assert( 0
1500: 3d 3d 61 72 67 63 20 29 3b 0a 20 20 61 73 73 65  ==argc );.  asse
1510: 72 74 28 20 7a 53 68 65 6c 6c 53 74 61 74 69 63  rt( zShellStatic
1520: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   );.  sqlite3_re
1530: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
1540: 74 2c 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c  t, zShellStatic,
1550: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1560: 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  IC);.}.../*.** T
1570: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
1580: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
1590: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
15a0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
15b0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
15c0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
15d0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
15e0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
15f0: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
1600: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
1610: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
1620: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
1630: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
1640: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
1650: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
1660: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
1670: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
1680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
1690: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
16a0: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
16b0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
16c0: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
16d0: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
16e0: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 69 66    int eol;..  if
16f0: 28 20 7a 50 72 6f 6d 70 74 20 26 26 20 2a 7a 50  ( zPrompt && *zP
1700: 72 6f 6d 70 74 20 29 7b 0a 20 20 20 20 70 72 69  rompt ){.    pri
1710: 6e 74 66 28 22 25 73 22 2c 7a 50 72 6f 6d 70 74  ntf("%s",zPrompt
1720: 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74  );.    fflush(st
1730: 64 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69  dout);.  }.  nLi
1740: 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e  ne = 100;.  zLin
1750: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e  e = malloc( nLin
1760: 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  e );.  if( zLine
1770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1780: 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
1790: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f   0;.  while( !eo
17a0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  l ){.    if( n+1
17b0: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
17c0: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
17d0: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
17e0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
17f0: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
1800: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
1810: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1820: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
1830: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
1840: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
1850: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
1860: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
1870: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
1880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1890: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
18a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
18b0: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
18c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
18d0: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  e( zLine[n] ){ n
18e0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e  ++; }.    if( n>
18f0: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
1900: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
1910: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
1920: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
1930: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
1940: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
1950: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
1960: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
1970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
1980: 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e  eve a single lin
1990: 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e  e of input text.
19a0: 0a 2a 2a 0a 2a 2a 20 7a 50 72 69 6f 72 20 69 73  .**.** zPrior is
19b0: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 70 72 69   a string of pri
19c0: 6f 72 20 74 65 78 74 20 72 65 74 72 69 65 76 65  or text retrieve
19d0: 64 2e 20 20 49 66 20 6e 6f 74 20 74 68 65 20 65  d.  If not the e
19e0: 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20  mpty.** string, 
19f0: 74 68 65 6e 20 69 73 73 75 65 20 61 20 63 6f 6e  then issue a con
1a00: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
1a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1a20: 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65   *one_input_line
1a30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72  (const char *zPr
1a40: 69 6f 72 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  ior, FILE *in){.
1a50: 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b    char *zPrompt;
1a60: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
1a70: 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b  ;.  if( in!=0 ){
1a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61  .    return loca
1a90: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
1aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 72 69  ;.  }.  if( zPri
1ab0: 6f 72 20 26 26 20 7a 50 72 69 6f 72 5b 30 5d 20  or && zPrior[0] 
1ac0: 29 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  ){.    zPrompt =
1ad0: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 3b   continuePrompt;
1ae0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
1af0: 72 6f 6d 70 74 20 3d 20 6d 61 69 6e 50 72 6f 6d  rompt = mainProm
1b00: 70 74 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c  pt;.  }.  zResul
1b10: 74 20 3d 20 72 65 61 64 6c 69 6e 65 28 7a 50 72  t = readline(zPr
1b20: 6f 6d 70 74 29 3b 0a 23 69 66 20 64 65 66 69 6e  ompt);.#if defin
1b30: 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  ed(HAVE_READLINE
1b40: 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49  ) && HAVE_READLI
1b50: 4e 45 3d 3d 31 0a 20 20 69 66 28 20 7a 52 65 73  NE==1.  if( zRes
1b60: 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20  ult && *zResult 
1b70: 29 20 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52  ) add_history(zR
1b80: 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a 20  esult);.#endif. 
1b90: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b   return zResult;
1ba0: 0a 7d 0a 0a 73 74 72 75 63 74 20 70 72 65 76 69  .}..struct previ
1bb0: 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61 20 7b 0a  ous_mode_data {.
1bc0: 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20    int valid;    
1bd0: 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20      /* Is there 
1be0: 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65  legit data in he
1bf0: 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  re? */.  int mod
1c00: 65 3b 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61  e;.  int showHea
1c10: 64 65 72 3b 0a 20 20 69 6e 74 20 63 6f 6c 57 69  der;.  int colWi
1c20: 64 74 68 5b 31 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a  dth[100];.};../*
1c30: 0a 2a 2a 20 41 6e 20 70 6f 69 6e 74 65 72 20 74  .** An pointer t
1c40: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
1c50: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1c60: 69 73 20 70 61 73 73 65 64 20 66 72 6f 6d 0a 2a  is passed from.*
1c70: 2a 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  * the main progr
1c80: 61 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  am to the callba
1c90: 63 6b 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ck.  This is use
1ca0: 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
1cb0: 0a 2a 2a 20 73 74 61 74 65 20 61 6e 64 20 6d 6f  .** state and mo
1cc0: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  de information..
1cd0: 2a 2f 0a 73 74 72 75 63 74 20 63 61 6c 6c 62 61  */.struct callba
1ce0: 63 6b 5f 64 61 74 61 20 7b 0a 20 20 73 71 6c 69  ck_data {.  sqli
1cf0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1d00: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1d10: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68  ase */.  int ech
1d20: 6f 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  oOn;            
1d30: 2f 2a 20 54 72 75 65 20 74 6f 20 65 63 68 6f 20  /* True to echo 
1d40: 69 6e 70 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a  input commands *
1d50: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
1d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d70: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
1d80: 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72  displayed so far
1d90: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b   */.  FILE *out;
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db0: 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65  Write results he
1dc0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  re */.  int mode
1dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1de0: 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  * An output mode
1df0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   setting */.  in
1e00: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
1e10: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
1e20: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
1e30: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
1e40: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
1e50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1e60: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
1e70: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
1e80: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 63  lumn mode */.  c
1e90: 68 61 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b  har *zDestTable;
1ea0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1eb0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
1ec0: 6c 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73  le when MODE_Ins
1ed0: 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 73 65  ert */.  char se
1ee0: 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 20 20 20  parator[20];    
1ef0: 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 63 68 61  /* Separator cha
1f00: 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f  racter for MODE_
1f10: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  List */.  int co
1f20: 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20 20  lWidth[100];    
1f30: 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77 69   /* Requested wi
1f40: 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  dth of each colu
1f50: 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d  mn when in colum
1f60: 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61  n mode*/.  int a
1f70: 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b  ctualWidth[100];
1f80: 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64 74    /* Actual widt
1f90: 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  h of each column
1fa0: 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c 76   */.  char nullv
1fb0: 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20  alue[20];    /* 
1fc0: 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69 6e  The text to prin
1fd0: 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f  t when a NULL co
1fe0: 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20  mes back from.  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
2010: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75  tabase */.  stru
2020: 63 74 20 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65  ct previous_mode
2030: 5f 64 61 74 61 20 65 78 70 6c 61 69 6e 50 72 65  _data explainPre
2040: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v;.             
2050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2060: 6f 6c 64 73 20 74 68 65 20 6d 6f 64 65 20 69 6e  olds the mode in
2070: 66 6f 72 6d 61 74 69 6f 6e 20 6a 75 73 74 20 62  formation just b
2080: 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20  efore.          
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20a0: 2a 20 2e 65 78 70 6c 61 69 6e 20 4f 4e 20 2a 2f  * .explain ON */
20b0: 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b  .  char outfile[
20c0: 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f  FILENAME_MAX]; /
20d0: 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a  * Filename for *
20e0: 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  out */.  const c
20f0: 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65  har *zDbFilename
2100: 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ;    /* name of 
2110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2120: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
2130: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
2140: 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  owed modes..*/.#
2150: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65  define MODE_Line
2160: 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63       0  /* One c
2170: 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20  olumn per line. 
2180: 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77   Blank line betw
2190: 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23  een records */.#
21a0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75  define MODE_Colu
21b0: 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72  mn   1  /* One r
21c0: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69  ecord per line i
21d0: 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a  n neat columns *
21e0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
21f0: 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e  ist     2  /* On
2200: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
2210: 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74  e with a separat
2220: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  or */.#define MO
2230: 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f  DE_Semi     3  /
2240: 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c  * Same as MODE_L
2250: 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22  ist but append "
2260: 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20  ;" to each line 
2270: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
2280: 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47  Html     4  /* G
2290: 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c  enerate an XHTML
22a0: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
22b0: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20  e MODE_Insert   
22c0: 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53  5  /* Generate S
22d0: 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74  QL "insert" stat
22e0: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
22f0: 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20 20  e MODE_Tcl      
2300: 36 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 41  6  /* Generate A
2310: 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75 6f  NSI-C or TCL quo
2320: 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ted elements */.
2330: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73 76  #define MODE_Csv
2340: 20 20 20 20 20 20 37 20 20 2f 2a 20 51 75 6f 74        7  /* Quot
2350: 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62 65  e strings, numbe
2360: 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f 0a  rs are plain */.
2370: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78 70  #define MODE_Exp
2380: 6c 61 69 6e 20 20 38 20 20 2f 2a 20 4c 69 6b 65  lain  8  /* Like
2390: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75   MODE_Column, bu
23a0: 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61 74  t do not truncat
23b0: 65 20 64 61 74 61 20 2a 2f 0a 0a 73 74 61 74 69  e data */..stati
23c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f  c const char *mo
23d0: 64 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20  deDescr[] = {.  
23e0: 22 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d  "line",.  "colum
23f0: 6e 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20  n",.  "list",.  
2400: 22 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22  "semi",.  "html"
2410: 2c 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20  ,.  "insert",.  
2420: 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a  "tcl",.  "csv",.
2430: 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 7d 3b 0a    "explain",.};.
2440: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
2450: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
2460: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
2470: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
2480: 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66  sizeof(X)/sizeof
2490: 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f  (X[0]))../*.** O
24a0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
24b0: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
24c0: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
24d0: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
24e0: 65 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  entions..*/.stat
24f0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
2500: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c  uoted_string(FIL
2510: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
2520: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
2530: 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d  .  int nSingle =
2540: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   0;.  for(i=0; z
2550: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
2560: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 20  f( z[i]=='\'' ) 
2570: 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 7d 0a 20  nSingle++;.  }. 
2580: 20 69 66 28 20 6e 53 69 6e 67 6c 65 3d 3d 30 20   if( nSingle==0 
2590: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
25a0: 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20  ut,"'%s'",z);.  
25b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
25c0: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 20  tf(out,"'");.   
25d0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
25e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
25f0: 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b  ] && z[i]!='\'';
2600: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
2610: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
2620: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27    fprintf(out,"'
2630: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 2b 2b  '");.        z++
2640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2650: 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a  ( z[i]=='\'' ){.
2660: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2670: 6f 75 74 2c 22 25 2e 2a 73 27 27 22 2c 69 2c 7a  out,"%.*s''",i,z
2680: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  );.        z += 
2690: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i+1;.      }else
26a0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
26b0: 66 28 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a 20  f(out,"%s",z);. 
26c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26e0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
26f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
2700: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
2710: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
2720: 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2730: 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67  C or TCL quoting
2740: 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   rules..*/.stati
2750: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f  c void output_c_
2760: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
2770: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
2780: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
2790: 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c   c;.  fputc('"',
27a0: 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20   out);.  while( 
27b0: 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20  (c = *(z++))!=0 
27c0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
27d0: 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  \' ){.      fput
27e0: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
27f0: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
2800: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
2810: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\t' ){.      f
2820: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
2830: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27  .      fputc('t'
2840: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
2850: 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b  e if( c=='\n' ){
2860: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
2870: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
2880: 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a  putc('n', out);.
2890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
28a0: 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\r' ){.      f
28b0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
28c0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27  .      fputc('r'
28d0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
28e0: 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63  e if( !isprint(c
28f0: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
2900: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
2910: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
2920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
2930: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
2940: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
2950: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
2960: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
2970: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
2980: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
2990: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
29a0: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
29b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
29c0: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
29d0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
29e0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
29f0: 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   i;.  while( *z 
2a00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2a10: 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 3c  z[i] && z[i]!='<
2a20: 27 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 3b 20  ' && z[i]!='&'; 
2a30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
2a40: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  >0 ){.      fpri
2a50: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
2a60: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
2a70: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
2a80: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
2a90: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
2aa0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
2ab0: 26 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  &' ){.      fpri
2ac0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
2ad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2af0: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
2b00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
2b10: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
2b20: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
2b30: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
2b40: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2b50: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
2b60: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
2b70: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
2b80: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
2b90: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
2ba0: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
2bb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2bc0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
2bd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2be0: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
2bf0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
2c00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2c10: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 30   1, 1,   .  1, 0
2c20: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
2c30: 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   1,   0, 0, 0, 0
2c40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
2c50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2c60: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
2c70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2c80: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
2c90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
2ca0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2cb0: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
2cc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2cd0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
2ce0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20   0, 0, 0, 0, .  
2cf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2d00: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
2d10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2d20: 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , .  0, 0, 0, 0,
2d30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
2d40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2d50: 20 30 2c 20 31 2c 20 0a 20 20 31 2c 20 31 2c 20   0, 1, .  1, 1, 
2d60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
2d70: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
2d80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
2d90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2da0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
2db0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2dc0: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
2dd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2de0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
2df0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31   1, 1, 1,   .  1
2e00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2e10: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
2e20: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2e30: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
2e40: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
2e50: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
2e60: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
2e70: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
2e80: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
2e90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
2ea0: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
2eb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
2ec0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2ed0: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
2ee0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
2ef0: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
2f00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
2f10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
2f20: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   a single term o
2f30: 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79  f CSV.  Actually
2f40: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 20 69  , p->separator i
2f50: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68  s used for.** th
2f60: 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69  e separator, whi
2f70: 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
2f80: 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70  t be a comma.  p
2f90: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 20 69 73 0a 2a  ->nullvalue is.*
2fa0: 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65  * the null value
2fb0: 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71  .  Strings are q
2fc0: 75 6f 74 65 64 20 75 73 69 6e 67 20 41 4e 53 49  uoted using ANSI
2fd0: 2d 43 20 72 75 6c 65 73 2e 20 20 4e 75 6d 62 65  -C rules.  Numbe
2fe0: 72 73 0a 2a 2a 20 61 70 70 65 61 72 20 6f 75 74  rs.** appear out
2ff0: 73 69 64 65 20 6f 66 20 71 75 6f 74 65 73 2e 0a  side of quotes..
3000: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
3010: 75 74 70 75 74 5f 63 73 76 28 73 74 72 75 63 74  utput_csv(struct
3020: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
3030: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
3040: 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46  , int bSep){.  F
3050: 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75  ILE *out = p->ou
3060: 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  t;.  if( z==0 ){
3070: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
3080: 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76 61 6c  ,"%s",p->nullval
3090: 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ue);.  }else{.  
30a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
30b0: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 70   nSep = strlen(p
30c0: 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  ->separator);.  
30d0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
30e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
30f0: 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28   needCsvQuote[((
3100: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
3110: 29 5b 69 5d 5d 20 0a 20 20 20 20 20 20 20 20 20  )[i]] .         
3120: 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 73 65 70  || (z[i]==p->sep
3130: 61 72 61 74 6f 72 5b 30 5d 20 26 26 20 0a 20 20  arator[0] && .  
3140: 20 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70             (nSep
3150: 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c  ==1 || memcmp(z,
3160: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e   p->separator, n
3170: 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20  Sep)==0)) ){.   
3180: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
3190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31b0: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70   i==0 ){.      p
31c0: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
31d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
31e0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
31f0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20    if( z[i]=='"' 
3200: 29 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29  ) putc('"', out)
3210: 3b 0a 20 20 20 20 20 20 20 20 70 75 74 63 28 7a  ;.        putc(z
3220: 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  [i], out);.     
3230: 20 7d 0a 20 20 20 20 20 20 70 75 74 63 28 27 22   }.      putc('"
3240: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
3250: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
3260: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  f(out, "%s", z);
3270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3280: 20 62 53 65 70 20 29 7b 0a 20 20 20 20 66 70 72   bSep ){.    fpr
3290: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
32a0: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
32b0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
32c0: 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SIGINT./*.** Thi
32d0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
32e0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65  hen the user pre
32f0: 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73  sses Ctrl-C.*/.s
3300: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72  tatic void inter
3310: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74  rupt_handler(int
3320: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 65 65   NotUsed){.  see
3330: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 31 3b 0a  nInterrupt = 1;.
3340: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
3350: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
3360: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3370: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
3380: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
3390: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
33a0: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
33b0: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
33c0: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
33d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33e0: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
33f0: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
3400: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
3410: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
3420: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
3430: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
3440: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
3450: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  k_data*)pArg;.  
3460: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
3470: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
3480: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
3490: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
34a0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
34b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
34c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
34d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
34e0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 43 6f  en = strlen(azCo
34f0: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
3500: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69  : "");.        i
3510: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
3520: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
3530: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
3540: 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
3550: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  t,"\n");.      f
3560: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
3570: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
3580: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a  rintf(p->out,"%*
3590: 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20 61 7a  s = %s\n", w, az
35a0: 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Col[i],.        
35b0: 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d          azArg[i]
35c0: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
35d0: 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
35e0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
35f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3600: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20   MODE_Explain:. 
3610: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c     case MODE_Col
3620: 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  umn: {.      if(
3630: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
3640: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
3650: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
3660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
3670: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
3680: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
3690: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
36a0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
36b0: 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  colWidth[i];.   
36c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
36d0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b            w = 0;
36e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36f0: 20 20 20 20 20 20 20 69 66 28 20 77 3c 3d 30 20         if( w<=0 
3700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
3710: 20 3d 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b   = strlen(azCol[
3720: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
3730: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "");.           
3740: 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20   if( w<10 ) w = 
3750: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
3760: 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 41 72 67  n = strlen(azArg
3770: 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61   && azArg[i] ? a
3780: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
3790: 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lvalue);.       
37a0: 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77       if( w<n ) w
37b0: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
37c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
37d0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
37e0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
37f0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63             p->ac
3800: 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77  tualWidth[i] = w
3810: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3820: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
3830: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
3840: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
3850: 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25  (p->out,"%-*.*s%
3860: 73 22 2c 77 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c  s",w,w,azCol[i],
3870: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e   i==nArg-1 ? "\n
3880: 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20  ": "  ");.      
3890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
38a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
38b0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
38c0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
38d0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
38e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b            int w;
38f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3900: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
3910: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
3930: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
3940: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
3950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3960: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
3970: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3980: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
3990: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
39a0: 25 73 22 2c 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d  %s",w,w,"-------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20  ------------".  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20  ------------",. 
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22     i==nArg-1 ? "
3a40: 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  \n": "  ");.    
3a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3a70: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
3a80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
3a90: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
3aa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
3ab0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
3ac0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
3ad0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
3ae0: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
3af0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
3b00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3b10: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
3b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b30: 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
3b40: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20  MODE_Explain && 
3b50: 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c  azArg[i] && strl
3b60: 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29  en(azArg[i])>w )
3b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  {.          w = 
3b80: 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29  strlen(azArg[i])
3b90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3ba0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3bb0: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
3bc0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  w,.            a
3bd0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
3be0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  i] : p->nullvalu
3bf0: 65 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22  e, i==nArg-1 ? "
3c00: 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  \n": "  ");.    
3c10: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3c20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3c30: 4d 4f 44 45 5f 53 65 6d 69 3a 0a 20 20 20 20 63  MODE_Semi:.    c
3c40: 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b  ase MODE_List: {
3c50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
3c60: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
3c70: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
3c80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
3c90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
3ca0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
3cb0: 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b  ut,"%s%s",azCol[
3cc0: 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  i], i==nArg-1 ? 
3cd0: 22 5c 6e 22 20 3a 20 70 2d 3e 73 65 70 61 72 61  "\n" : p->separa
3ce0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
3cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3d00: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
3d10: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
3d20: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
3d30: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3d40: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
3d50: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
3d60: 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  z = p->nullvalue
3d70: 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
3d80: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
3d90: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
3da0: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
3db0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
3dc0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
3dd0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
3de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
3df0: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 53 65 6d 69 20  mode==MODE_Semi 
3e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
3e10: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
3e20: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n");.        }el
3e30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
3e40: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
3e50: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
3e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3e70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3e80: 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a  se MODE_Html: {.
3e90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
3ea0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
3eb0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
3ec0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3ed0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
3ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
3ef0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
3f00: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
3f10: 74 2c 22 3c 54 48 3e 25 73 3c 2f 54 48 3e 22 2c  t,"<TH>%s</TH>",
3f20: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
3f30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
3f40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
3f50: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
3f60: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
3f70: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3f80: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
3f90: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
3fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
3fb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
3fc0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
3fd0: 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f  TD>");.        o
3fe0: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
3ff0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
4000: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
4010: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
4020: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
4030: 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29  ->out,"</TD>\n")
4040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4050: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4060: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
4070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4080: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
4090: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
40a0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
40b0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
40c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
40d0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
40e0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
40f0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
4100: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
4110: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
4120: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
4130: 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72  , "%s", p->separ
4140: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
4150: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4160: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
4170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4180: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
4190: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
41a0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
41b0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
41c0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
41d0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
41e0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
41f0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ue);.        fpr
4200: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
4210: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
4220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4230: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4240: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
4250: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4260: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
4270: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
4280: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
4290: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
42a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
42b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
42c0: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
42d0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
42e0: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
42f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
4300: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
4310: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
4320: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
4330: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
4340: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4350: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
4360: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
4370: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
4380: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Arg-1);.      }.
4390: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
43a0: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
43b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
43c0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73     case MODE_Ins
43d0: 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ert: {.      if(
43e0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
43f0: 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  k;.      fprintf
4400: 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20  (p->out,"INSERT 
4410: 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 28 22  INTO %s VALUES("
4420: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
4430: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4440: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
4450: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70        char *zSep
4460: 20 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20 22 22   = i>0 ? ",": ""
4470: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
4480: 41 72 67 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Arg[i]==0 ){.   
4490: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
44a0: 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c 22 2c 7a  ->out,"%sNULL",z
44b0: 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Sep);.        }e
44c0: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
44d0: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
44e0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
44f0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
4500: 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29  ,zSep, azArg[i])
4510: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4520: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
4530: 53 65 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66  Sep[0] ) fprintf
4540: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65  (p->out,"%s",zSe
4550: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  p);.          ou
4560: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
4570: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
4580: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
45a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
45b0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
45c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
45d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
45e0: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
45f0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
4600: 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63  d of the callbac
4610: 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75 72 65  k_data structure
4620: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
4630: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
4640: 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
4650: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
4660: 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
4670: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
4680: 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
4690: 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61 6c 6c  name(struct call
46a0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f  back_data *p, co
46b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
46c0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
46d0: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20  int needQuote;. 
46e0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
46f0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
4700: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
4710: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
4720: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
4730: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
4740: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
4750: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73   needQuote = !is
4760: 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20  alpha((unsigned 
4770: 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26 20  char)*zName) && 
4780: 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20 66  *zName!='_';.  f
4790: 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65 5b  or(i=n=0; zName[
47a0: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
47b0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
47c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
47d0: 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61 6d  Name[i]) && zNam
47e0: 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20 20  e[i]!='_' ){.   
47f0: 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 31     needQuote = 1
4800: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
4810: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b  e[i]=='\'' ) n++
4820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4830: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e 20  ( needQuote ) n 
4840: 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a  += 2;.  z = p->z
4850: 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
4860: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
4870: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   z==0 ){.    fpr
4880: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
4890: 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b   of memory!\n");
48a0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
48b0: 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  }.  n = 0;.  if(
48c0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e   needQuote ) z[n
48d0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
48e0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
48f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b   i++){.    z[n++
4900: 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20  ] = zName[i];.  
4910: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d    if( zName[i]==
4920: 27 5c 27 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  '\'' ) z[n++] = 
4930: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
4940: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  needQuote ) z[n+
4950: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e  +] = '\'';.  z[n
4960: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e  ] = 0;.}../* zIn
4970: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
4980: 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74  nter to a NULL-t
4990: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
49a0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
49b0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c  ned.** from mall
49c0: 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20  oc(), or a NULL 
49d0: 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72  pointer. The str
49e0: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
49f0: 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20  y zAppend is.** 
4a00: 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e  added to zIn, an
4a10: 64 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74  d the result ret
4a20: 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  urned in memory 
4a30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
4a40: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20  lloc()..** zIn, 
4a50: 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55  if it was not NU
4a60: 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a  LL, is freed..**
4a70: 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
4a80: 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65   argument, quote
4a90: 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74  , is not '\0', t
4aa0: 68 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61  hen it is used a
4ab0: 73 20 61 20 0a 2a 2a 20 71 75 6f 74 65 20 63 68  s a .** quote ch
4ac0: 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70  aracter for zApp
4ad0: 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  end..*/.static c
4ae0: 68 61 72 20 2a 61 70 70 65 6e 64 54 65 78 74 28  har *appendText(
4af0: 63 68 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20  char *zIn, char 
4b00: 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20  const *zAppend, 
4b10: 63 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69  char quote){.  i
4b20: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b  nt len;.  int i;
4b30: 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d  .  int nAppend =
4b40: 20 73 74 72 6c 65 6e 28 7a 41 70 70 65 6e 64 29   strlen(zAppend)
4b50: 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 28 7a  ;.  int nIn = (z
4b60: 49 6e 3f 73 74 72 6c 65 6e 28 7a 49 6e 29 3a 30  In?strlen(zIn):0
4b70: 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70  );..  len = nApp
4b80: 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20 20 69 66 28  end+nIn+1;.  if(
4b90: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65   quote ){.    le
4ba0: 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  n += 2;.    for(
4bb0: 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20  i=0; i<nAppend; 
4bc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4bd0: 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74  zAppend[i]==quot
4be0: 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d  e ) len++;.    }
4bf0: 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20 3d 20 28 63  .  }..  zIn = (c
4c00: 68 61 72 20 2a 29 72 65 61 6c 6c 6f 63 28 7a 49  har *)realloc(zI
4c10: 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 21  n, len);.  if( !
4c20: 7a 49 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  zIn ){.    retur
4c30: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
4c40: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61  quote ){.    cha
4c50: 72 20 2a 7a 43 73 72 20 3d 20 26 7a 49 6e 5b 6e  r *zCsr = &zIn[n
4c60: 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  In];.    *zCsr++
4c70: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f   = quote;.    fo
4c80: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a  ; i++){.      *z
4ca0: 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b  Csr++ = zAppend[
4cb0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  i];.      if( zA
4cc0: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
4cd0: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74  ) *zCsr++ = quot
4ce0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  e;.    }.    *zC
4cf0: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
4d00: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 5c 30 27    *zCsr++ = '\0'
4d10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a  ;.    assert( (z
4d20: 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65 6e 20 29 3b  Csr-zIn)==len );
4d30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
4d40: 6d 63 70 79 28 26 7a 49 6e 5b 6e 49 6e 5d 2c 20  mcpy(&zIn[nIn], 
4d50: 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64  zAppend, nAppend
4d60: 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c 65 6e 2d 31  );.    zIn[len-1
4d70: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20  ] = '\0';.  }.. 
4d80: 20 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a   return zIn;.}..
4d90: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
4da0: 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74   query statement
4db0: 20 74 68 61 74 20 68 61 73 20 61 20 73 69 6e 67   that has a sing
4dc0: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
4dd0: 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 61 74  .  Print.** that
4de0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6f   result column o
4df0: 6e 20 61 20 6c 69 6e 65 20 62 79 20 69 74 73 65  n a line by itse
4e00: 6c 66 20 77 69 74 68 20 61 20 73 65 6d 69 63 6f  lf with a semico
4e10: 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  lon terminator..
4e20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
4e30: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
4e40: 20 74 6f 20 73 68 6f 77 20 74 68 65 20 73 63 68   to show the sch
4e50: 65 6d 61 20 6f 66 20 74 68 65 20 64 61 74 61 62  ema of the datab
4e60: 61 73 65 20 62 79 0a 2a 2a 20 71 75 65 72 79 69  ase by.** queryi
4e70: 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ng the SQLITE_MA
4e80: 53 54 45 52 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  STER table..*/.s
4e90: 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61  tatic int run_ta
4ea0: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 46  ble_dump_query(F
4eb0: 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69 74 65  ILE *out, sqlite
4ec0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
4ed0: 72 20 2a 7a 53 65 6c 65 63 74 29 7b 0a 20 20 73  r *zSelect){.  s
4ee0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
4ef0: 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lect;.  int rc;.
4f00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
4f10: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 65 6c 65  repare(db, zSele
4f20: 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74  ct, -1, &pSelect
4f30: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
4f40: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53  SQLITE_OK || !pS
4f50: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74  elect ){.    ret
4f60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63  urn rc;.  }.  rc
4f70: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
4f80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
4f90: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
4fa0: 57 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  W ){.    fprintf
4fb0: 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73  (out, "%s;\n", s
4fc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4fd0: 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 29 3b  xt(pSelect, 0));
4fe0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4ff0: 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
5000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
5010: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5020: 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Select);.}.../*.
5030: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66  ** This is a dif
5040: 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20  ferent callback 
5050: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72  routine used for
5060: 20 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74   dumping the dat
5070: 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72  abase..** Each r
5080: 6f 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74  ow received by t
5090: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e  his callback con
50a0: 73 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65  sists of a table
50b0: 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61   name,.** the ta
50c0: 62 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78  ble type ("index
50d0: 22 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e  " or "table") an
50e0: 64 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20  d SQL to create 
50f0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
5100: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
5110: 64 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66  d print text suf
5120: 66 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65  ficient to recre
5130: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
5140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d  /.static int dum
5150: 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  p_callback(void 
5160: 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
5170: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
5180: 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
5190: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
51a0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
51b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
51c0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
51d0: 2a 7a 53 71 6c 3b 0a 20 20 73 74 72 75 63 74 20  *zSql;.  struct 
51e0: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
51f0: 20 3d 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62   = (struct callb
5200: 61 63 6b 5f 64 61 74 61 20 2a 29 70 41 72 67 3b  ack_data *)pArg;
5210: 0a 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20  ..  if( nArg!=3 
5220: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54  ) return 1;.  zT
5230: 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b  able = azArg[0];
5240: 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67  .  zType = azArg
5250: 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a  [1];.  zSql = az
5260: 41 72 67 5b 32 5d 3b 0a 20 20 0a 20 20 69 66 28  Arg[2];.  .  if(
5270: 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
5280: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
5290: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ")==0 ){.    fpr
52a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45  intf(p->out, "DE
52b0: 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
52c0: 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a  _sequence;\n");.
52d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
52e0: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
52f0: 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29 7b  te_stat1")==0 ){
5300: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
5310: 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
5320: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
5330: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
5340: 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
5350: 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
5360: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5370: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
5380: 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
5390: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
53a0: 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
53b0: 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
53c0: 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
53d0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
53e0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
53f0: 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
5400: 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b  _schema=ON;\n");
5410: 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62  .      p->writab
5420: 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  leSchema = 1;.  
5430: 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73    }.    zIns = s
5440: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
5450: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
5460: 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  NTO sqlite_maste
5470: 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  r(type,name,tbl_
5480: 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71  name,rootpage,sq
5490: 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55  l)".       "VALU
54a0: 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c  ES('table','%q',
54b0: 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a  '%q',0,'%q');",.
54c0: 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a         zTable, z
54d0: 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20  Table, zSql);.  
54e0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
54f0: 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b  , "%s\n", zIns);
5500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5510: 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74  e(zIns);.    ret
5520: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
5530: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5540: 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
5550: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  l);.  }..  if( s
5560: 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
5570: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
5580: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
5590: 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  ableInfo = 0;.  
55a0: 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 20    char *zSelect 
55b0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
55c0: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20  TableInfo = 0;. 
55d0: 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20 3d 20     char *zTmp = 
55e0: 30 3b 0a 20 20 20 0a 20 20 20 20 7a 54 61 62 6c  0;.   .    zTabl
55f0: 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65  eInfo = appendTe
5600: 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 22  xt(zTableInfo, "
5610: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
5620: 6f 28 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  o(", 0);.    zTa
5630: 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64  bleInfo = append
5640: 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c  Text(zTableInfo,
5650: 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20   zTable, '"');. 
5660: 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20     zTableInfo = 
5670: 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c  appendText(zTabl
5680: 65 49 6e 66 6f 2c 20 22 29 3b 22 2c 20 30 29 3b  eInfo, ");", 0);
5690: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
56a0: 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62  e3_prepare(p->db
56b0: 2c 20 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 2d 31  , zTableInfo, -1
56c0: 2c 20 26 70 54 61 62 6c 65 49 6e 66 6f 2c 20 30  , &pTableInfo, 0
56d0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 61 62 6c  );.    if( zTabl
56e0: 65 49 6e 66 6f 20 29 20 66 72 65 65 28 7a 54 61  eInfo ) free(zTa
56f0: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  bleInfo);.    if
5700: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5710: 7c 7c 20 21 70 54 61 62 6c 65 49 6e 66 6f 20 29  || !pTableInfo )
5720: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
5730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 65  ;.    }..    zSe
5740: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
5750: 74 28 7a 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  t(zSelect, "SELE
5760: 43 54 20 27 49 4e 53 45 52 54 20 49 4e 54 4f 20  CT 'INSERT INTO 
5770: 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20  ' || ", 0);.    
5780: 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64 54 65 78  zTmp = appendTex
5790: 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c 65 2c 20  t(zTmp, zTable, 
57a0: 27 22 27 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  '"');.    if( zT
57b0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c  mp ){.      zSel
57c0: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
57d0: 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d 70 2c 20  (zSelect, zTmp, 
57e0: 27 5c 27 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20  '\'');.    }.   
57f0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
5800: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
5810: 20 7c 7c 20 27 20 56 41 4c 55 45 53 28 27 20 7c   || ' VALUES(' |
5820: 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  | ", 0);.    rc 
5830: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
5840: 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20  TableInfo);.    
5850: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
5860: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
5870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
5880: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
5890: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
58a0: 74 65 78 74 28 70 54 61 62 6c 65 49 6e 66 6f 2c  text(pTableInfo,
58b0: 20 31 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65   1);.      zSele
58c0: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
58d0: 7a 53 65 6c 65 63 74 2c 20 22 71 75 6f 74 65 28  zSelect, "quote(
58e0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 65  ", 0);.      zSe
58f0: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
5900: 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 65 78 74  t(zSelect, zText
5910: 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 72 63  , '"');.      rc
5920: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
5930: 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20  pTableInfo);.   
5940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5950: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
5960: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
5970: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
5980: 29 20 7c 7c 20 27 2c 27 20 7c 7c 20 22 2c 20 30  ) || ',' || ", 0
5990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
59a0: 20 20 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20          zSelect 
59b0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
59c0: 6c 65 63 74 2c 20 22 29 20 22 2c 20 30 29 3b 0a  lect, ") ", 0);.
59d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
59e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
59f0: 69 6e 61 6c 69 7a 65 28 70 54 61 62 6c 65 49 6e  inalize(pTableIn
5a00: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fo);.    if( rc!
5a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5a20: 20 20 20 20 69 66 28 20 7a 53 65 6c 65 63 74 20      if( zSelect 
5a30: 29 20 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b  ) free(zSelect);
5a40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
5a50: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65  .    }.    zSele
5a60: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
5a70: 7a 53 65 6c 65 63 74 2c 20 22 7c 7c 20 27 29 27  zSelect, "|| ')'
5a80: 20 46 52 4f 4d 20 20 22 2c 20 30 29 3b 0a 20 20   FROM  ", 0);.  
5a90: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
5aa0: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
5ab0: 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 0a 20  zTable, '"');.. 
5ac0: 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c     rc = run_tabl
5ad0: 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e  e_dump_query(p->
5ae0: 6f 75 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65 6c  out, p->db, zSel
5af0: 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
5b00: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
5b10: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63   ){.      zSelec
5b20: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
5b30: 53 65 6c 65 63 74 2c 20 22 20 4f 52 44 45 52 20  Select, " ORDER 
5b40: 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
5b50: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  0);.      rc = r
5b60: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
5b70: 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64  ery(p->out, p->d
5b80: 62 2c 20 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, zSelect);.   
5b90: 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 65 6c 65   }.    if( zSele
5ba0: 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c 65 63  ct ) free(zSelec
5bb0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
5bc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
5bd0: 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75   zQuery.  Use du
5be0: 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73  mp_callback() as
5bf0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
5c00: 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a  utine so that.**
5c10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5c20: 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f   the query are o
5c30: 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61  utput as SQL sta
5c40: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
5c50: 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54  f we get a SQLIT
5c60: 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c  E_CORRUPT error,
5c70: 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79   rerun the query
5c80: 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67   after appending
5c90: 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f  .** "ORDER BY ro
5ca0: 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65  wid DESC" to the
5cb0: 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   end..*/.static 
5cc0: 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64  int run_schema_d
5cd0: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 73 74 72  ump_query(.  str
5ce0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
5cf0: 61 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  a *p, .  const c
5d00: 68 61 72 20 2a 7a 51 75 65 72 79 2c 0a 20 20 63  har *zQuery,.  c
5d10: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 0a 29  har **pzErrMsg.)
5d20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
5d30: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
5d40: 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64  p->db, zQuery, d
5d50: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
5d60: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   pzErrMsg);.  if
5d70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
5d80: 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72  RUPT ){.    char
5d90: 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c   *zQ2;.    int l
5da0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 51 75 65  en = strlen(zQue
5db0: 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 7a 45  ry);.    if( pzE
5dc0: 72 72 4d 73 67 20 29 20 73 71 6c 69 74 65 33 5f  rrMsg ) sqlite3_
5dd0: 66 72 65 65 28 2a 70 7a 45 72 72 4d 73 67 29 3b  free(*pzErrMsg);
5de0: 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f  .    zQ2 = mallo
5df0: 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20  c( len+100 );.  
5e00: 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72    if( zQ2==0 ) r
5e10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
5e20: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5e30: 69 7a 65 6f 66 28 7a 51 32 29 2c 20 7a 51 32 2c  izeof(zQ2), zQ2,
5e40: 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
5e50: 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
5e60: 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
5e70: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
5e80: 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
5e90: 61 63 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67  ack, p, pzErrMsg
5ea0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
5eb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5ec0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
5ed0: 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61   of a help messa
5ee0: 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ge.*/.static cha
5ef0: 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e  r zHelp[] =.  ".
5f00: 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20 20  bail ON|OFF     
5f10: 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
5f20: 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
5f30: 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
5f40: 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  n".  ".databases
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
5f60: 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
5f70: 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
5f80: 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64  tabases\n".  ".d
5f90: 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
5fa0: 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
5fb0: 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
5fc0: 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
5fd0: 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46 20    ".echo ON|OFF 
5fe0: 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
5ff0: 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
6000: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78 69  r off\n".  ".exi
6010: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
6020: 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
6030: 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c  gram\n".  ".expl
6040: 61 69 6e 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  ain ON|OFF      
6050: 20 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f    Turn output mo
6060: 64 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  de suitable for 
6070: 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66  EXPLAIN on or of
6080: 66 2e 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72  f.\n".  ".header
6090: 28 73 29 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  (s) ON|OFF      
60a0: 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20  Turn display of 
60b0: 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
60c0: 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20  f\n".  ".help   
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
60e0: 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67 65  how this message
60f0: 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  \n".  ".import F
6100: 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d  ILE TABLE     Im
6110: 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46  port data from F
6120: 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e  ILE into TABLE\n
6130: 22 0a 20 20 22 2e 69 6e 64 69 63 65 73 20 54 41  ".  ".indices TA
6140: 42 4c 45 20 20 20 20 20 20 20 20 20 53 68 6f 77  BLE         Show
6150: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e   names of all in
6160: 64 69 63 65 73 20 6f 6e 20 54 41 42 4c 45 5c 6e  dices on TABLE\n
6170: 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
6180: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
6190: 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20   ".iotrace FILE 
61a0: 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
61b0: 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
61c0: 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e  ogging to FILE\n
61d0: 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
61e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
61f0: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
6200: 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
6210: 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78  ?     Load an ex
6220: 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c  tension library\
6230: 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6d 6f  n".#endif.  ".mo
6240: 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
6250: 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
6260: 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69  ode where MODE i
6270: 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22  s one of:\n".  "
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20           csv    
62a0: 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
62b0: 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20          column  
62e0: 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
62f0: 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
6300: 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20  dth)\n".  "     
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
6330: 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e  L <table> code\n
6340: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6360: 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72  sert   SQL inser
6370: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  t statements for
6380: 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20   TABLE\n".  "   
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f        line     O
63b0: 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
63c0: 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
63f0: 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 2e 73   delimited by .s
6400: 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e 67 5c  eparator string\
6410: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6430: 61 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61  abs     Tab-sepa
6440: 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
6450: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
6460: 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 20              tcl 
6470: 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c       TCL list el
6480: 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75  ements\n".  ".nu
6490: 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20  llvalue STRING  
64a0: 20 20 20 20 50 72 69 6e 74 20 53 54 52 49 4e 47      Print STRING
64b0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c   in place of NUL
64c0: 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e  L values\n".  ".
64d0: 6f 75 74 70 75 74 20 46 49 4c 45 4e 41 4d 45 20  output FILENAME 
64e0: 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
64f0: 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  t to FILENAME\n"
6500: 0a 20 20 22 2e 6f 75 74 70 75 74 20 73 74 64 6f  .  ".output stdo
6510: 75 74 20 20 20 20 20 20 20 20 20 53 65 6e 64 20  ut         Send 
6520: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 73 63  output to the sc
6530: 72 65 65 6e 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d  reen\n".  ".prom
6540: 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45  pt MAIN CONTINUE
6550: 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74    Replace the st
6560: 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e  andard prompts\n
6570: 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20  ".  ".quit      
6580: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
6590: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22   this program\n"
65a0: 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41  .  ".read FILENA
65b0: 4d 45 20 20 20 20 20 20 20 20 20 45 78 65 63 75  ME         Execu
65c0: 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41  te SQL in FILENA
65d0: 4d 45 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61  ME\n".  ".schema
65e0: 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20   ?TABLE?        
65f0: 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20  Show the CREATE 
6600: 73 74 61 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  statements\n".  
6610: 22 2e 73 65 70 61 72 61 74 6f 72 20 53 54 52 49  ".separator STRI
6620: 4e 47 20 20 20 20 20 20 43 68 61 6e 67 65 20 73  NG      Change s
6630: 65 70 61 72 61 74 6f 72 20 75 73 65 64 20 62 79  eparator used by
6640: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64   output mode and
6650: 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e   .import\n".  ".
6660: 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  show            
6670: 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63        Show the c
6680: 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
6690: 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e  r various settin
66a0: 67 73 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73  gs\n".  ".tables
66b0: 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20   ?PATTERN?      
66c0: 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
66d0: 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 61 20  bles matching a 
66e0: 4c 49 4b 45 20 70 61 74 74 65 72 6e 5c 6e 22 0a  LIKE pattern\n".
66f0: 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20    ".timeout MS  
6700: 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70            Try op
6710: 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62  ening locked tab
6720: 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69  les for MS milli
6730: 73 65 63 6f 6e 64 73 5c 6e 22 0a 23 69 66 20 48  seconds\n".#if H
6740: 41 53 5f 54 49 4d 45 52 0a 20 20 22 2e 74 69 6d  AS_TIMER.  ".tim
6750: 65 72 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  er ON|OFF       
6760: 20 20 20 54 75 72 6e 20 74 68 65 20 43 50 55 20     Turn the CPU 
6770: 74 69 6d 65 72 20 6d 65 61 73 75 72 65 6d 65 6e  timer measuremen
6780: 74 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23  t on or off\n".#
6790: 65 6e 64 69 66 0a 20 20 22 2e 77 69 64 74 68 20  endif.  ".width 
67a0: 4e 55 4d 20 4e 55 4d 20 2e 2e 2e 20 20 20 20 20  NUM NUM ...     
67b0: 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
67c0: 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
67d0: 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46   mode\n".;../* F
67e0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
67f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
6800: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74 72  rocess_input(str
6810: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
6820: 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b  a *p, FILE *in);
6830: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
6840: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
6850: 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69  s open.  If it i
6860: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e  s not, then open
6870: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
6880: 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
6890: 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e  o open, print an
68a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
68b0: 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74  nd exit..*/.stat
68c0: 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28  ic void open_db(
68d0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
68e0: 64 61 74 61 20 2a 70 29 7b 0a 20 20 69 66 28 20  data *p){.  if( 
68f0: 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
6900: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
6910: 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
6920: 3e 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70  >db);.    db = p
6930: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62  ->db;.    if( db
6940: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
6950: 6f 64 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f  ode(db)==SQLITE_
6960: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
6970: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6980: 69 6f 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74  ion(db, "shellst
6990: 61 74 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45  atic", 0, SQLITE
69a0: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
69b0: 20 20 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46      shellstaticF
69c0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
69d0: 7d 0a 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20  }.    if( db==0 
69e0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
69f0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
6a00: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
6a10: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
6a20: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
6a30: 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
6a40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
6a50: 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  zDbFilename, sql
6a60: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
6a70: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
6a80: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
6a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
6aa0: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71  EXTENSION.    sq
6ab0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
6ac0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
6ad0: 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, 1);.#endif.  
6ae0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d  }.}../*.** Do C-
6af0: 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64  language style d
6b00: 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  equoting..**.** 
6b10: 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
6b20: 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
6b30: 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 72 20  ewline.**    \r 
6b40: 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
6b50: 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  eturn.**    \NNN
6b60: 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
6b70: 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
6b80: 6c 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  l.**    \\    ->
6b90: 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74   backslash.*/.st
6ba0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
6bb0: 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68  e_backslashes(ch
6bc0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
6bd0: 20 6a 2c 20 63 3b 0a 20 20 66 6f 72 28 69 3d 6a   j, c;.  for(i=j
6be0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
6bf0: 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  0; i++, j++){.  
6c00: 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b    if( c=='\\' ){
6c10: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69  .      c = z[++i
6c20: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
6c30: 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'n' ){.        c
6c40: 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d   = '\n';.      }
6c50: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20  else if( c=='t' 
6c60: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
6c70: 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \t';.      }else
6c80: 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20   if( c=='r' ){. 
6c90: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b         c = '\r';
6ca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6cb0: 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37   c>='0' && c<='7
6cc0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d  ' ){.        c -
6cd0: 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  = '0';.        i
6ce0: 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
6cf0: 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
6d00: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
6d10: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
6d20: 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
6d30: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
6d40: 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
6d50: 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
6d60: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
6d80: 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
6d90: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
6da0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6db0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
6dc0: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
6dd0: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
6de0: 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61  Interpret zArg a
6df0: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
6e00: 65 2e 20 20 52 65 74 75 72 6e 20 65 69 74 68 65  e.  Return eithe
6e10: 72 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61  r 0 or 1..*/.sta
6e20: 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56  tic int booleanV
6e30: 61 6c 75 65 28 63 68 61 72 20 2a 7a 41 72 67 29  alue(char *zArg)
6e40: 7b 0a 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 74  {.  int val = at
6e50: 6f 69 28 7a 41 72 67 29 3b 0a 20 20 69 6e 74 20  oi(zArg);.  int 
6e60: 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 41  j;.  for(j=0; zA
6e70: 72 67 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  rg[j]; j++){.   
6e80: 20 7a 41 72 67 5b 6a 5d 20 3d 20 74 6f 6c 6f 77   zArg[j] = tolow
6e90: 65 72 28 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 7d  er(zArg[j]);.  }
6ea0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  .  if( strcmp(zA
6eb0: 72 67 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  rg,"on")==0 ){. 
6ec0: 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20 7d 65     val = 1;.  }e
6ed0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6ee0: 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  Arg,"yes")==0 ){
6ef0: 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20  .    val = 1;.  
6f00: 7d 0a 20 20 72 65 74 75 72 6e 20 76 61 6c 3b 0a  }.  return val;.
6f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  }../*.** If an i
6f20: 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
6f30: 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
6f40: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
6f50: 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
6f60: 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
6f70: 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
6f80: 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
6f90: 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
6fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6fb0: 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63  o_meta_command(c
6fc0: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74 72 75  har *zLine, stru
6fd0: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
6fe0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20   *p){.  int i = 
6ff0: 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
7000: 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
7010: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
7020: 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
7030: 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
7040: 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
7050: 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
7060: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26  hile( zLine[i] &
7070: 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
7080: 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77  (azArg) ){.    w
7090: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 28 75  hile( isspace((u
70a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69  nsigned char)zLi
70b0: 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  ne[i]) ){ i++; }
70c0: 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69  .    if( zLine[i
70d0: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
70e0: 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d    if( zLine[i]==
70f0: 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d  '\'' || zLine[i]
7100: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
7110: 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
7120: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [i++];.      azA
7130: 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
7140: 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77 68  ine[i];.      wh
7150: 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26  ile( zLine[i] &&
7160: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d   zLine[i]!=delim
7170: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ i++; }.     
7180: 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 64   if( zLine[i]==d
7190: 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
71a0: 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a  zLine[i++] = 0;.
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
71c0: 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72  ( delim=='"' ) r
71d0: 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
71e0: 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
71f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7200: 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
7210: 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20  ] = &zLine[i];. 
7220: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
7230: 65 5b 69 5d 20 26 26 20 21 69 73 73 70 61 63 65  e[i] && !isspace
7240: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
7250: 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b  zLine[i]) ){ i++
7260: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
7270: 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e 65 5b 69  ine[i] ) zLine[i
7280: 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ++] = 0;.      r
7290: 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
72a0: 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
72b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
72c0: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69  /* Process the i
72d0: 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  nput line..  */.
72e0: 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20    if( nArg==0 ) 
72f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
7300: 20 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 30 5d   strlen(azArg[0]
7310: 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30  );.  c = azArg[0
7320: 5d 5b 30 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ][0];.  if( c=='
7330: 62 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  b' && n>1 && str
7340: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
7350: 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20  bail", n)==0 && 
7360: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 62 61  nArg>1 ){.    ba
7370: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
7380: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
7390: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  [1]);.  }else.. 
73a0: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
73b0: 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
73c0: 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
73d0: 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
73e0: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
73f0: 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20  k_data data;.   
7400: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
7410: 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
7420: 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  p);.    memcpy(&
7430: 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
7440: 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
7450: 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b  .showHeader = 1;
7460: 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d  .    data.mode =
7470: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   MODE_Column;.  
7480: 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b    data.colWidth[
7490: 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61 74 61  0] = 3;.    data
74a0: 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31  .colWidth[1] = 1
74b0: 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57  5;.    data.colW
74c0: 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a 20 20  idth[2] = 58;.  
74d0: 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a    data.cnt = 0;.
74e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
74f0: 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
7500: 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 20 22  database_list; "
7510: 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  , callback, &dat
7520: 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
7530: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
7540: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
7550: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
7560: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
7570: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7580: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
7590: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
75a0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63   c=='d' && strnc
75b0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75  mp(azArg[0], "du
75c0: 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  mp", n)==0 ){.  
75d0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
75e0: 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
75f0: 28 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  (p);.    fprintf
7600: 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20  (p->out, "BEGIN 
7610: 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29  TRANSACTION;\n")
7620: 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c  ;.    p->writabl
7630: 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
7640: 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
7650: 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
7660: 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a  _dump_query(p, .
7670: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
7680: 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
7690: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
76a0: 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
76b0: 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
76c0: 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
76d0: 65 27 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  e'", 0.      );.
76e0: 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
76f0: 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75  dump_query(p->ou
7700: 74 2c 20 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  t, p->db,.      
7710: 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
7720: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
7730: 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
7740: 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
7750: 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
7760: 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
7770: 69 65 77 27 29 22 0a 20 20 20 20 20 20 29 3b 0a  iew')".      );.
7780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7790: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
77a0: 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
77b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 68  ++){.        zSh
77c0: 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72  ellStatic = azAr
77d0: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 72 75  g[i];.        ru
77e0: 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
77f0: 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20  ery(p,.         
7800: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
7810: 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
7820: 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
7830: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
7840: 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65  bl_name LIKE she
7850: 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20 74  llstatic() AND t
7860: 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20  ype=='table'".  
7870: 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73          "  AND s
7880: 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 30 29  ql NOT NULL", 0)
7890: 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 74 61  ;.        run_ta
78a0: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
78b0: 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a 20 20  ->out, p->db,.  
78c0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
78d0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
78e0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
78f0: 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
7900: 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
7910: 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
7920: 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
7930: 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
7940: 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62         "  AND tb
7950: 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
7960: 6c 73 74 61 74 69 63 28 29 22 0a 20 20 20 20 20  lstatic()".     
7970: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 53     );.        zS
7980: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
79a0: 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c    if( p->writabl
79b0: 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
79c0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
79d0: 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
79e0: 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
79f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
7a00: 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
7a10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
7a20: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66  rrMsg ){.      f
7a30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
7a40: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
7a50: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
7a60: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
7a70: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
7a80: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
7a90: 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22  out, "COMMIT;\n"
7aa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
7ab0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
7ac0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
7ad0: 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d  0], "echo", n)==
7ae0: 30 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20  0 && nArg>1 ){. 
7af0: 20 20 20 70 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62     p->echoOn = b
7b00: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
7b10: 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
7b20: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
7b30: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
7b40: 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20  , "exit", n)==0 
7b50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  ){.    rc = 2;. 
7b60: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
7b70: 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
7b80: 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
7b90: 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
7ba0: 20 20 69 6e 74 20 76 61 6c 20 3d 20 6e 41 72 67    int val = nArg
7bb0: 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c  >=2 ? booleanVal
7bc0: 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 31  ue(azArg[1]) : 1
7bd0: 3b 0a 20 20 20 20 69 66 28 76 61 6c 20 3d 3d 20  ;.    if(val == 
7be0: 31 29 20 7b 0a 20 20 20 20 20 20 69 66 28 21 70  1) {.      if(!p
7bf0: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61  ->explainPrev.va
7c00: 6c 69 64 29 20 7b 0a 20 20 20 20 20 20 20 20 70  lid) {.        p
7c10: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61  ->explainPrev.va
7c20: 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
7c30: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
7c40: 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  mode = p->mode;.
7c50: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61          p->expla
7c60: 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61 64 65  inPrev.showHeade
7c70: 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
7c80: 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  r;.        memcp
7c90: 79 28 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  y(p->explainPrev
7ca0: 2e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 63 6f 6c  .colWidth,p->col
7cb0: 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e  Width,sizeof(p->
7cc0: 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20  colWidth));.    
7cd0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 57 65 20    }.      /* We 
7ce0: 63 6f 75 6c 64 20 70 75 74 20 74 68 69 73 20 63  could put this c
7cf0: 6f 64 65 20 75 6e 64 65 72 20 74 68 65 20 21 70  ode under the !p
7d00: 2d 3e 65 78 70 6c 61 69 6e 56 61 6c 69 64 0a 20  ->explainValid. 
7d10: 20 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f       ** conditio
7d20: 6e 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  n so that it doe
7d30: 73 20 6e 6f 74 20 65 78 65 63 75 74 65 20 69 66  s not execute if
7d40: 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
7d50: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 6c  in.      ** expl
7d60: 61 69 6e 20 6d 6f 64 65 2e 20 48 6f 77 65 76 65  ain mode. Howeve
7d70: 72 2c 20 61 6c 77 61 79 73 20 65 78 65 63 75 74  r, always execut
7d80: 69 6e 67 20 69 74 20 61 6c 6c 6f 77 73 20 75 73  ing it allows us
7d90: 20 61 6e 20 65 61 73 79 0a 20 20 20 20 20 20 2a   an easy.      *
7da0: 2a 20 77 61 73 20 74 6f 20 72 65 73 65 74 20 74  * was to reset t
7db0: 6f 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 69  o explain mode i
7dc0: 6e 20 63 61 73 65 20 74 68 65 20 75 73 65 72 20  n case the user 
7dd0: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20  previously.     
7de0: 20 2a 2a 20 64 69 64 20 61 6e 20 2e 65 78 70 6c   ** did an .expl
7df0: 61 69 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ain followed by 
7e00: 61 20 2e 77 69 64 74 68 2c 20 2e 6d 6f 64 65 20  a .width, .mode 
7e10: 6f 72 20 2e 68 65 61 64 65 72 0a 20 20 20 20 20  or .header.     
7e20: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20   ** command..   
7e30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6d     */.      p->m
7e40: 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
7e50: 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f  in;.      p->sho
7e60: 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
7e70: 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 63 6f 6c     memset(p->col
7e80: 57 69 64 74 68 2c 30 2c 41 72 72 61 79 53 69 7a  Width,0,ArraySiz
7e90: 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b  e(p->colWidth));
7ea0: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
7eb0: 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[0] = 4;      
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
7ed0: 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  ddr */.      p->
7ee0: 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31 33  colWidth[1] = 13
7ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7f00: 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f 0a 20    /* opcode */. 
7f10: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
7f20: 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20  [2] = 4;        
7f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
7f40: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
7f50: 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20 20 20  idth[3] = 4;    
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f70: 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e   P2 */.      p->
7f80: 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20 34 3b  colWidth[4] = 4;
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
7fb0: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35 5d 20   p->colWidth[5] 
7fc0: 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 13;           
7fd0: 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
7fe0: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
7ff0: 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20 20 20  [6] = 2;        
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
8010: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
8020: 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20 20 20  idth[7] = 13;   
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8040: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
8050: 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 65 78   }else if (p->ex
8060: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29  plainPrev.valid)
8070: 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 70 6c   {.      p->expl
8080: 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20  ainPrev.valid = 
8090: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  0;.      p->mode
80a0: 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65   = p->explainPre
80b0: 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  v.mode;.      p-
80c0: 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d  >showHeader = p-
80d0: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f  >explainPrev.sho
80e0: 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 6d  wHeader;.      m
80f0: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74  emcpy(p->colWidt
8100: 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  h,p->explainPrev
8110: 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  .colWidth,sizeof
8120: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
8130: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
8140: 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 28   if( c=='h' && (
8150: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
8160: 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d  , "header", n)==
8170: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
8180: 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a        strncmp(az
8190: 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73  Arg[0], "headers
81a0: 22 2c 20 6e 29 3d 3d 30 20 29 26 26 20 6e 41 72  ", n)==0 )&& nAr
81b0: 67 3e 31 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68  g>1 ){.    p->sh
81c0: 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65  owHeader = boole
81d0: 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
81e0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
81f0: 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
8200: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
8210: 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  elp", n)==0 ){. 
8220: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8230: 72 2c 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73  r,zHelp);.  }els
8240: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  e..  if( c=='i' 
8250: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
8260: 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e  [0], "import", n
8270: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 33 20  )==0 && nArg>=3 
8280: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61  ){.    char *zTa
8290: 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20  ble = azArg[2]; 
82a0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
82b0: 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
82c0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
82d0: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
82e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
82f0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
8300: 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
8310: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
8320: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
8330: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
8340: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
8370: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
83a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
83b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
83c0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
83d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
83e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
83f0: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
8400: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8420: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
8430: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8460: 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65 70 61  bytes in p->sepa
8470: 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63  rator[] */.    c
8480: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
8490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
84a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
84b0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
84c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
84d0: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
84e0: 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
84f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
8500: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8520: 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
8530: 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
8540: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d  /.    char *zCom
8550: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
8560: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
8570: 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 20 20 20  it changes */   
8580: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
85b0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
85c0: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
85d0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
85e0: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
85f0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f  le */..    open_
8600: 64 62 28 70 29 3b 0a 20 20 20 20 6e 53 65 70 20  db(p);.    nSep 
8610: 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 73 65 70 61  = strlen(p->sepa
8620: 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  rator);.    if( 
8630: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
8640: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
8650: 20 22 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72   "non-null separ
8660: 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
8670: 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20  r import\n");.  
8680: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8690: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
86a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
86b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
86c0: 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
86d0: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
86e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6e 42  return 0;.    nB
86f0: 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71  yte = strlen(zSq
8700: 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l);.    rc = sql
8710: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
8720: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
8730: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
8740: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
8750: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8760: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
8770: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
8780: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
8790: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 6e  sg(db));.      n
87a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Col = 0;.      r
87b0: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
87c0: 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  {.      nCol = s
87d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
87e0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
87f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
8800: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8810: 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29     if( nCol==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a   return 0;.    z
8830: 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  Sql = malloc( nB
8840: 79 74 65 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a  yte + 20 + nCol*
8850: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  2 );.    if( zSq
8860: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
8870: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8880: 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20  rintf(nByte+20, 
8890: 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e  zSql, "INSERT IN
88a0: 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f  TO '%q' VALUES(?
88b0: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
88c0: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  j = strlen(zSql)
88d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
88e0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
88f0: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
8900: 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
8910: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
8920: 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
8930: 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
8940: 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
8950: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
8960: 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
8970: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8980: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
8990: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
89a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
89b0: 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
89c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
89d0: 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
89e0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
89f0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8a00: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e   1;.    }.    in
8a10: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
8a20: 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69  "rb");.    if( i
8a30: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
8a40: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
8a50: 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
8a60: 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a   %s\n", zFile);.
8a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8a80: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8a90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8aa0: 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
8ab0: 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
8ac0: 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
8ad0: 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
8ae0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
8af0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
8b00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8b10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
8b20: 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e  ec(p->db, "BEGIN
8b30: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
8b40: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d   zCommit = "COMM
8b50: 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  IT";.    while( 
8b60: 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67  (zLine = local_g
8b70: 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d  etline(0, in))!=
8b80: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
8b90: 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b  *z;.      i = 0;
8ba0: 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
8bb0: 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20  .      azCol[0] 
8bc0: 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  = zLine;.      f
8bd0: 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b  or(i=0, z=zLine;
8be0: 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20   *z && *z!='\n' 
8bf0: 26 26 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b  && *z!='\r'; z++
8c00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
8c10: 7a 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b  z==p->separator[
8c20: 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  0] && strncmp(z,
8c30: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e   p->separator, n
8c40: 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sep)==0 ){.     
8c50: 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20       *z = 0;.   
8c60: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
8c70: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
8c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c90: 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53  azCol[i] = &z[nS
8ca0: 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
8cb0: 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20   z += nSep-1;.  
8cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8ce0: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20    *z = 0;.      
8cf0: 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
8d00: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
8d10: 28 73 74 64 65 72 72 2c 22 25 73 20 6c 69 6e 65  (stderr,"%s line
8d20: 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
8d30: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
8d40: 20 62 75 74 20 66 6f 75 6e 64 20 25 64 5c 6e 22   but found %d\n"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
8d60: 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
8d70: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
8d80: 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
8d90: 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
8da0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8db0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
8dc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8dd0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
8de0: 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
8df0: 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51  azCol[i], -1, SQ
8e00: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8e10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e20: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
8e30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8e40: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
8e50: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69  ;.      free(zLi
8e60: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
8e70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8e80: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
8e90: 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
8ea0: 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
8eb0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
8ec0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
8ed0: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
8ee0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
8ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8f00: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
8f10: 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zCol);.    fclos
8f20: 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(in);.    sqlit
8f30: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
8f40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
8f50: 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 6f 6d  exec(p->db, zCom
8f60: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  mit, 0, 0, 0);. 
8f70: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
8f80: 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
8f90: 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63  azArg[0], "indic
8fa0: 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  es", n)==0 && nA
8fb0: 72 67 3e 31 20 29 7b 0a 20 20 20 20 73 74 72 75  rg>1 ){.    stru
8fc0: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
8fd0: 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
8fe0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
8ff0: 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20    open_db(p);.  
9000: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
9010: 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
9020: 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
9030: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
9040: 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
9050: 4c 69 73 74 3b 0a 20 20 20 20 7a 53 68 65 6c 6c  List;.    zShell
9060: 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31  Static = azArg[1
9070: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ];.    sqlite3_e
9080: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
9090: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
90a0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
90b0: 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20   ".      "WHERE 
90c0: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
90d0: 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73   tbl_name LIKE s
90e0: 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20  hellstatic() ". 
90f0: 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20       "UNION ALL 
9100: 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ".      "SELECT 
9110: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
9120: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20  _temp_master ". 
9130: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
9140: 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c  ='index' AND tbl
9150: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
9160: 73 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20  static() ".     
9170: 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20   "ORDER BY 1",. 
9180: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
9190: 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20  data, &zErrMsg. 
91a0: 20 20 20 29 3b 0a 20 20 20 20 7a 53 68 65 6c 6c     );.    zShell
91b0: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
91c0: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
91d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
91e0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
91f0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
9200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9210: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
9220: 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65 66 20    }else..#ifdef 
9230: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9240: 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27  TRACE.  if( c=='
9250: 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
9260: 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65  Arg[0], "iotrace
9270: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
9280: 65 78 74 65 72 6e 20 76 6f 69 64 20 28 2a 73 71  extern void (*sq
9290: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
92a0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b  nst char*, ...);
92b0: 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65  .    if( iotrace
92c0: 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64   && iotrace!=std
92d0: 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74  out ) fclose(iot
92e0: 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61  race);.    iotra
92f0: 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ce = 0;.    if( 
9300: 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
9310: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
9320: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
9330: 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
9340: 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20  ], "-")==0 ){.  
9350: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9360: 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e  ce = iotracePrin
9370: 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63  tf;.      iotrac
9380: 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  e = stdout;.    
9390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
93a0: 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41  race = fopen(azA
93b0: 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20  rg[1], "w");.   
93c0: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d     if( iotrace==
93d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
93e0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
93f0: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
9400: 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
9410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
9420: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
9430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9440: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
9450: 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b  = iotracePrintf;
9460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9470: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23   }else.#endif..#
9480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9490: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
94a0: 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  N.  if( c=='l' &
94b0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
94c0: 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d  0], "load", n)==
94d0: 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a  0 && nArg>=2 ){.
94e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
94f0: 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20  zFile, *zProc;. 
9500: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
9510: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 63   = 0;.    int rc
9520: 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  ;.    zFile = az
9530: 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f  Arg[1];.    zPro
9540: 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  c = nArg>=3 ? az
9550: 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20  Arg[2] : 0;.    
9560: 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
9570: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61  rc = sqlite3_loa
9580: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
9590: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
95a0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
95b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
95c0: 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  K ){.      fprin
95d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
95e0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
95f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9600: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
9610: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
9620: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
9630: 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74  if( c=='m' && st
9640: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
9650: 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26  "mode", n)==0 &&
9660: 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20   nArg>=2 ){.    
9670: 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 28  int n2 = strlen(
9680: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69  azArg[1]);.    i
9690: 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
96a0: 5b 31 5d 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d 3d  [1],"line",n2)==
96b0: 30 0a 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20  0.        ||.   
96c0: 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a 41       strncmp(azA
96d0: 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32  rg[1],"lines",n2
96e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
96f0: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e  >mode = MODE_Lin
9700: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
9710: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
9720: 5d 2c 22 63 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d  ],"column",n2)==
9730: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
9740: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
9750: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
9760: 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d  ],"columns",n2)=
9770: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
9780: 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d  ode = MODE_Colum
9790: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
97a0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
97b0: 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20  ],"list",n2)==0 
97c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
97d0: 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
97e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
97f0: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74  cmp(azArg[1],"ht
9800: 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ml",n2)==0 ){.  
9810: 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
9820: 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c  DE_Html;.    }el
9830: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61  se if( strncmp(a
9840: 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32  zArg[1],"tcl",n2
9850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
9860: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c  >mode = MODE_Tcl
9870: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9880: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
9890: 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"csv",n2)==0 ){
98a0: 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
98b0: 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20   MODE_Csv;.     
98c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
98d0: 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61  f(sizeof(p->sepa
98e0: 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72  rator), p->separ
98f0: 61 74 6f 72 2c 20 22 2c 22 29 3b 0a 20 20 20 20  ator, ",");.    
9900: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
9910: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
9920: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
9930: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
9940: 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
9950: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9960: 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
9970: 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  r), p->separator
9980: 2c 20 22 5c 74 22 29 3b 0a 20 20 20 20 7d 65 6c  , "\t");.    }el
9990: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61  se if( strncmp(a
99a0: 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22  zArg[1],"insert"
99b0: 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
99c0: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
99d0: 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 69 66  Insert;.      if
99e0: 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20  ( nArg>=3 ){.   
99f0: 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e       set_table_n
9a00: 61 6d 65 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29  ame(p, azArg[2])
9a10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9a20: 20 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65         set_table
9a30: 5f 6e 61 6d 65 28 70 2c 20 22 74 61 62 6c 65 22  _name(p, "table"
9a40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9a50: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 66 70 72  else {.      fpr
9a60: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 6f 64  intf(stderr,"mod
9a70: 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
9a80: 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22  of: ".         "
9a90: 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20  column csv html 
9aa0: 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74  insert line list
9ab0: 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20   tabs tcl\n");. 
9ac0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
9ad0: 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74  if( c=='n' && st
9ae0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
9af0: 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d  "nullvalue", n)=
9b00: 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 20  =0 && nArg==2 ) 
9b10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
9b20: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
9b30: 3e 6e 75 6c 6c 76 61 6c 75 65 29 2c 20 70 2d 3e  >nullvalue), p->
9b40: 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20  nullvalue,.     
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72  "%.*s", (int)Arr
9b70: 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 76 61  aySize(p->nullva
9b80: 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d  lue)-1, azArg[1]
9b90: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
9ba0: 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e  ( c=='o' && strn
9bb0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
9bc0: 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26  utput", n)==0 &&
9bd0: 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
9be0: 69 66 28 20 70 2d 3e 6f 75 74 21 3d 73 74 64 6f  if( p->out!=stdo
9bf0: 75 74 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  ut ){.      fclo
9c00: 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  se(p->out);.    
9c10: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
9c20: 28 61 7a 41 72 67 5b 31 5d 2c 22 73 74 64 6f 75  (azArg[1],"stdou
9c30: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
9c40: 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
9c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9c60: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
9c70: 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
9c80: 75 74 66 69 6c 65 2c 20 22 73 74 64 6f 75 74 22  utfile, "stdout"
9c90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9ca0: 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 66 6f 70      p->out = fop
9cb0: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 62  en(azArg[1], "wb
9cc0: 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
9cd0: 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
9ce0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9cf0: 72 2c 22 63 61 6e 27 74 20 77 72 69 74 65 20 74  r,"can't write t
9d00: 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  o \"%s\"\n", azA
9d10: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
9d20: 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
9d30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
9d40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9d50: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9d60: 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d  (p->outfile), p-
9d70: 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20  >outfile, "%s", 
9d80: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
9d90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
9da0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
9db0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
9dc0: 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29  0], "prompt", n)
9dd0: 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32 20  ==0 && (nArg==2 
9de0: 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20 20  || nArg==3)){.  
9df0: 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29    if( nArg >= 2)
9e00: 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
9e10: 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72  (mainPrompt,azAr
9e20: 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[1],(int)ArrayS
9e30: 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d  ize(mainPrompt)-
9e40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
9e50: 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20  ( nArg >= 3) {. 
9e60: 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e       strncpy(con
9e70: 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72  tinuePrompt,azAr
9e80: 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[2],(int)ArrayS
9e90: 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  ize(continueProm
9ea0: 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
9eb0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
9ec0: 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
9ed0: 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c  zArg[0], "quit",
9ee0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
9ef0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
9f00: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 73   if( c=='r' && s
9f10: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
9f20: 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26   "read", n)==0 &
9f30: 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  & nArg==2 ){.   
9f40: 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70   FILE *alt = fop
9f50: 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
9f60: 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
9f80: 6e 74 66 28 73 74 64 65 72 72 2c 22 63 61 6e 27  ntf(stderr,"can'
9f90: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
9fa0: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
9fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72   }else{.      pr
9fc0: 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
9fd0: 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
9fe0: 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
9ff0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
a000: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
a010: 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
a020: 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
a030: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
a040: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
a050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
a060: 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ;.    open_db(p)
a070: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a080: 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
a090: 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
a0a0: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
a0b0: 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
a0c0: 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
a0d0: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
a0e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
a0f0: 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d  or(i=0; azArg[1]
a100: 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b  [i]; i++) azArg[
a110: 31 5d 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  1][i] = tolower(
a120: 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20 20  azArg[1][i]);.  
a130: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
a140: 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
a150: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
a160: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
a170: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
a180: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
a190: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
a1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69  REATE TABLE sqli
a1b0: 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  te_master (\n". 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
a1e0: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
a200: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
a230: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
a250: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
a260: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
a270: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
a280: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
a2b0: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
a2c0: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
a2d0: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
a2e0: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
a2f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
a300: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
a310: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
a320: 6c 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lv);.      }else
a330: 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
a340: 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d  g[1],"sqlite_tem
a350: 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  p_master")==0 ){
a360: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
a370: 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
a380: 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
a390: 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
a3a0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
a3b0: 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  LE sqlite_temp_m
a3c0: 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20  aster (\n".     
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
a3f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
a400: 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
a410: 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
a430: 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
a440: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
a450: 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
a460: 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
a470: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
a480: 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
a490: 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
a4b0: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
a4c0: 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
a4d0: 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
a4e0: 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
a4f0: 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
a500: 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
a510: 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
a520: 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
a530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a540: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
a550: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
a560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
a570: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
a580: 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
a590: 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20   FROM ".        
a5a0: 20 20 22 20 20 28 53 45 4c 45 43 54 20 2a 20 46    "  (SELECT * F
a5b0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
a5c0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
a5d0: 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
a5e0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
a5f0: 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
a600: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
a610: 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
a620: 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20  ellstatic() AND 
a630: 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
a640: 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20   sql NOTNULL ". 
a650: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
a660: 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c 32  BY substr(type,2
a670: 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20  ,1), name",.    
a680: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
a690: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
a6a0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
a6b0: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
a6c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
a6e0: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
a6f0: 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
a700: 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  OM ".         " 
a710: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
a720: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
a730: 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
a740: 20 20 22 20 20 20 53 45 4c 45 43 54 20 2a 20 46    "   SELECT * F
a750: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
a760: 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20  master) ".      
a770: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
a780: 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
a790: 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
a7a0: 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
a7b0: 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f  _%'".         "O
a7c0: 52 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74  RDER BY substr(t
a7d0: 79 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c  ype,2,1), name",
a7e0: 0a 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  .         callba
a7f0: 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
a800: 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Msg.      );.   
a810: 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
a820: 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
a830: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
a840: 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
a850: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
a860: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
a870: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
a880: 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
a890: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
a8a0: 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20 6e  , "separator", n
a8b0: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
a8c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
a8d0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
a8e0: 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  ->separator), p-
a8f0: 3e 73 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20  >separator,.    
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 73 69   "%.*s", (int)si
a920: 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
a930: 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  r)-1, azArg[1]);
a940: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
a950: 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
a960: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f  p(azArg[0], "sho
a970: 77 22 2c 20 6e 29 3d 3d 30 29 7b 0a 20 20 20 20  w", n)==0){.    
a980: 69 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e  int i;.    fprin
a990: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
a9a0: 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20  : %s\n","echo", 
a9b0: 70 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22  p->echoOn ? "on"
a9c0: 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66   : "off");.    f
a9d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a9e0: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70  9.9s: %s\n","exp
a9f0: 6c 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69  lain", p->explai
aa00: 6e 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f  nPrev.valid ? "o
aa10: 6e 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20  n" :"off");.    
aa20: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
aa30: 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65  %9.9s: %s\n","he
aa40: 61 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48  aders", p->showH
aa50: 65 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22  eader ? "on" : "
aa60: 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  off");.    fprin
aa70: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
aa80: 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20  : %s\n","mode", 
aa90: 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64  modeDescr[p->mod
aaa0: 65 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  e]);.    fprintf
aab0: 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
aac0: 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b  ", "nullvalue");
aad0: 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
aae0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
aaf0: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
ab00: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
ab10: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ut, "\n");.    f
ab20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
ab30: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74  9.9s: %s\n","out
ab40: 70 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  put",.          
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d         strlen(p-
ab70: 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f  >outfile) ? p->o
ab80: 75 74 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74  utfile : "stdout
ab90: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
aba0: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
abb0: 2c 20 22 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  , "separator");.
abc0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
abd0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
abe0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
abf0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
ac00: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
ac10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
ac20: 2e 39 73 3a 20 22 2c 22 77 69 64 74 68 22 29 3b  .9s: ","width");
ac30: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c  .    for (i=0;i<
ac40: 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
ac50: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70  ->colWidth) && p
ac60: 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d  ->colWidth[i] !=
ac70: 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20   0;i++) {.      
ac80: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
ac90: 25 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74 68  %d ",p->colWidth
aca0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
acb0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
acc0: 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  \n");.  }else.. 
acd0: 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
ace0: 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
acf0: 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22  Arg[0], "tables"
ad00: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
ad10: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
ad20: 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 72 63      int nRow, rc
ad30: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
ad40: 4d 73 67 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  Msg;.    open_db
ad50: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
ad60: 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  g==1 ){.      rc
ad70: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
ad80: 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20  able(p->db,.    
ad90: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
ada0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
adb0: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
adc0: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
add0: 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e  able','view') AN
ade0: 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
adf0: 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20  'sqlite_%'".    
ae00: 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
ae10: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
ae20: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
ae30: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a  e_temp_master ".
ae40: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
ae50: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
ae60: 27 76 69 65 77 27 29 20 22 0a 20 20 20 20 20 20  'view') ".      
ae70: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
ae80: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
ae90: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
aea0: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
aeb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aec0: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
aed0: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72  zArg[1];.      r
aee0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  c = sqlite3_get_
aef0: 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20  table(p->db,.   
af00: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
af10: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
af20: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
af30: 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27  WHERE type IN ('
af40: 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 41  table','view') A
af50: 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 27  ND name LIKE '%'
af60: 7c 7c 73 68 65 6c 6c 73 74 61 74 69 63 28 29 7c  ||shellstatic()|
af70: 7c 27 25 27 20 22 0a 20 20 20 20 20 20 20 20 22  |'%' ".        "
af80: 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20  UNION ALL ".    
af90: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
afa0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
afb0: 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  p_master ".     
afc0: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49     "WHERE type I
afd0: 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
afe0: 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45  ') AND name LIKE
aff0: 20 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61 74 69   '%'||shellstati
b000: 63 28 29 7c 7c 27 25 27 20 22 0a 20 20 20 20 20  c()||'%' ".     
b010: 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c     "ORDER BY 1",
b020: 0a 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75  .        &azResu
b030: 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a  lt, &nRow, 0, &z
b040: 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a  ErrMsg.      );.
b050: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
b060: 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ic = 0;.    }.  
b070: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
b080: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
b090: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
b0a0: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
b0b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
b0c0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
b0d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
b0e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b0f0: 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e   int len, maxlen
b100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
b110: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, j;.      int 
b120: 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e  nPrintCol, nPrin
b130: 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28  tRow;.      for(
b140: 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b  i=1; i<=nRow; i+
b150: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
b160: 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29  azResult[i]==0 )
b170: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b180: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
b190: 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20  azResult[i]);.  
b1a0: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61        if( len>ma
b1b0: 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
b1c0: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
b1d0: 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38     nPrintCol = 8
b1e0: 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20  0/(maxlen+2);.  
b1f0: 20 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f      if( nPrintCo
b200: 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20  l<1 ) nPrintCol 
b210: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e  = 1;.      nPrin
b220: 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e  tRow = (nRow + n
b230: 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50  PrintCol - 1)/nP
b240: 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66  rintCol;.      f
b250: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74  or(i=0; i<nPrint
b260: 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Row; i++){.     
b270: 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
b280: 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74  =nRow; j+=nPrint
b290: 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Row){.          
b2a0: 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 3d 6e  char *zSp = j<=n
b2b0: 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20  PrintRow ? "" : 
b2c0: 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20  "  ";.          
b2d0: 70 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c  printf("%s%-*s",
b2e0: 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a   zSp, maxlen, az
b2f0: 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65  Result[j] ? azRe
b300: 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20  sult[j] : "");. 
b310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b320: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
b330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b340: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
b350: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b360: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 7a 52  3_free_table(azR
b370: 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  esult);.  }else.
b380: 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26  .  if( c=='t' &&
b390: 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70 28   n>4 && strncmp(
b3a0: 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f  azArg[0], "timeo
b3b0: 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ut", n)==0 && nA
b3c0: 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 6f 70 65  rg>=2 ){.    ope
b3d0: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 73 71 6c  n_db(p);.    sql
b3e0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
b3f0: 74 28 70 2d 3e 64 62 2c 20 61 74 6f 69 28 61 7a  t(p->db, atoi(az
b400: 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65 6c 73  Arg[1]));.  }els
b410: 65 0a 20 20 0a 23 69 66 20 48 41 53 5f 54 49 4d  e.  .#if HAS_TIM
b420: 45 52 20 20 0a 20 20 69 66 28 20 63 3d 3d 27 74  ER  .  if( c=='t
b430: 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72  ' && n>=5 && str
b440: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
b450: 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 26 26  timer", n)==0 &&
b460: 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 65   nArg>1 ){.    e
b470: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f 6f  nableTimer = boo
b480: 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
b490: 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  1]);.  }else.#en
b4a0: 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 77  dif..  if( c=='w
b4b0: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
b4c0: 72 67 5b 30 5d 2c 20 22 77 69 64 74 68 22 2c 20  rg[0], "width", 
b4d0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
b4e0: 20 6a 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   j;.    assert( 
b4f0: 6e 41 72 67 3c 3d 41 72 72 61 79 53 69 7a 65 28  nArg<=ArraySize(
b500: 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 66 6f  azArg) );.    fo
b510: 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26  r(j=1; j<nArg &&
b520: 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   j<ArraySize(p->
b530: 63 6f 6c 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b  colWidth); j++){
b540: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
b550: 74 68 5b 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61  th[j-1] = atoi(a
b560: 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[j]);.    }.
b570: 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 7b 0a 20 20    }else...  {.  
b580: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b590: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61  , "unknown comma
b5a0: 6e 64 20 6f 72 20 69 6e 76 61 6c 69 64 20 61 72  nd or invalid ar
b5b0: 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20 20 20 20  guments: ".     
b5c0: 20 22 20 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72   " \"%s\". Enter
b5d0: 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68   \".help\" for h
b5e0: 65 6c 70 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  elp\n", azArg[0]
b5f0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b600: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
b610: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 73  turn TRUE if a s
b620: 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73 20  emicolon occurs 
b630: 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
b640: 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74 65  first N characte
b650: 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 20  rs.** of string 
b660: 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  z[]..*/.static i
b670: 6e 74 20 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d  nt _contains_sem
b680: 69 63 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  icolon(const cha
b690: 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  r *z, int N){.  
b6a0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b6b0: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20 69 66  ; i<N; i++){  if
b6c0: 28 20 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20 72 65  ( z[i]==';' ) re
b6d0: 74 75 72 6e 20 31 3b 20 7d 0a 20 20 72 65 74 75  turn 1; }.  retu
b6e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
b6f0: 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 61 20  est to see if a 
b700: 6c 69 6e 65 20 63 6f 6e 73 69 73 74 73 20 65 6e  line consists en
b710: 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65 73  tirely of whites
b720: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
b730: 69 6e 74 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70  int _all_whitesp
b740: 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ace(const char *
b750: 7a 29 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a 3b 20  z){.  for(; *z; 
b760: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73  z++){.    if( is
b770: 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64  space(*(unsigned
b780: 20 63 68 61 72 2a 29 7a 29 20 29 20 63 6f 6e 74   char*)z) ) cont
b790: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 2a 7a  inue;.    if( *z
b7a0: 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='/' && z[1]=='
b7b0: 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *' ){.      z +=
b7c0: 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
b7d0: 20 2a 7a 20 26 26 20 28 2a 7a 21 3d 27 2a 27 20   *z && (*z!='*' 
b7e0: 7c 7c 20 7a 5b 31 5d 21 3d 27 2f 27 29 20 29 7b  || z[1]!='/') ){
b7f0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   z++; }.      if
b800: 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( *z==0 ) return
b810: 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
b820: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b830: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 3d     }.    if( *z=
b840: 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
b850: 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  ' ){.      z += 
b860: 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
b870: 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 29  *z && *z!='\n' )
b880: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { z++; }.      i
b890: 66 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72  f( *z==0 ) retur
b8a0: 6e 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  n 1;.      conti
b8b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nue;.    }.    r
b8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
b8d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
b8e0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b8f0: 20 74 68 65 20 6c 69 6e 65 20 74 79 70 65 64 20   the line typed 
b900: 69 6e 20 69 73 20 61 6e 20 53 51 4c 20 63 6f 6d  in is an SQL com
b910: 6d 61 6e 64 20 74 65 72 6d 69 6e 61 74 6f 72 20  mand terminator 
b920: 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20  other.** than a 
b930: 73 65 6d 69 2d 63 6f 6c 6f 6e 2e 20 20 54 68 65  semi-colon.  The
b940: 20 53 51 4c 20 53 65 72 76 65 72 20 73 74 79 6c   SQL Server styl
b950: 65 20 22 67 6f 22 20 63 6f 6d 6d 61 6e 64 20 69  e "go" command i
b960: 73 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  s understood.** 
b970: 61 73 20 69 73 20 74 68 65 20 4f 72 61 63 6c 65  as is the Oracle
b980: 20 22 2f 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "/"..*/.static 
b990: 69 6e 74 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f  int _is_command_
b9a0: 74 65 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74  terminator(const
b9b0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20   char *zLine){. 
b9c0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
b9d0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
b9e0: 29 7a 4c 69 6e 65 29 20 29 7b 20 7a 4c 69 6e 65  )zLine) ){ zLine
b9f0: 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69  ++; };.  if( zLi
ba00: 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61  ne[0]=='/' && _a
ba10: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
ba20: 4c 69 6e 65 5b 31 5d 29 20 29 20 72 65 74 75 72  Line[1]) ) retur
ba30: 6e 20 31 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20  n 1;  /* Oracle 
ba40: 2a 2f 0a 20 20 69 66 28 20 74 6f 6c 6f 77 65 72  */.  if( tolower
ba50: 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27 20  (zLine[0])=='g' 
ba60: 26 26 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65  && tolower(zLine
ba70: 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20 20  [1])=='o'.      
ba80: 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65     && _all_white
ba90: 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d 29  space(&zLine[2])
baa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
bab0: 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65 72  ;  /* SQL Server
bac0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
bad0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61   0;.}../*.** Rea
bae0: 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 69 6e  d input from *in
baf0: 20 61 6e 64 20 70 72 6f 63 65 73 73 20 69 74 2e   and process it.
bb00: 20 20 49 66 20 2a 69 6e 3d 3d 30 20 74 68 65 6e    If *in==0 then
bb10: 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 69 6e 74   input.** is int
bb20: 65 72 61 63 74 69 76 65 20 2d 20 74 68 65 20 75  eractive - the u
bb30: 73 65 72 20 69 73 20 74 79 70 69 6e 67 20 69 74  ser is typing it
bb40: 20 69 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c   it.  Otherwise,
bb50: 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 63 6f 6d   input.** is com
bb60: 69 6e 67 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ing from a file 
bb70: 6f 72 20 64 65 76 69 63 65 2e 20 20 41 20 70 72  or device.  A pr
bb80: 6f 6d 70 74 20 69 73 20 69 73 73 75 65 64 20 61  ompt is issued a
bb90: 6e 64 20 68 69 73 74 6f 72 79 0a 2a 2a 20 69 73  nd history.** is
bba0: 20 73 61 76 65 64 20 6f 6e 6c 79 20 69 66 20 69   saved only if i
bbb0: 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61 63 74  nput is interact
bbc0: 69 76 65 2e 20 20 41 6e 20 69 6e 74 65 72 72 75  ive.  An interru
bbd0: 70 74 20 73 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a  pt signal will.*
bbe0: 2a 20 63 61 75 73 65 20 74 68 69 73 20 72 6f 75  * cause this rou
bbf0: 74 69 6e 65 20 74 6f 20 65 78 69 74 20 69 6d 6d  tine to exit imm
bc00: 65 64 69 61 74 65 6c 79 2c 20 75 6e 6c 65 73 73  ediately, unless
bc10: 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61   input is intera
bc20: 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ctive..**.** Ret
bc30: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
bc40: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
bc50: 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
bc60: 69 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c  input(struct cal
bc70: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46  lback_data *p, F
bc80: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
bc90: 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63   *zLine = 0;.  c
bca0: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
bcb0: 20 69 6e 74 20 6e 53 71 6c 20 3d 20 30 3b 0a 20   int nSql = 0;. 
bcc0: 20 69 6e 74 20 6e 53 71 6c 50 72 69 6f 72 20 3d   int nSqlPrior =
bcd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
bce0: 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
bcf0: 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b   int errCnt = 0;
bd00: 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20  .  int lineno = 
bd10: 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  0;.  int startli
bd20: 6e 65 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ne = 0;..  while
bd30: 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21  ( errCnt==0 || !
bd40: 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c  bail_on_error ||
bd50: 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e   (in==0 && stdin
bd60: 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29  _is_interactive)
bd70: 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70   ){.    fflush(p
bd80: 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65  ->out);.    free
bd90: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 4c 69  (zLine);.    zLi
bda0: 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c  ne = one_input_l
bdb0: 69 6e 65 28 7a 53 71 6c 2c 20 69 6e 29 3b 0a 20  ine(zSql, in);. 
bdc0: 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
bdd0: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  ){.      break; 
bde0: 20 2f 2a 20 57 65 20 68 61 76 65 20 72 65 61 63   /* We have reac
bdf0: 68 65 64 20 45 4f 46 20 2a 2f 0a 20 20 20 20 7d  hed EOF */.    }
be00: 0a 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74  .    if( seenInt
be10: 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20  errupt ){.      
be20: 69 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61  if( in!=0 ) brea
be30: 6b 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74  k;.      seenInt
be40: 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20  errupt = 0;.    
be50: 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  }.    lineno++;.
be60: 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f      if( p->echoO
be70: 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e  n ) printf("%s\n
be80: 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 69  ", zLine);.    i
be90: 66 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20 7a  f( (zSql==0 || z
bea0: 53 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f 61  Sql[0]==0) && _a
beb0: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c  ll_whitespace(zL
bec0: 69 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ine) ) continue;
bed0: 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26  .    if( zLine &
bee0: 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20  & zLine[0]=='.' 
bef0: 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  && nSql==0 ){.  
bf00: 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61      rc = do_meta
bf10: 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20  _command(zLine, 
bf20: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
bf30: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==2 ){.        b
bf40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
bf50: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
bf60: 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20      errCnt++;.  
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
bf80: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
bf90: 69 66 28 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f  if( _is_command_
bfa0: 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c 69 6e 65  terminator(zLine
bfb0: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
bfc0: 79 28 7a 4c 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a  y(zLine,";",2);.
bfd0: 20 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72      }.    nSqlPr
bfe0: 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20  ior = nSql;.    
bff0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
c000: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c010: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65    for(i=0; zLine
c020: 5b 69 5d 20 26 26 20 69 73 73 70 61 63 65 28 28  [i] && isspace((
c030: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c  unsigned char)zL
c040: 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  ine[i]); i++){}.
c050: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
c060: 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]!=0 ){.       
c070: 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 28 7a   nSql = strlen(z
c080: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Line);.        z
c090: 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53  Sql = malloc( nS
c0a0: 71 6c 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ql+1 );.        
c0b0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
c0c0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
c0d0: 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
c0e0: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
c0f0: 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
c100: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c110: 20 20 6d 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a    memcpy(zSql, z
c120: 4c 69 6e 65 2c 20 6e 53 71 6c 2b 31 29 3b 0a 20  Line, nSql+1);. 
c130: 20 20 20 20 20 20 20 73 74 61 72 74 6c 69 6e 65         startline
c140: 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20   = lineno;.     
c150: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c160: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
c170: 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  rlen(zLine);.   
c180: 20 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f     zSql = reallo
c190: 63 28 20 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20  c( zSql, nSql + 
c1a0: 6c 65 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  len + 2 );.     
c1b0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
c1c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c1d0: 73 74 64 65 72 72 2c 22 25 73 3a 20 6f 75 74 20  stderr,"%s: out 
c1e0: 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20 41  of memory!\n", A
c1f0: 72 67 76 30 29 3b 0a 20 20 20 20 20 20 20 20 65  rgv0);.        e
c200: 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
c210: 20 20 20 20 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b        zSql[nSql+
c220: 2b 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +] = '\n';.     
c230: 20 6d 65 6d 63 70 79 28 26 7a 53 71 6c 5b 6e 53   memcpy(&zSql[nS
c240: 71 6c 5d 2c 20 7a 4c 69 6e 65 2c 20 6c 65 6e 2b  ql], zLine, len+
c250: 31 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b  1);.      nSql +
c260: 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  = len;.    }.   
c270: 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f 63 6f   if( zSql && _co
c280: 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e  ntains_semicolon
c290: 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69 6f 72  (&zSql[nSqlPrior
c2a0: 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72 69 6f  ], nSql-nSqlPrio
c2b0: 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r).             
c2c0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f     && sqlite3_co
c2d0: 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b 0a  mplete(zSql) ){.
c2e0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d 20 30        p->cnt = 0
c2f0: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28  ;.      open_db(
c300: 70 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 5f  p);.      BEGIN_
c310: 54 49 4d 45 52 3b 0a 20 20 20 20 20 20 72 63 20  TIMER;.      rc 
c320: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
c330: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61 6c 6c  ->db, zSql, call
c340: 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73  back, p, &zErrMs
c350: 67 29 3b 0a 20 20 20 20 20 20 45 4e 44 5f 54 49  g);.      END_TI
c360: 4d 45 52 3b 0a 20 20 20 20 20 20 69 66 28 20 72  MER;.      if( r
c370: 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a  c || zErrMsg ){.
c380: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 50 72          char zPr
c390: 65 66 69 78 5b 31 30 30 5d 3b 0a 20 20 20 20 20  efix[100];.     
c3a0: 20 20 20 69 66 28 20 69 6e 21 3d 30 20 7c 7c 20     if( in!=0 || 
c3b0: 21 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61  !stdin_is_intera
c3c0: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  ctive ){.       
c3d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c3e0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66  ntf(sizeof(zPref
c3f0: 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 0a 20  ix), zPrefix, . 
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 22 53 51 4c 20 65            "SQL e
c420: 72 72 6f 72 20 6e 65 61 72 20 6c 69 6e 65 20 25  rror near line %
c430: 64 3a 22 2c 20 73 74 61 72 74 6c 69 6e 65 29 3b  d:", startline);
c440: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c450: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c460: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
c470: 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65  f(zPrefix), zPre
c480: 66 69 78 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  fix, "SQL error:
c490: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
c4a0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
c4b0: 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
c4c0: 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c    printf("%s %s\
c4d0: 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72  n", zPrefix, zEr
c4e0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
c4f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
c500: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
c510: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
c520: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c530: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
c540: 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66 69  %s %s\n", zPrefi
c550: 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  x, sqlite3_errms
c560: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
c570: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72     }.        err
c580: 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Cnt++;.      }. 
c590: 20 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b       free(zSql);
c5a0: 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 30 3b  .      zSql = 0;
c5b0: 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b  .      nSql = 0;
c5c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c5d0: 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 69 66 28   zSql ){.    if(
c5e0: 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63   !_all_whitespac
c5f0: 65 28 7a 53 71 6c 29 20 29 20 70 72 69 6e 74 66  e(zSql) ) printf
c600: 28 22 49 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c  ("Incomplete SQL
c610: 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  : %s\n", zSql);.
c620: 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
c630: 20 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65    }.  free(zLine
c640: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72 43  );.  return errC
c650: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  nt;.}../*.** Ret
c660: 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77  urn a pathname w
c670: 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72  hich is the user
c680: 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  's home director
c690: 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72  y.  A.** 0 retur
c6a0: 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65  n indicates an e
c6b0: 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  rror of some kin
c6c0: 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  d.  Space to hol
c6d0: 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69  d the.** resulti
c6e0: 6e 67 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ng string is obt
c6f0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
c700: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
c710: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 68  g.** function sh
c720: 6f 75 6c 64 20 66 72 65 65 20 74 68 65 20 72 65  ould free the re
c730: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
c740: 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f  char *find_home_
c750: 64 69 72 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  dir(void){.  cha
c760: 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55  r *home_dir = NU
c770: 4c 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  LL;..#if !define
c780: 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65  d(_WIN32) && !de
c790: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20  fined(WIN32) && 
c7a0: 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f  !defined(__OS2__
c7b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
c7c0: 49 4e 33 32 5f 57 43 45 29 0a 20 20 73 74 72 75  IN32_WCE).  stru
c7d0: 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74  ct passwd *pwent
c7e0: 3b 0a 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20  ;.  uid_t uid = 
c7f0: 67 65 74 75 69 64 28 29 3b 0a 20 20 69 66 28 20  getuid();.  if( 
c800: 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28  (pwent=getpwuid(
c810: 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  uid)) != NULL) {
c820: 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
c830: 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20  pwent->pw_dir;. 
c840: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
c850: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
c860: 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20  E).  /* Windows 
c870: 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
c880: 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
c890: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65  s not provide ge
c8a0: 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68  tenv().   */.  h
c8b0: 6f 6d 65 5f 64 69 72 20 3d 20 73 74 72 64 75 70  ome_dir = strdup
c8c0: 28 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a 23 69  ("/");.#else..#i
c8d0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
c8e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
c8f0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
c900: 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21 68  _OS2__).  if (!h
c910: 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
c920: 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
c930: 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
c940: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
c950: 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
c960: 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
c970: 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20  etenv("HOME");. 
c980: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
c990: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
c9a0: 65 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  ed(WIN32) || def
c9b0: 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20  ined(__OS2__).  
c9c0: 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b  if (!home_dir) {
c9d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76  .    char *zDriv
c9e0: 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69  e, *zPath;.    i
c9f0: 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65  nt n;.    zDrive
ca00: 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44   = getenv("HOMED
ca10: 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74  RIVE");.    zPat
ca20: 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  h = getenv("HOME
ca30: 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
ca40: 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20  zDrive && zPath 
ca50: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  ){.      n = str
ca60: 6c 65 6e 28 7a 44 72 69 76 65 29 20 2b 20 73 74  len(zDrive) + st
ca70: 72 6c 65 6e 28 7a 50 61 74 68 29 20 2b 20 31 3b  rlen(zPath) + 1;
ca80: 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  .      home_dir 
ca90: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  = malloc( n );. 
caa0: 20 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69       if( home_di
cab0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
cac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
cad0: 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f  nprintf(n, home_
cae0: 64 69 72 2c 20 22 25 73 25 73 22 2c 20 7a 44 72  dir, "%s%s", zDr
caf0: 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  ive, zPath);.   
cb00: 20 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64     return home_d
cb10: 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f  ir;.    }.    ho
cb20: 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b  me_dir = "c:\\";
cb30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  .  }.#endif..#en
cb40: 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57  dif /* !_WIN32_W
cb50: 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d  CE */..  if( hom
cb60: 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 69 6e 74  e_dir ){.    int
cb70: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 68 6f 6d 65   n = strlen(home
cb80: 5f 64 69 72 29 20 2b 20 31 3b 0a 20 20 20 20 63  _dir) + 1;.    c
cb90: 68 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28  har *z = malloc(
cba0: 20 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20   n );.    if( z 
cbb0: 29 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f 6d 65  ) memcpy(z, home
cbc0: 5f 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20 68 6f  _dir, n);.    ho
cbd0: 6d 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a  me_dir = z;.  }.
cbe0: 0a 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64  .  return home_d
cbf0: 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ir;.}../*.** Rea
cc00: 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  d input from the
cc10: 20 66 69 6c 65 20 67 69 76 65 6e 20 62 79 20 73   file given by s
cc20: 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65  qliterc_override
cc30: 2e 20 20 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a  .  Or if that.**
cc40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55   parameter is NU
cc50: 4c 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74 20 66  LL, take input f
cc60: 72 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a  rom ~/.sqliterc.
cc70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
cc80: 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28  rocess_sqliterc(
cc90: 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
cca0: 63 6b 5f 64 61 74 61 20 2a 70 2c 20 20 20 20 20  ck_data *p,     
ccb0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
ccc0: 69 6f 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f  ion data */.  co
ccd0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
cce0: 72 63 5f 6f 76 65 72 72 69 64 65 20 20 20 2f 2a  rc_override   /*
ccf0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 66 69 67 20   Name of config 
cd00: 66 69 6c 65 2e 20 4e 55 4c 4c 20 74 6f 20 75 73  file. NULL to us
cd10: 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 29 7b 0a  e default */.){.
cd20: 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72    char *home_dir
cd30: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 6e 73 74   = NULL;.  const
cd40: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72 63 20   char *sqliterc 
cd50: 3d 20 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72  = sqliterc_overr
cd60: 69 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75  ide;.  char *zBu
cd70: 66 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 69  f = 0;.  FILE *i
cd80: 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  n = NULL;.  int 
cd90: 6e 42 75 66 3b 0a 0a 20 20 69 66 20 28 73 71 6c  nBuf;..  if (sql
cda0: 69 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29 20 7b  iterc == NULL) {
cdb0: 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
cdc0: 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b  find_home_dir();
cdd0: 0a 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69  .    if( home_di
cde0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  r==0 ){.      fp
cdf0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
ce00: 3a 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20  : cannot locate 
ce10: 79 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63 74  your home direct
ce20: 6f 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b  ory!\n", Argv0);
ce30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ce40: 20 20 20 7d 0a 20 20 20 20 6e 42 75 66 20 3d 20     }.    nBuf = 
ce50: 73 74 72 6c 65 6e 28 68 6f 6d 65 5f 64 69 72 29  strlen(home_dir)
ce60: 20 2b 20 31 36 3b 0a 20 20 20 20 7a 42 75 66 20   + 16;.    zBuf 
ce70: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 75 66 20 29  = malloc( nBuf )
ce80: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
ce90: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
cea0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6f  tf(stderr,"%s: o
ceb0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22  ut of memory!\n"
cec0: 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20  , Argv0);.      
ced0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
cee0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
cef0: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 22  ntf(nBuf, zBuf,"
cf00: 25 73 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f  %s/.sqliterc",ho
cf10: 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 66 72 65  me_dir);.    fre
cf20: 65 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20  e(home_dir);.   
cf30: 20 73 71 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e   sqliterc = (con
cf40: 73 74 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20  st char*)zBuf;. 
cf50: 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
cf60: 73 71 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a  sqliterc,"rb");.
cf70: 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
cf80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
cf90: 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20  eractive ){.    
cfa0: 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 4c 6f 61    printf("-- Loa
cfb0: 64 69 6e 67 20 72 65 73 6f 75 72 63 65 73 20 66  ding resources f
cfc0: 72 6f 6d 20 25 73 5c 6e 22 2c 73 71 6c 69 74 65  rom %s\n",sqlite
cfd0: 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rc);.    }.    p
cfe0: 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69  rocess_input(p,i
cff0: 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
d000: 6e 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  n);.  }.  free(z
d010: 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  Buf);.  return;.
d020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76  }../*.** Show av
d030: 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20  ailable command 
d040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a  line options.*/.
d050: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d060: 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a  r zOptions[] = .
d070: 20 20 22 20 20 20 2d 69 6e 69 74 20 66 69 6c 65    "   -init file
d080: 6e 61 6d 65 20 20 20 20 20 20 20 72 65 61 64 2f  name       read/
d090: 70 72 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69  process named fi
d0a0: 6c 65 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63 68  le\n".  "   -ech
d0b0: 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
d0c0: 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20   print commands 
d0d0: 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f 6e  before execution
d0e0: 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68  \n".  "   -[no]h
d0f0: 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20 74  eader          t
d100: 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f  urn headers on o
d110: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 20 20 20 2d  r off\n".  "   -
d120: 62 61 69 6c 20 20 20 20 20 20 20 20 20 20 20 20  bail            
d130: 20 20 20 20 73 74 6f 70 20 61 66 74 65 72 20 68      stop after h
d140: 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c  itting an error\
d150: 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72 61  n".  "   -intera
d160: 63 74 69 76 65 20 20 20 20 20 20 20 20 20 66 6f  ctive         fo
d170: 72 63 65 20 69 6e 74 65 72 61 63 74 69 76 65 20  rce interactive 
d180: 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61  I/O\n".  "   -ba
d190: 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
d1a0: 20 20 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f    force batch I/
d1b0: 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75  O\n".  "   -colu
d1c0: 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mn              
d1d0: 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
d1e0: 74 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20  to 'column'\n". 
d1f0: 20 22 20 20 20 2d 63 73 76 20 20 20 20 20 20 20   "   -csv       
d200: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75            set ou
d210: 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 73  tput mode to 'cs
d220: 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d  v'\n".  "   -htm
d230: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
d240: 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   set output mode
d250: 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20   to HTML\n".  " 
d260: 20 20 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20    -line         
d270: 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
d280: 74 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27  t mode to 'line'
d290: 5c 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20  \n".  "   -list 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
d2b0: 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74  et output mode t
d2c0: 6f 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20  o 'list'\n".  " 
d2d0: 20 20 2d 73 65 70 61 72 61 74 6f 72 20 27 78 27    -separator 'x'
d2e0: 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
d2f0: 74 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f  t field separato
d300: 72 20 28 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d  r (|)\n".  "   -
d310: 6e 75 6c 6c 76 61 6c 75 65 20 27 74 65 78 74 27  nullvalue 'text'
d320: 20 20 20 20 73 65 74 20 74 65 78 74 20 73 74 72      set text str
d330: 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c  ing for NULL val
d340: 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 2d 76 65  ues\n".  "   -ve
d350: 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  rsion           
d360: 20 20 73 68 6f 77 20 53 51 4c 69 74 65 20 76 65    show SQLite ve
d370: 72 73 69 6f 6e 5c 6e 22 0a 3b 0a 73 74 61 74 69  rsion\n".;.stati
d380: 63 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e 74  c void usage(int
d390: 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20   showDetail){.  
d3a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
d3b0: 20 20 20 20 20 20 22 55 73 61 67 65 3a 20 25 73        "Usage: %s
d3c0: 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45 4e   [OPTIONS] FILEN
d3d0: 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a 20  AME [SQL]\n"  . 
d3e0: 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20 69       "FILENAME i
d3f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
d400: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
d410: 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73 65  . A new database
d420: 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a 20   is created\n". 
d430: 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69 6c       "if the fil
d440: 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69  e does not previ
d450: 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22 2c  ously exist.\n",
d460: 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20 73   Argv0);.  if( s
d470: 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20 20  howDetail ){.   
d480: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d490: 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63 6c 75 64   "OPTIONS includ
d4a0: 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f 6e  e:\n%s", zOption
d4b0: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
d4c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d4d0: 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70 20   "Use the -help 
d4e0: 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  option for addit
d4f0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
d500: 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78 69  n\n");.  }.  exi
d510: 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(1);.}../*.** I
d520: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
d530: 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
d540: 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69  in data.*/.stati
d550: 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74  c void main_init
d560: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
d570: 5f 64 61 74 61 20 2a 64 61 74 61 29 20 7b 0a 20  _data *data) {. 
d580: 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c   memset(data, 0,
d590: 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b   sizeof(*data));
d5a0: 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20  .  data->mode = 
d5b0: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 6d 65 6d  MODE_List;.  mem
d5c0: 63 70 79 28 64 61 74 61 2d 3e 73 65 70 61 72 61  cpy(data->separa
d5d0: 74 6f 72 2c 22 7c 22 2c 20 32 29 3b 0a 20 20 64  tor,"|", 2);.  d
d5e0: 61 74 61 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ata->showHeader 
d5f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
d600: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 6d  nprintf(sizeof(m
d610: 61 69 6e 50 72 6f 6d 70 74 29 2c 20 6d 61 69 6e  ainPrompt), main
d620: 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20  Prompt,"sqlite> 
d630: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ");.  sqlite3_sn
d640: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 63 6f  printf(sizeof(co
d650: 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2c 20 63  ntinuePrompt), c
d660: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20  ontinuePrompt," 
d670: 20 20 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e    ...> ");.}..in
d680: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
d690: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
d6a0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
d6b0: 20 30 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c   0;.  struct cal
d6c0: 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b  lback_data data;
d6d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d6e0: 49 6e 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  InitFile = 0;.  
d6f0: 63 68 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20  char *zFirstCmd 
d700: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
d710: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 41  int rc = 0;..  A
d720: 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  rgv0 = argv[0];.
d730: 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74    main_init(&dat
d740: 61 29 3b 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69  a);.  stdin_is_i
d750: 6e 74 65 72 61 63 74 69 76 65 20 3d 20 69 73 61  nteractive = isa
d760: 74 74 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tty(0);..  /* Ma
d770: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
d780: 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68  a valid signal h
d790: 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65  andler early, be
d7a0: 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20  fore anything.  
d7b0: 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e  ** else is done.
d7c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47  .  */.#ifdef SIG
d7d0: 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47  INT.  signal(SIG
d7e0: 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68  INT, interrupt_h
d7f0: 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a  andler);.#endif.
d800: 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74  .  /* Do an init
d810: 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68  ial pass through
d820: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   the command-lin
d830: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f  e argument to lo
d840: 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61  cate.  ** the na
d850: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
d860: 73 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d  se file, the nam
d870: 65 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  e of the initial
d880: 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20  ization file,.  
d890: 2a 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ** and the first
d8a0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63   command to exec
d8b0: 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ute..  */.  for(
d8c0: 69 3d 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20 69  i=1; i<argc-1; i
d8d0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
d8e0: 3b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69  ;.    if( argv[i
d8f0: 5d 5b 30 5d 21 3d 27 2d 27 20 29 20 62 72 65 61  ][0]!='-' ) brea
d900: 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b  k;.    z = argv[
d910: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  i];.    if( z[0]
d920: 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
d930: 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  -' ) z++;.    if
d940: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
d950: 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d  ,"-separator")==
d960: 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 72 67 76  0 || strcmp(argv
d970: 5b 69 5d 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22  [i],"-nullvalue"
d980: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
d990: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
d9a0: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
d9b0: 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20  "-init")==0 ){. 
d9c0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
d9d0: 7a 49 6e 69 74 46 69 6c 65 20 3d 20 61 72 67 76  zInitFile = argv
d9e0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  [i];.    }.  }. 
d9f0: 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 23   if( i<argc ){.#
da00: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
da10: 45 5f 4f 53 5f 4f 53 32 29 20 26 26 20 53 51 4c  E_OS_OS2) && SQL
da20: 49 54 45 5f 4f 53 5f 4f 53 32 0a 20 20 20 20 64  ITE_OS_OS2.    d
da30: 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20  ata.zDbFilename 
da40: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
da50: 63 6f 6e 76 65 72 74 43 70 50 61 74 68 54 6f 55  convertCpPathToU
da60: 74 66 38 28 20 61 72 67 76 5b 69 2b 2b 5d 20 29  tf8( argv[i++] )
da70: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 61 74 61  ;.#else.    data
da80: 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 61  .zDbFilename = a
da90: 72 67 76 5b 69 2b 2b 5d 3b 0a 23 65 6e 64 69 66  rgv[i++];.#endif
daa0: 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
dab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
dac0: 4d 4f 52 59 44 42 0a 20 20 20 20 64 61 74 61 2e  MORYDB.    data.
dad0: 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a  zDbFilename = ":
dae0: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6c 73 65 0a  memory:";.#else.
daf0: 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65      data.zDbFile
db00: 6e 61 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  name = 0;.#endif
db10: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 61 72 67  .  }.  if( i<arg
db20: 63 20 29 7b 0a 20 20 20 20 7a 46 69 72 73 74 43  c ){.    zFirstC
db30: 6d 64 20 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a  md = argv[i++];.
db40: 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20 3d    }.  data.out =
db50: 20 73 74 64 6f 75 74 3b 0a 0a 23 69 66 64 65 66   stdout;..#ifdef
db60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
db70: 4f 52 59 44 42 0a 20 20 69 66 28 20 64 61 74 61  ORYDB.  if( data
db80: 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  .zDbFilename==0 
db90: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
dba0: 74 64 65 72 72 2c 22 25 73 3a 20 6e 6f 20 64 61  tderr,"%s: no da
dbb0: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
dbc0: 73 70 65 63 69 66 69 65 64 5c 6e 22 2c 20 61 72  specified\n", ar
dbd0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74  gv[0]);.    exit
dbe0: 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
dbf0: 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64 20 61  .  /* Go ahead a
dc00: 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  nd open the data
dc10: 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
dc20: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
dc30: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c   If the.  ** fil
dc40: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
dc50: 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e 67 20  , delay opening 
dc60: 69 74 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e  it.  This preven
dc70: 74 73 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ts empty databas
dc80: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66 72 6f  e.  ** files fro
dc90: 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  m being created 
dca0: 69 66 20 61 20 75 73 65 72 20 6d 69 73 74 79 70  if a user mistyp
dcb0: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
dcc0: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a 20 20  name argument.  
dcd0: 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ** to the sqlite
dce0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f   command-line to
dcf0: 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  ol..  */.  if( a
dd00: 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62 46 69  ccess(data.zDbFi
dd10: 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b  lename, 0)==0 ){
dd20: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61  .    open_db(&da
dd30: 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ta);.  }..  /* P
dd40: 72 6f 63 65 73 73 20 74 68 65 20 69 6e 69 74 69  rocess the initi
dd50: 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69  alization file i
dd60: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
dd70: 20 49 66 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74   If no -init opt
dd80: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 67 69 76 65  ion.  ** is give
dd90: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  n on the command
dda0: 20 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20   line, look for 
ddb0: 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e  a file named ~/.
ddc0: 73 71 6c 69 74 65 72 63 20 61 6e 64 0a 20 20 2a  sqliterc and.  *
ddd0: 2a 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73  * try to process
dde0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 70 72 6f 63   it..  */.  proc
ddf0: 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61  ess_sqliterc(&da
de00: 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 0a  ta,zInitFile);..
de10: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f    /* Make a seco
de20: 6e 64 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  nd pass through 
de30: 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
de40: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65   argument and se
de50: 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20  t.  ** options. 
de60: 20 54 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73   This second pas
de70: 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
de80: 69 6c 20 61 66 74 65 72 20 74 68 65 20 69 6e 69  il after the ini
de90: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
dea0: 20 66 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73   file is process
deb0: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ed so that the c
dec0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
ded0: 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72  ments will overr
dee0: 69 64 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67  ide.  ** setting
def0: 73 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  s in the initial
df00: 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20  ization file..  
df10: 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
df20: 61 72 67 63 20 26 26 20 61 72 67 76 5b 69 5d 5b  argc && argv[i][
df30: 30 5d 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20  0]=='-'; i++){. 
df40: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67     char *z = arg
df50: 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
df60: 31 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20  1]=='-' ){ z++; 
df70: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
df80: 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
df90: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
dfa0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
dfb0: 70 28 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20  p(z,"-html")==0 
dfc0: 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  ){.      data.mo
dfd0: 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a  de = MODE_Html;.
dfe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
dff0: 72 63 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d  rcmp(z,"-list")=
e000: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
e010: 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
e020: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
e030: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65   strcmp(z,"-line
e040: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
e050: 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
e060: 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Line;.    }else 
e070: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63  if( strcmp(z,"-c
e080: 6f 6c 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olumn")==0 ){.  
e090: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
e0a0: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  MODE_Column;.   
e0b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
e0c0: 70 28 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29  p(z,"-csv")==0 )
e0d0: 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
e0e0: 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20  e = MODE_Csv;.  
e0f0: 20 20 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e      memcpy(data.
e100: 73 65 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29  separator,",",2)
e110: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e120: 73 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72  strcmp(z,"-separ
e130: 61 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ator")==0 ){.   
e140: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 73 71     i++;.      sq
e150: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
e160: 69 7a 65 6f 66 28 64 61 74 61 2e 73 65 70 61 72  izeof(data.separ
e170: 61 74 6f 72 29 2c 20 64 61 74 61 2e 73 65 70 61  ator), data.sepa
e180: 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  rator,.         
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
e1a0: 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66  .*s",(int)sizeof
e1b0: 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72 29  (data.separator)
e1c0: 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  -1,argv[i]);.   
e1d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
e1e0: 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22  p(z,"-nullvalue"
e1f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
e200: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
e210: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
e220: 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 29  (data.nullvalue)
e230: 2c 20 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65  , data.nullvalue
e240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e250: 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
e260: 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74 61  (int)sizeof(data
e270: 2e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 61 72  .nullvalue)-1,ar
e280: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  gv[i]);.    }els
e290: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
e2a0: 2d 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a  -header")==0 ){.
e2b0: 20 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48        data.showH
e2c0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  eader = 1;.    }
e2d0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e2e0: 7a 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d  z,"-noheader")==
e2f0: 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
e300: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
e310: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
e320: 72 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d  rcmp(z,"-echo")=
e330: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
e340: 2e 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20  .echoOn = 1;.   
e350: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
e360: 70 28 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d 30 20  p(z,"-bail")==0 
e370: 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
e380: 5f 65 72 72 6f 72 20 3d 20 31 3b 0a 20 20 20 20  _error = 1;.    
e390: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e3a0: 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  (z,"-version")==
e3b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  0 ){.      print
e3c0: 66 28 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  f("%s\n", sqlite
e3d0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 29 3b  3_libversion());
e3e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
e3f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
e400: 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 74 65 72 61  trcmp(z,"-intera
e410: 63 74 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ctive")==0 ){.  
e420: 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74      stdin_is_int
e430: 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 20 20  eractive = 1;.  
e440: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
e450: 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d  mp(z,"-batch")==
e460: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e  0 ){.      stdin
e470: 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
e480: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
e490: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65  f( strcmp(z,"-he
e4a0: 6c 70 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  lp")==0 || strcm
e4b0: 70 28 7a 2c 20 22 2d 2d 68 65 6c 70 22 29 3d 3d  p(z, "--help")==
e4c0: 30 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65  0 ){.      usage
e4d0: 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (1);.    }else{.
e4e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
e4f0: 64 65 72 72 2c 22 25 73 3a 20 75 6e 6b 6e 6f 77  derr,"%s: unknow
e500: 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
e510: 20 41 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20   Argv0, z);.    
e520: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
e530: 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20  ,"Use -help for 
e540: 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e  a list of option
e550: 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  s.\n");.      re
e560: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
e570: 7d 0a 0a 20 20 69 66 28 20 7a 46 69 72 73 74 43  }..  if( zFirstC
e580: 6d 64 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e  md ){.    /* Run
e590: 20 6a 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e   just the comman
e5a0: 64 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  d that follows t
e5b0: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
e5c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e5d0: 7a 46 69 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e  zFirstCmd[0]=='.
e5e0: 27 20 29 7b 0a 20 20 20 20 20 20 64 6f 5f 6d 65  ' ){.      do_me
e5f0: 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 46 69 72 73  ta_command(zFirs
e600: 74 43 6d 64 2c 20 26 64 61 74 61 29 3b 0a 20 20  tCmd, &data);.  
e610: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
e620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
e630: 74 20 72 63 3b 0a 20 20 20 20 20 20 6f 70 65 6e  t rc;.      open
e640: 5f 64 62 28 26 64 61 74 61 29 3b 0a 20 20 20 20  _db(&data);.    
e650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
e660: 78 65 63 28 64 61 74 61 2e 64 62 2c 20 7a 46 69  xec(data.db, zFi
e670: 72 73 74 43 6d 64 2c 20 63 61 6c 6c 62 61 63 6b  rstCmd, callback
e680: 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
e690: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
e6a0: 21 3d 30 20 26 26 20 7a 45 72 72 4d 73 67 21 3d  !=0 && zErrMsg!=
e6b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
e6c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 53 51 4c  intf(stderr,"SQL
e6d0: 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a   error: %s\n", z
e6e0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
e6f0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
e700: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
e710: 0a 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d  .    /* Run comm
e720: 61 6e 64 73 20 72 65 63 65 69 76 65 64 20 66 72  ands received fr
e730: 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  om standard inpu
e740: 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  t.    */.    if(
e750: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
e760: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 63  ctive ){.      c
e770: 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20  har *zHome;.    
e780: 20 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79    char *zHistory
e790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
e7a0: 6e 48 69 73 74 6f 72 79 3b 0a 20 20 20 20 20 20  nHistory;.      
e7b0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
e7c0: 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20  "SQLite version 
e7d0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 45  %s\n".        "E
e7e0: 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66  nter \".help\" f
e7f0: 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c  or instructions\
e800: 6e 22 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65  n".        "Ente
e810: 72 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  r SQL statements
e820: 20 74 65 72 6d 69 6e 61 74 65 64 20 77 69 74 68   terminated with
e830: 20 61 20 5c 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20   a \";\"\n",.   
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62       sqlite3_lib
e850: 76 65 72 73 69 6f 6e 28 29 0a 20 20 20 20 20 20  version().      
e860: 29 3b 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d  );.      zHome =
e870: 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29   find_home_dir()
e880: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d  ;.      if( zHom
e890: 65 20 26 26 20 28 7a 48 69 73 74 6f 72 79 20 3d  e && (zHistory =
e8a0: 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74 6f 72 79   malloc(nHistory
e8b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 48 6f 6d 65 29   = strlen(zHome)
e8c0: 2b 32 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +20))!=0 ){.    
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e8e0: 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c 20 7a  intf(nHistory, z
e8f0: 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73 71 6c  History,"%s/.sql
e900: 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20 7a 48  ite_history", zH
e910: 6f 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ome);.      }.#i
e920: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
e930: 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45  EADLINE) && HAVE
e940: 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 20  _READLINE==1.   
e950: 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20     if( zHistory 
e960: 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 7a  ) read_history(z
e970: 48 69 73 74 6f 72 79 29 3b 0a 23 65 6e 64 69 66  History);.#endif
e980: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63  .      rc = proc
e990: 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c  ess_input(&data,
e9a0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
e9b0: 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
e9c0: 20 20 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72     stifle_histor
e9d0: 79 28 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20  y(100);.        
e9e0: 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48  write_history(zH
e9f0: 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 20  istory);.       
ea00: 20 66 72 65 65 28 7a 48 69 73 74 6f 72 79 29 3b   free(zHistory);
ea10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
ea20: 72 65 65 28 7a 48 6f 6d 65 29 3b 0a 20 20 20 20  ree(zHome);.    
ea30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ea40: 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  = process_input(
ea50: 26 64 61 74 61 2c 20 73 74 64 69 6e 29 3b 0a 20  &data, stdin);. 
ea60: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 5f 74     }.  }.  set_t
ea70: 61 62 6c 65 5f 6e 61 6d 65 28 26 64 61 74 61 2c  able_name(&data,
ea80: 20 30 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b   0);.  if( db ){
ea90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
eaa0: 5f 63 6c 6f 73 65 28 64 62 29 21 3d 53 51 4c 49  _close(db)!=SQLI
eab0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
eac0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 65  printf(stderr,"e
ead0: 72 72 6f 72 20 63 6c 6f 73 69 6e 67 20 64 61 74  rror closing dat
eae0: 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 20 73 71  abase: %s\n", sq
eaf0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
eb00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
eb10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.