/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fd4ccdb37c3b68de0623eb938a649e0990710714:


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 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
01f0: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0200: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 2f 2a 20  fined(WIN32)./* 
0210: 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 63 6f  This needs to co
0220: 6d 65 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  me before any in
0230: 63 6c 75 64 65 73 20 66 6f 72 20 4d 53 56 43 20  cludes for MSVC 
0240: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 23 64 65 66  compiler */.#def
0250: 69 6e 65 20 5f 43 52 54 5f 53 45 43 55 52 45 5f  ine _CRT_SECURE_
0260: 4e 4f 5f 57 41 52 4e 49 4e 47 53 0a 23 65 6e 64  NO_WARNINGS.#end
0270: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
0280: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0290: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
02a0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
02b0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
02c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
02d0: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
02e0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
02f0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a  ude <stdarg.h>..
0300: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
0310: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
0320: 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  (WIN32) && !defi
0330: 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 23 20 69  ned(__OS2__).# i
0340: 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68  nclude <signal.h
0350: 3e 0a 23 20 69 66 20 21 64 65 66 69 6e 65 64 28  >.# if !defined(
0360: 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
0370: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
0380: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77  ).#  include <pw
0390: 64 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69  d.h>.# endif.# i
03a0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
03b0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
03c0: 2f 74 79 70 65 73 2e 68 3e 0a 23 65 6e 64 69 66  /types.h>.#endif
03d0: 0a 0a 23 69 66 64 65 66 20 5f 5f 4f 53 32 5f 5f  ..#ifdef __OS2__
03e0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  .# include <unis
03f0: 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  td.h>.#endif..#i
0400: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
0410: 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45  EADLINE) && HAVE
0420: 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 23 20 69  _READLINE==1.# i
0430: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
0440: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
0450: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
0460: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6c 73  /history.h>.#els
0470: 65 0a 23 20 64 65 66 69 6e 65 20 72 65 61 64 6c  e.# define readl
0480: 69 6e 65 28 70 29 20 6c 6f 63 61 6c 5f 67 65 74  ine(p) local_get
0490: 6c 69 6e 65 28 70 2c 73 74 64 69 6e 29 0a 23 20  line(p,stdin).# 
04a0: 64 65 66 69 6e 65 20 61 64 64 5f 68 69 73 74 6f  define add_histo
04b0: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 72  ry(X).# define r
04c0: 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ead_history(X).#
04d0: 20 64 65 66 69 6e 65 20 77 72 69 74 65 5f 68 69   define write_hi
04e0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
04f0: 65 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  e stifle_history
0500: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  (X).#endif..#if 
0510: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
0520: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
0530: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e  ).# include <io.
0540: 68 3e 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74  h>.#define isatt
0550: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0560: 23 64 65 66 69 6e 65 20 61 63 63 65 73 73 28 66  #define access(f
0570: 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66 29 2c  ,m) _access((f),
0580: 28 6d 29 29 0a 23 65 6c 73 65 0a 2f 2a 20 4d 61  (m)).#else./* Ma
0590: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
05a0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
05b0: 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20  ..*/.extern int 
05c0: 69 73 61 74 74 79 28 29 3b 0a 23 65 6e 64 69 66  isatty();.#endif
05d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
05e0: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69 6e  IN32_WCE)./* Win
05f0: 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69 6e  dows CE (arm-win
0600: 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63 63  ce-mingw32ce-gcc
0610: 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69  ) does not provi
0620: 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20 74  de isatty(). * t
0630: 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61 73  hus we always as
0640: 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61 76  sume that we hav
0650: 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68 61  e a console. Tha
0660: 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65 72  t can be. * over
0670: 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65 20  ridden with the 
0680: 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20 6c  -batch command l
0690: 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f 0a  ine option.. */.
06a0: 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28 78  #define isatty(x
06b0: 29 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ) 1.#endif..#if 
06c0: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
06d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e   && !defined(WIN
06e0: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
06f0: 5f 5f 4f 53 32 5f 5f 29 20 26 26 20 21 64 65 66  __OS2__) && !def
0700: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0710: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0720: 45 52 4e 45 4c 29 0a 23 69 6e 63 6c 75 64 65 20  ERNEL).#include 
0730: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
0740: 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75  clude <sys/resou
0750: 72 63 65 2e 68 3e 0a 0a 2f 2a 20 53 61 76 65 64  rce.h>../* Saved
0760: 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d   resource inform
0770: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65  ation for the be
0780: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70  ginning of an op
0790: 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  eration */.stati
07a0: 63 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20  c struct rusage 
07b0: 73 42 65 67 69 6e 3b 0a 0a 2f 2a 20 54 72 75 65  sBegin;../* True
07c0: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
07d0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
07e0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
07f0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 42  er = 0;../*.** B
0800: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
0810: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
0820: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
0830: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
0840: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
0850: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
0860: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
0870: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65  n);.  }.}../* Re
0880: 74 75 72 6e 20 74 68 65 20 64 69 66 66 65 72 65  turn the differe
0890: 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f  nce of two time_
08a0: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
08b0: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
08c0: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73 74 72  ble timeDiff(str
08d0: 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 53 74  uct timeval *pSt
08e0: 61 72 74 2c 20 73 74 72 75 63 74 20 74 69 6d 65  art, struct time
08f0: 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65  val *pEnd){.  re
0900: 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75  turn (pEnd->tv_u
0910: 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76  sec - pStart->tv
0920: 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30 31 20  _usec)*0.000001 
0930: 2b 20 0a 20 20 20 20 20 20 20 20 20 28 64 6f 75  + .         (dou
0940: 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65  ble)(pEnd->tv_se
0950: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 73  c - pStart->tv_s
0960: 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ec);.}../*.** Pr
0970: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
0980: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
0990: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
09a0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
09b0: 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20 20  bleTimer ){.    
09c0: 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45  struct rusage sE
09d0: 6e 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67  nd;.    getrusag
09e0: 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26  e(RUSAGE_SELF, &
09f0: 73 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74  sEnd);.    print
0a00: 66 28 22 43 50 55 20 54 69 6d 65 3a 20 75 73 65  f("CPU Time: use
0a10: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
0a20: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
0a30: 26 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65  &sBegin.ru_utime
0a40: 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65  , &sEnd.ru_utime
0a50: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
0a60: 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74  ff(&sBegin.ru_st
0a70: 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74  ime, &sEnd.ru_st
0a80: 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  ime));.  }.}..#d
0a90: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
0aa0: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
0ab0: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
0ac0: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
0ad0: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a  ine HAS_TIMER 1.
0ae0: 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28  .#elif (defined(
0af0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
0b00: 65 64 28 57 49 4e 33 32 29 29 0a 0a 23 69 6e 63  ed(WIN32))..#inc
0b10: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
0b20: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
0b30: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
0b40: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
0b50: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
0b60: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
0b70: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
0b80: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
0b90: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
0ba0: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
0bb0: 65 72 42 65 67 69 6e 3b 0a 74 79 70 65 64 65 66  erBegin;.typedef
0bc0: 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20 2a 47   BOOL (WINAPI *G
0bd0: 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48 41 4e  ETPROCTIMES)(HAN
0be0: 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c  DLE, LPFILETIME,
0bf0: 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46   LPFILETIME, LPF
0c00: 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54  ILETIME, LPFILET
0c10: 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54  IME);.static GET
0c20: 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f  PROCTIMES getPro
0c30: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
0c40: 4e 55 4c 4c 3b 0a 0a 2f 2a 20 54 72 75 65 20 69  NULL;../* True i
0c50: 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20 65  f the timer is e
0c60: 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63  nabled */.static
0c70: 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65 72   int enableTimer
0c80: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   = 0;../*.** Che
0c90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
0ca0: 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f  have timer suppo
0cb0: 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  rt.  Return 1 if
0cc0: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75   necessary.** su
0cd0: 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20  pport found (or 
0ce0: 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79  found previously
0cf0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
0d00: 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b   hasTimer(void){
0d10: 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73  .  if( getProces
0d20: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
0d30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20    return 1;.  } 
0d40: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65  else {.    /* Ge
0d50: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20  tProcessTimes() 
0d60: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
0d70: 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d  in WIN95 and som
0d80: 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20  e other Windows 
0d90: 76 65 72 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  versions..    **
0da0: 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73   See if the vers
0db0: 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69  ion we are runni
0dc0: 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e  ng on has it, an
0dd0: 64 20 69 66 20 69 74 20 64 6f 65 73 2c 20 73 61  d if it does, sa
0de0: 76 65 20 6f 66 66 0a 20 20 20 20 2a 2a 20 61 20  ve off.    ** a 
0df0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e  pointer to it an
0e00: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  d the current pr
0e10: 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20  ocess handle..  
0e20: 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73    */.    hProces
0e30: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
0e40: 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28  ocess();.    if(
0e50: 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20   hProcess ){.   
0e60: 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e     HINSTANCE hin
0e70: 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72  stLib = LoadLibr
0e80: 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c  ary(TEXT("Kernel
0e90: 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20  32.dll"));.     
0ea0: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e   if( NULL != hin
0eb0: 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20  stLib ){.       
0ec0: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0ed0: 41 64 64 72 20 3d 20 28 47 45 54 50 52 4f 43 54  Addr = (GETPROCT
0ee0: 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41 64 64  IMES) GetProcAdd
0ef0: 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c 20 22  ress(hinstLib, "
0f00: 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 22  GetProcessTimes"
0f10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e  );.        if( N
0f20: 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63 65 73  ULL != getProces
0f30: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
0f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
0f50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0f60: 20 20 20 20 46 72 65 65 4c 69 62 72 61 72 79 28      FreeLibrary(
0f70: 68 69 6e 73 74 4c 69 62 29 3b 20 0a 20 20 20 20  hinstLib); .    
0f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
0f90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0fa0: 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20  ** Begin timing 
0fb0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a  an operation.*/.
0fc0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69  static void begi
0fd0: 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20  nTimer(void){.  
0fe0: 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  if( enableTimer 
0ff0: 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  && getProcessTim
1000: 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46 49  esAddr ){.    FI
1010: 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f  LETIME ftCreatio
1020: 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20 67  n, ftExit;.    g
1030: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
1040: 64 72 28 68 50 72 6f 63 65 73 73 2c 20 26 66 74  dr(hProcess, &ft
1050: 43 72 65 61 74 69 6f 6e 2c 20 26 66 74 45 78 69  Creation, &ftExi
1060: 74 2c 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69  t, &ftKernelBegi
1070: 6e 2c 20 26 66 74 55 73 65 72 42 65 67 69 6e 29  n, &ftUserBegin)
1080: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ;.  }.}../* Retu
1090: 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  rn the differenc
10a0: 65 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d  e of two FILETIM
10b0: 45 20 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  E structs in sec
10c0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
10d0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46  ouble timeDiff(F
10e0: 49 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c  ILETIME *pStart,
10f0: 20 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29   FILETIME *pEnd)
1100: 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  {.  sqlite_int64
1110: 20 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73   i64Start = *((s
1120: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70  qlite_int64 *) p
1130: 53 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  Start);.  sqlite
1140: 5f 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20  _int64 i64End = 
1150: 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  *((sqlite_int64 
1160: 2a 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75  *) pEnd);.  retu
1170: 72 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36  rn (double) ((i6
1180: 34 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29  4End - i64Start)
1190: 20 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a   / 10000000.0);.
11a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
11b0: 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74  he timing result
11c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11d0: 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29  d endTimer(void)
11e0: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
11f0: 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73  mer && getProces
1200: 73 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20  sTimesAddr){.   
1210: 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61   FILETIME ftCrea
1220: 74 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74  tion, ftExit, ft
1230: 4b 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65  KernelEnd, ftUse
1240: 72 45 6e 64 3b 0a 20 20 20 20 67 65 74 50 72 6f  rEnd;.    getPro
1250: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
1260: 72 6f 63 65 73 73 2c 20 26 66 74 43 72 65 61 74  rocess, &ftCreat
1270: 69 6f 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66  ion, &ftExit, &f
1280: 74 4b 65 72 6e 65 6c 45 6e 64 2c 20 26 66 74 55  tKernelEnd, &ftU
1290: 73 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72 69  serEnd);.    pri
12a0: 6e 74 66 28 22 43 50 55 20 54 69 6d 65 3a 20 75  ntf("CPU Time: u
12b0: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
12c0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
12d0: 66 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20  f(&ftUserBegin, 
12e0: 26 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20  &ftUserEnd),.   
12f0: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74      timeDiff(&ft
1300: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74  KernelBegin, &ft
1310: 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d  KernelEnd));.  }
1320: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49  .}..#define BEGI
1330: 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d  N_TIMER beginTim
1340: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44  er().#define END
1350: 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28  _TIMER endTimer(
1360: 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  ).#define HAS_TI
1370: 4d 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a  MER hasTimer()..
1380: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45  #else.#define BE
1390: 47 49 4e 5f 54 49 4d 45 52 20 0a 23 64 65 66 69  GIN_TIMER .#defi
13a0: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65  ne END_TIMER.#de
13b0: 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30  fine HAS_TIMER 0
13c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
13d0: 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77  sed to prevent w
13e0: 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e  arnings about un
13f0: 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a  used parameters.
1400: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45  */.#define UNUSE
1410: 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28  D_PARAMETER(x) (
1420: 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20  void)(x)../*.** 
1430: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
1440: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
1450: 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  en command execu
1460: 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20 61 74  tion stops.** at
1470: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20   an error if we 
1480: 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61 63 74  are not interact
1490: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14a0: 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72  nt bail_on_error
14b0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 72   = 0;../*.** Thr
14c0: 65 61 74 20 73 74 64 69 6e 20 61 73 20 61 6e 20  eat stdin as an 
14d0: 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75  interactive inpu
14e0: 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t if the followi
14f0: 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ng variable.** i
1500: 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69  s true.  Otherwi
1510: 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64 69 6e  se, assume stdin
1520: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
1530: 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70 65 2e   a file or pipe.
1540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1550: 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
1560: 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20  ive = 1;../*.** 
1570: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
1580: 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69 74 65   the open SQLite
1590: 20 64 61 74 61 62 61 73 65 2e 20 20 57 65 20 6d   database.  We m
15a0: 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ake a pointer.**
15b0: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
15c0: 65 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  e a static varia
15d0: 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ble so that it c
15e0: 61 6e 20 62 65 20 61 63 63 65 73 73 65 64 0a 2a  an be accessed.*
15f0: 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e 54 20  * by the SIGINT 
1600: 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74 65 72  handler to inter
1610: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 70 72  rupt database pr
1620: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61  ocessing..*/.sta
1630: 74 69 63 20 73 71 6c 69 74 65 33 20 2a 64 62 20  tic sqlite3 *db 
1640: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  = 0;../*.** True
1650: 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74   if an interrupt
1660: 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73   (Control-C) has
1670: 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a   been received..
1680: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69  */.static volati
1690: 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72  le int seenInter
16a0: 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rupt = 0;../*.**
16b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d   This is the nam
16c0: 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d  e of our program
16d0: 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d  . It is set in m
16e0: 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69  ain(), used.** i
16f0: 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74  n a number of ot
1700: 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74  her places, most
1710: 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ly for error mes
1720: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
1730: 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f   char *Argv0;../
1740: 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69  *.** Prompt stri
1750: 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64  ngs. Initialized
1760: 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62   in main. Settab
1770: 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72  le with.**   .pr
1780: 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e  ompt main contin
1790: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
17a0: 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d  r mainPrompt[20]
17b0: 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c  ;     /* First l
17c0: 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ine prompt. defa
17d0: 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a  ult: "sqlite> "*
17e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
17f0: 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d  ntinuePrompt[20]
1800: 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f  ; /* Continuatio
1810: 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  n prompt. defaul
1820: 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f  t: "   ...> " */
1830: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
1840: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
1850: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
1860: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1870: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
1880: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
1890: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
18a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
18b0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
18c0: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
18d0: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
18e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
18f0: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
1900: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
1910: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
1920: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
1930: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
1940: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
1950: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
1960: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
1970: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
1980: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
1990: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19a0: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
19b0: 76 6f 69 64 20 69 6f 74 72 61 63 65 50 72 69 6e  void iotracePrin
19c0: 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
19d0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
19e0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
19f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74  ar *z;.  if( iot
1a00: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
1a10: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1a20: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d   zFormat);.  z =
1a30: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
1a40: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1a50: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1a60: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c  fprintf(iotrace,
1a70: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c   "%s", z);.  sql
1a80: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a  ite3_free(z);.}.
1a90: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
1aa0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
1ab0: 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65  tring is a numbe
1ac0: 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  r of not..*/.sta
1ad0: 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72  tic int isNumber
1ae0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1af0: 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20  int *realnum){. 
1b00: 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20   if( *z=='-' || 
1b10: 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20  *z=='+' ) z++;. 
1b20: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a   if( !isdigit(*z
1b30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1b40: 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20  0;.  }.  z++;.  
1b50: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
1b60: 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68  ealnum = 0;.  wh
1b70: 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29  ile( isdigit(*z)
1b80: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28   ){ z++; }.  if(
1b90: 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20   *z=='.' ){.    
1ba0: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73  z++;.    if( !is
1bb0: 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75  digit(*z) ) retu
1bc0: 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
1bd0: 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20   isdigit(*z) ){ 
1be0: 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72  z++; }.    if( r
1bf0: 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75  ealnum ) *realnu
1c00: 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  m = 1;.  }.  if(
1c10: 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d   *z=='e' || *z==
1c20: 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a  'E' ){.    z++;.
1c30: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20      if( *z=='+' 
1c40: 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b  || *z=='-' ) z++
1c50: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69 67  ;.    if( !isdig
1c60: 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  it(*z) ) return 
1c70: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  0;.    while( is
1c80: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
1c90: 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c  ; }.    if( real
1ca0: 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d  num ) *realnum =
1cb0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1cc0: 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   *z==0;.}../*.**
1cd0: 20 41 20 67 6c 6f 62 61 6c 20 63 68 61 72 2a 20   A global char* 
1ce0: 61 6e 64 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  and an SQL funct
1cf0: 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20 69 74  ion to access it
1d00: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
1d10: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
1d20: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1d30: 2e 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 75  . This program u
1d40: 73 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 0a  sed to use the .
1d50: 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 70  ** sqlite_exec_p
1d60: 72 69 6e 74 66 28 29 20 41 50 49 20 74 6f 20 73  rintf() API to s
1d70: 75 62 73 74 69 74 75 65 20 61 20 73 74 72 69 6e  ubstitue a strin
1d80: 67 20 69 6e 74 6f 20 61 6e 20 53 51 4c 20 73 74  g into an SQL st
1d90: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  atement..** The 
1da0: 63 6f 72 72 65 63 74 20 77 61 79 20 74 6f 20 64  correct way to d
1db0: 6f 20 74 68 69 73 20 77 69 74 68 20 73 71 6c 69  o this with sqli
1dc0: 74 65 33 20 69 73 20 74 6f 20 75 73 65 20 74 68  te3 is to use th
1dd0: 65 20 62 69 6e 64 20 41 50 49 2c 20 62 75 74 0a  e bind API, but.
1de0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73 68 65  ** since the she
1df0: 6c 6c 20 69 73 20 62 75 69 6c 74 20 61 72 6f 75  ll is built arou
1e00: 6e 64 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  nd the callback 
1e10: 70 61 72 61 64 69 67 6d 20 69 74 20 77 6f 75 6c  paradigm it woul
1e20: 64 20 62 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  d be a lot.** of
1e30: 20 77 6f 72 6b 2e 20 49 6e 73 74 65 61 64 20 6a   work. Instead j
1e40: 75 73 74 20 75 73 65 20 74 68 69 73 20 68 61 63  ust use this hac
1e50: 6b 2c 20 77 68 69 63 68 20 69 73 20 71 75 69 74  k, which is quit
1e60: 65 20 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f 0a 73  e harmless..*/.s
1e70: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1e80: 20 2a 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d   *zShellStatic =
1e90: 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20   0;.static void 
1ea0: 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e 63 28  shellstaticFunc(
1eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1ec0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1ed0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1ee0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1ef0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  ){.  assert( 0==
1f00: 61 72 67 63 20 29 3b 0a 20 20 61 73 73 65 72 74  argc );.  assert
1f10: 28 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 29  ( zShellStatic )
1f20: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1f30: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e  ETER(argc);.  UN
1f40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
1f50: 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rgv);.  sqlite3_
1f60: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1f70: 65 78 74 2c 20 7a 53 68 65 6c 6c 53 74 61 74 69  ext, zShellStati
1f80: 63 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  c, -1, SQLITE_ST
1f90: 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ATIC);.}.../*.**
1fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1fb0: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
1fc0: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
1fd0: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
1fe0: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
1ff0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
2000: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
2010: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
2020: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
2030: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
2040: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
2050: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
2060: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
2070: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
2080: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
2090: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
20a0: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
20b0: 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  one..*/.static c
20c0: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
20d0: 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  ne(char *zPrompt
20e0: 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
20f0: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e  har *zLine;.  in
2100: 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  t nLine;.  int n
2110: 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20  ;.  int eol;..  
2120: 69 66 28 20 7a 50 72 6f 6d 70 74 20 26 26 20 2a  if( zPrompt && *
2130: 7a 50 72 6f 6d 70 74 20 29 7b 0a 20 20 20 20 70  zPrompt ){.    p
2140: 72 69 6e 74 66 28 22 25 73 22 2c 7a 50 72 6f 6d  rintf("%s",zProm
2150: 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28  pt);.    fflush(
2160: 73 74 64 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  stdout);.  }.  n
2170: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
2180: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
2190: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
21a0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
21b0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
21c0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
21d0: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
21e0: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
21f0: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
2200: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
2210: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
2220: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
2230: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
2240: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2250: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
2260: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
2270: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
2280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
2290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
22a0: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
22b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22c0: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
22d0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
22e0: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
22f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
2300: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
2310: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
2320: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
2330: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
2340: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20   n--;.      if( 
2350: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
2360: 5d 3d 3d 27 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20  ]=='\r' ) n--;. 
2370: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
2380: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
2390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c  ;.    }.  }.  zL
23a0: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a  ine = realloc( z
23b0: 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72  Line, n+1 );.  r
23c0: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
23d0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
23e0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
23f0: 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a  input text..**.*
2400: 2a 20 7a 50 72 69 6f 72 20 69 73 20 61 20 73 74  * zPrior is a st
2410: 72 69 6e 67 20 6f 66 20 70 72 69 6f 72 20 74 65  ring of prior te
2420: 78 74 20 72 65 74 72 69 65 76 65 64 2e 20 20 49  xt retrieved.  I
2430: 66 20 6e 6f 74 20 74 68 65 20 65 6d 70 74 79 0a  f not the empty.
2440: 2a 2a 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20  ** string, then 
2450: 69 73 73 75 65 20 61 20 63 6f 6e 74 69 6e 75 61  issue a continua
2460: 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a 2a 2f 0a  tion prompt..*/.
2470: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65  static char *one
2480: 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 63 6f 6e 73  _input_line(cons
2490: 74 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20  t char *zPrior, 
24a0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
24b0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
24c0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
24d0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
24e0: 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f 67 65 74  return local_get
24f0: 6c 69 6e 65 28 30 2c 20 69 6e 29 3b 0a 20 20 7d  line(0, in);.  }
2500: 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 20 26 26  .  if( zPrior &&
2510: 20 7a 50 72 69 6f 72 5b 30 5d 20 29 7b 0a 20 20   zPrior[0] ){.  
2520: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 63 6f 6e 74    zPrompt = cont
2530: 69 6e 75 65 50 72 6f 6d 70 74 3b 0a 20 20 7d 65  inuePrompt;.  }e
2540: 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74  lse{.    zPrompt
2550: 20 3d 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 20   = mainPrompt;. 
2560: 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20 72   }.  zResult = r
2570: 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29  eadline(zPrompt)
2580: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ;.#if defined(HA
2590: 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20  VE_READLINE) && 
25a0: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31  HAVE_READLINE==1
25b0: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26  .  if( zResult &
25c0: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 61 64 64  & *zResult ) add
25d0: 5f 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74  _history(zResult
25e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
25f0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 73  rn zResult;.}..s
2600: 74 72 75 63 74 20 70 72 65 76 69 6f 75 73 5f 6d  truct previous_m
2610: 6f 64 65 5f 64 61 74 61 20 7b 0a 20 20 69 6e 74  ode_data {.  int
2620: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 2f   valid;        /
2630: 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69 74  * Is there legit
2640: 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20 2a   data in here? *
2650: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20  /.  int mode;.  
2660: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 0a  int showHeader;.
2670: 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31    int colWidth[1
2680: 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  00];.};../*.** A
2690: 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  n pointer to an 
26a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
26b0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61   structure is pa
26c0: 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ssed from.** the
26d0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 74 6f   main program to
26e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
26f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
2700: 63 6f 6d 6d 75 6e 69 63 61 74 65 0a 2a 2a 20 73  communicate.** s
2710: 74 61 74 65 20 61 6e 64 20 6d 6f 64 65 20 69 6e  tate and mode in
2720: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2730: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
2740: 74 61 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ta {.  sqlite3 *
2750: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
2760: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
2770: 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e 3b 20 20  .  int echoOn;  
2780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2790: 65 20 74 6f 20 65 63 68 6f 20 69 6e 70 75 74 20  e to echo input 
27a0: 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  commands */.  in
27b0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
27c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27d0: 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61  f records displa
27e0: 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  yed so far */.  
27f0: 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
2800: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2810: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2820: 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20    int mode;     
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
2840: 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69  utput mode setti
2850: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74  ng */.  int writ
2860: 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20 2f  ableSchema;    /
2870: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
2880: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
2890: 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f  =ON */.  int sho
28a0: 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20 20  wHeader;        
28b0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77 20  /* True to show 
28c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20  column names in 
28d0: 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d  List or Column m
28e0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
28f0: 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20  DestTable;      
2900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69  /* Name of desti
2910: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65  nation table whe
2920: 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f  n MODE_Insert */
2930: 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74 6f  .  char separato
2940: 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65 70  r[20];    /* Sep
2950: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
2960: 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20 2a   for MODE_List *
2970: 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68  /.  int colWidth
2980: 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65  [100];     /* Re
2990: 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f 66  quested width of
29a0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65   each column whe
29b0: 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65  n in column mode
29c0: 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57  */.  int actualW
29d0: 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41  idth[100];  /* A
29e0: 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65  ctual width of e
29f0: 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ach column */.  
2a00: 63 68 61 72 20 6e 75 6c 6c 76 61 6c 75 65 5b 32  char nullvalue[2
2a10: 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  0];    /* The te
2a20: 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e  xt to print when
2a30: 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
2a40: 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  ck from.        
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2a70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 72 65   */.  struct pre
2a80: 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61 20  vious_mode_data 
2a90: 65 78 70 6c 61 69 6e 50 72 65 76 3b 0a 20 20 20  explainPrev;.   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 73 20 74        /* Holds t
2ac0: 68 65 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  he mode informat
2ad0: 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 0a  ion just before.
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 2a 2a 20 2e 65 78 70           ** .exp
2b00: 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61  lain ON */.  cha
2b10: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
2b20: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
2b30: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
2b40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b50: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
2b60: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
2b70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2b80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b90: 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65  Stmt;   /* Curre
2ba0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  nt statement if 
2bb0: 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  any. */.  FILE *
2bc0: 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20  pLog;           
2bd0: 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75   /* Write log ou
2be0: 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a  tput here */.};.
2bf0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
2c00: 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64   the allowed mod
2c10: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  es..*/.#define M
2c20: 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20  ODE_Line     0  
2c30: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65  /* One column pe
2c40: 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c  r line.  Blank l
2c50: 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f  ine between reco
2c60: 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  rds */.#define M
2c70: 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20  ODE_Column   1  
2c80: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
2c90: 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63  r line in neat c
2ca0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e  olumns */.#defin
2cb0: 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20  e MODE_List     
2cc0: 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64  2  /* One record
2cd0: 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61   per line with a
2ce0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64   separator */.#d
2cf0: 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20  efine MODE_Semi 
2d00: 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61      3  /* Same a
2d10: 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20  s MODE_List but 
2d20: 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61  append ";" to ea
2d30: 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69  ch line */.#defi
2d40: 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20  ne MODE_Html    
2d50: 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   4  /* Generate 
2d60: 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a  an XHTML table *
2d70: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49  /.#define MODE_I
2d80: 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65  nsert   5  /* Ge
2d90: 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65  nerate SQL "inse
2da0: 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  rt" statements *
2db0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
2dc0: 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20 47 65  cl      6  /* Ge
2dd0: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
2de0: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
2df0: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
2e00: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 37 20  MODE_Csv      7 
2e10: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
2e20: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
2e30: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
2e40: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 38 20  MODE_Explain  8 
2e50: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
2e60: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
2e70: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
2e80: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
2e90: 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b  char *modeDescr[
2ea0: 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a  ] = {.  "line",.
2eb0: 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c    "column",.  "l
2ec0: 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a  ist",.  "semi",.
2ed0: 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73    "html",.  "ins
2ee0: 65 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20  ert",.  "tcl",. 
2ef0: 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61   "csv",.  "expla
2f00: 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e  in",.};../*.** N
2f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2f20: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f  s in an array.*/
2f30: 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69  .#define ArraySi
2f40: 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a  ze(X)  (int)(siz
2f50: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
2f60: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0]))../*.** Comp
2f70: 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e  ute a string len
2f80: 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69  gth that is limi
2f90: 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20  ted to what can 
2fa0: 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
2fb0: 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66  lower 30 bits of
2fc0: 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64   a 32-bit signed
2fd0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
2fe0: 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30  tic int strlen30
2ff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3000: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3010: 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20  2 = z;.  while( 
3020: 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20  *z2 ){ z2++; }. 
3030: 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66   return 0x3fffff
3040: 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20  ff & (int)(z2 - 
3050: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  z);.}../*.** A c
3060: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
3070: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e  sqlite3_log() in
3080: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
3090: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67  ic void shellLog
30a0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
30b0: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
30c0: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
30d0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
30e0: 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75 63  data *p = (struc
30f0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 2a  t callback_data*
3100: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e  )pArg;.  if( p->
3110: 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  pLog==0 ) return
3120: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 70  ;.  fprintf(p->p
3130: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
3140: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
3150: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
3160: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Log);.}../*.** O
3170: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
3180: 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d  string as a hex-
3190: 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67  encoded blob (eg
31a0: 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73  . X'1234' ).*/.s
31b0: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
31c0: 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20  t_hex_blob(FILE 
31d0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  *out, const void
31e0: 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
31f0: 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ob){.  int i;.  
3200: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63  char *zBlob = (c
3210: 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 66  har *)pBlob;.  f
3220: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
3230: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
3240: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70 72 69  Blob; i++){ fpri
3250: 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a  ntf(out,"%02x",z
3260: 42 6c 6f 62 5b 69 5d 29 3b 20 7d 0a 20 20 66 70  Blob[i]); }.  fp
3270: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
3280: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
3290: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
32a0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
32b0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
32c0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
32d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
32e0: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
32f0: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
3300: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
3310: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
3320: 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20 20   nSingle = 0;.  
3330: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
3340: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
3350: 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67 6c  ]=='\'' ) nSingl
3360: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  e++;.  }.  if( n
3370: 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Single==0 ){.   
3380: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25   fprintf(out,"'%
3390: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
33a0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
33b0: 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65  ,"'");.    while
33c0: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
33d0: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a  r(i=0; z[i] && z
33e0: 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  [i]!='\''; i++){
33f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  }.      if( i==0
3400: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
3410: 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a 20  ntf(out,"''");. 
3420: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
3430: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
3440: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
3450: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
3460: 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20 20  .*s''",i,z);.   
3470: 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20       z += i+1;. 
3480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3490: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
34a0: 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20  "%s",z);.       
34b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
34c0: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
34d0: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d 0a  f(out,"'");.  }.
34e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
34f0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
3500: 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63   as a quoted acc
3510: 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54  ording to C or T
3520: 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73  CL quoting rules
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3540: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
3550: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
3560: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e  t char *z){.  un
3570: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20  signed int c;.  
3580: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
3590: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a  .  while( (c = *
35a0: 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  (z++))!=0 ){.   
35b0: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
35c0: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
35d0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
35e0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  (c, out);.    }e
35f0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
3600: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
3610: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
3620: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
3630: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3640: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
3650: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
3660: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
3670: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
3680: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
3690: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
36a0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
36b0: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
36c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36d0: 21 69 73 70 72 69 6e 74 28 63 29 20 29 7b 0a 20  !isprint(c) ){. 
36e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
36f0: 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78  , "\\%03o", c&0x
3700: 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ff);.    }else{.
3710: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
3720: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
3730: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
3740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
3750: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
3760: 6e 67 20 77 69 74 68 20 63 68 61 72 61 63 74 65  ng with characte
3770: 72 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  rs that are spec
3780: 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65  ial to.** HTML e
3790: 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  scaped..*/.stati
37a0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74  c void output_ht
37b0: 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ml_string(FILE *
37c0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
37d0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
37e0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
37f0: 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d   for(i=0;   z[i]
3800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
3810: 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20 20 20   z[i]!='<' .    
3820: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
3830: 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='&' .          
3840: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 20 0a    && z[i]!='>' .
3850: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
3860: 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20 20 20  [i]!='\"' .     
3870: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
3880: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b  '\'';.        i+
3890: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30  +){}.    if( i>0
38a0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
38b0: 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a  f(out,"%.*s",i,z
38c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
38d0: 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20   z[i]=='<' ){.  
38e0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
38f0: 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&lt;");.    }el
3900: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27  se if( z[i]=='&'
3910: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3920: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
3930: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
3940: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
3950: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67   fprintf(out,"&g
3960: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
3970: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29  if( z[i]=='\"' )
3980: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
3990: 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20  out,"&quot;");. 
39a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
39b0: 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  ]=='\'' ){.     
39c0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23   fprintf(out,"&#
39d0: 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  39;");.    }else
39e0: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
39f0: 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20     }.    z += i 
3a00: 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  + 1;.  }.}../*.*
3a10: 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e  * If a field con
3a20: 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63  tains any charac
3a30: 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
3a40: 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c  y a 1 in the fol
3a50: 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c  lowing.** array,
3a60: 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67   then the string
3a70: 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20   must be quoted 
3a80: 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74  for CSV..*/.stat
3a90: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65  ic const char ne
3aa0: 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b  edCsvQuote[] = {
3ab0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
3ac0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
3ad0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3ae0: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
3af0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3b00: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
3b10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
3b20: 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20   1, 0, 1, 0, 0, 
3b30: 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c  0, 0, 1,   0, 0,
3b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3b50: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
3b60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
3b70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3b80: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
3b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3ba0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
3bb0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20   0, 0, 0, 0, .  
3bc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3bd0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
3be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3bf0: 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , .  0, 0, 0, 0,
3c00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
3c10: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3c20: 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20   0, 0, .  0, 0, 
3c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3c40: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
3c50: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20 20 31  0, 0, 0, 1, .  1
3c60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3c70: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
3c80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3c90: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
3ca0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3cb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3cc0: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
3cd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3ce0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
3cf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
3d00: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
3d10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
3d20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d30: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
3d40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d50: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
3d60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
3d70: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
3d80: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
3d90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3da0: 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31   1,   .  1, 1, 1
3db0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3dc0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
3dd0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20  , 1, 1, 1,   .  
3de0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3df0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
3e00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3e10: 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ,   .};../*.** O
3e20: 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74  utput a single t
3e30: 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74  erm of CSV.  Act
3e40: 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61 72 61  ually, p->separa
3e50: 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a  tor is used for.
3e60: 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f 72  ** the separator
3e70: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
3e80: 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d  ay not be a comm
3e90: 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  a.  p->nullvalue
3ea0: 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20   is.** the null 
3eb0: 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20  value.  Strings 
3ec0: 61 72 65 20 71 75 6f 74 65 64 20 75 73 69 6e 67  are quoted using
3ed0: 20 41 4e 53 49 2d 43 20 72 75 6c 65 73 2e 20 20   ANSI-C rules.  
3ee0: 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 70 70 65 61  Numbers.** appea
3ef0: 72 20 6f 75 74 73 69 64 65 20 6f 66 20 71 75 6f  r outside of quo
3f00: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
3f10: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 73  oid output_csv(s
3f20: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
3f30: 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ata *p, const ch
3f40: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
3f50: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
3f60: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
3f70: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
3f80: 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75  f(out,"%s",p->nu
3f90: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73  llvalue);.  }els
3fa0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
3fb0: 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72    int nSep = str
3fc0: 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72 61 74  len30(p->separat
3fd0: 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
3fe0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
3ff0: 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51      if( needCsvQ
4000: 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20  uote[((unsigned 
4010: 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20  char*)z)[i]] .  
4020: 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d         || (z[i]=
4030: 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d  =p->separator[0]
4040: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20   && .           
4050: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
4060: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 73 65 70 61 72  mcmp(z, p->separ
4070: 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29  ator, nSep)==0))
4080: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
4090: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
40a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
40b0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
40c0: 20 20 20 20 20 20 70 75 74 63 28 27 22 27 2c 20        putc('"', 
40d0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  out);.      for(
40e0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
40f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
4100: 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28 27 22  ]=='"' ) putc('"
4110: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  ', out);.       
4120: 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75 74 29   putc(z[i], out)
4130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4140: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
4150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4160: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
4170: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
4180: 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a  }.  if( bSep ){.
4190: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
41a0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70  ut, "%s", p->sep
41b0: 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  arator);.  }.}..
41c0: 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a 2f 2a  #ifdef SIGINT./*
41d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
41e0: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
41f0: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
4200: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
4210: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
4220: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
4230: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
4240: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
4250: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
4260: 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29 20 73   1;.  if( db ) s
4270: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
4280: 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (db);.}.#endif..
4290: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
42a0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
42b0: 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c  ne that the shel
42c0: 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  l.** invokes for
42d0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
42e0: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
42f0: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
4300: 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _callback(void *
4310: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
4320: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
4330: 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 69 6e 74 20  ar **azCol, int 
4340: 2a 61 69 54 79 70 65 29 7b 0a 20 20 69 6e 74 20  *aiType){.  int 
4350: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  i;.  struct call
4360: 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28  back_data *p = (
4370: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
4380: 64 61 74 61 2a 29 70 41 72 67 3b 0a 0a 20 20 73  data*)pArg;..  s
4390: 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20 29  witch( p->mode )
43a0: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
43b0: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
43c0: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
43d0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
43e0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
43f0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
4410: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
4420: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
4430: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
4440: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
4450: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
4460: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
4470: 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f  0 ) fprintf(p->o
4480: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
4490: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
44a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
44b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
44c0: 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20 61  *s = %s\n", w, a
44d0: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
44e0: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
44f0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
4500: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
4510: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4520: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4530: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a  e MODE_Explain:.
4540: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f      case MODE_Co
4550: 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69 66  lumn: {.      if
4560: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b  ( p->cnt++==0 ){
4570: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4580: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
4590: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c            int w,
45a0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   n;.          if
45b0: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
45c0: 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  >colWidth) ){.  
45d0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
45e0: 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20  >colWidth[i];.  
45f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4600: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
4610: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4620: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 3d 30          if( w<=0
4630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4640: 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  w = strlen30(azC
4650: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
4660: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
4670: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
4680: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
4690: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
46a0: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
46b0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
46c0: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
46d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
46e0: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
46f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4700: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
4710: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
4720: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4730: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
4740: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
4750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4760: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
4770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
4780: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
4790: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a 43 6f  *.*s%s",w,w,azCo
47a0: 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  l[i], i==nArg-1 
47b0: 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20  ? "\n": "  ");. 
47c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
47d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
47e0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
47f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
4800: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
4810: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
4820: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
4830: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
4840: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
4850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
4860: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
4870: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
4880: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
48a0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
48b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
48c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
48d0: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22 2d 2d  -*.*s%s",w,w,"--
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
4910: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
4960: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
4970: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
4980: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
49a0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
49b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
49c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
49d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
49e0: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69  int w;.        i
49f0: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
4a00: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
4a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
4a20: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
4a30: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
4a40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  e{.           w 
4a50: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
4a60: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d          if( p->m
4a70: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
4a80: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
4a90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 74 72   .           str
4aa0: 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3e  len30(azArg[i])>
4ab0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  w ){.          w
4ac0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
4ad0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
4ae0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4af0: 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25  (p->out,"%-*.*s%
4b00: 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20  s",w,w,.        
4b10: 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61      azArg[i] ? a
4b20: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
4b30: 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67 2d  lvalue, i==nArg-
4b40: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
4b50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4b60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4b70: 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 0a  case MODE_Semi:.
4b80: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
4b90: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
4ba0: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
4bb0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
4bc0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4bd0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
4be0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
4bf0: 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61  (p->out,"%s%s",a
4c00: 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67  zCol[i], i==nArg
4c10: 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d 3e 73  -1 ? "\n" : p->s
4c20: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
4c30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4c40: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
4c50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
4c60: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
4c70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
4c80: 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
4c90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  ;.        if( z=
4ca0: 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c  =0 ) z = p->null
4cb0: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 66  value;.        f
4cc0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
4cd0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
4ce0: 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b   if( i<nArg-1 ){
4cf0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
4d00: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
4d10: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a   p->separator);.
4d20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
4d30: 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
4d40: 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  Semi ){.        
4d50: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
4d60: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
4d70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4d80: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
4d90: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
4da0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4db0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4dc0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d     case MODE_Htm
4dd0: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
4de0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
4df0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
4e00: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
4e10: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
4e20: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4e30: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
4e40: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
4e50: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
4e60: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
4e70: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
4e80: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
4e90: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
4ea0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c  f(p->out,"</TH>\
4eb0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
4ec0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
4ed0: 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29  ->out,"</TR>\n")
4ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ef0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
4f00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72 69  reak;.      fpri
4f10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e  ntf(p->out,"<TR>
4f20: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
4f30: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
4f40: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4f50: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
4f60: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
4f70: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
4f80: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
4f90: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
4fa0: 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lvalue);.       
4fb0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4fc0: 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TD>\n");.    
4fd0: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
4fe0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
4ff0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
5000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5010: 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20   MODE_Tcl: {.   
5020: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
5030: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
5040: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
5050: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
5060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5070: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
5080: 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20  p->out,azCol[i] 
5090: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
50a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
50b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
50c0: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  , p->separator);
50d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50e0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
50f0: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  t,"\n");.      }
5100: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
5110: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
5120: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
5130: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
5140: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
5150: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
5160: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
5170: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
5180: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
5190: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
51a0: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
51b0: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
51c0: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
51d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
51e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
51f0: 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Csv: {.      if
5200: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
5210: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
5220: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
5230: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5240: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
5250: 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69  t_csv(p, azCol[i
5260: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
5270: 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ", i<nArg-1);.  
5280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5290: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
52a0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
52b0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
52c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
52d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
52e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f   i++){.        o
52f0: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41  utput_csv(p, azA
5300: 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29  rg[i], i<nArg-1)
5310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5320: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5330: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
5340: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5350: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
5360: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
5370: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
5380: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
5390: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
53a0: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
53b0: 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e 7a 44  s VALUES(",p->zD
53c0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
53d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
53f0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69 3e 30  char *zSep = i>0
5400: 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20 20 20   ? ",": "";.    
5410: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
5420: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
5430: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
5440: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
5450: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
5460: 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c 22  (p->out,"%sNULL"
5470: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
5480: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
5490: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
54a0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
54b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 70          if( zSep
54c0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d  [0] ) fprintf(p-
54d0: 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b  >out,"%s",zSep);
54e0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
54f0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
5500: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
5510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5520: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 28   if( aiType && (
5530: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
5540: 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 69 54  E_INTEGER || aiT
5550: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
5560: 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 20 20 20  LOAT) ){.       
5570: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5580: 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61  t,"%s%s",zSep, a
5590: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
55a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
55b0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
55c0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
55d0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
55e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
55f0: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
5600: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
5610: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
5620: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
5630: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5640: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
5650: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
5660: 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72  f( zSep[0] ) fpr
5670: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
5680: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
5690: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
56a0: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
56b0: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
56c0: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
56d0: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
56e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
56f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
5700: 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b  %s",zSep, azArg[
5710: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
5720: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
5730: 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72 69  ( zSep[0] ) fpri
5740: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
5750: 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20  zSep);.         
5760: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
5770: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
5780: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
5790: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
57a0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
57b0: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
57c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
57d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
57e0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
57f0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
5800: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
5810: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
5820: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
5830: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
5840: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
5850: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
5860: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
5870: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
5880: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
5890: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
58a0: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
58b0: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
58c0: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
58d0: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
58e0: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
58f0: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
5900: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
5910: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
5930: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
5940: 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63  d of the callbac
5950: 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75 72 65  k_data structure
5960: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
5970: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
5980: 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
5990: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
59a0: 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
59b0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
59c0: 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
59d0: 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61 6c 6c  name(struct call
59e0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f  back_data *p, co
59f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5a00: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
5a10: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20  int needQuote;. 
5a20: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
5a30: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
5a40: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
5a50: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
5a60: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
5a70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
5a80: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5a90: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73   needQuote = !is
5aa0: 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20  alpha((unsigned 
5ab0: 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26 20  char)*zName) && 
5ac0: 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20 66  *zName!='_';.  f
5ad0: 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65 5b  or(i=n=0; zName[
5ae0: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
5af0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
5b00: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
5b10: 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61 6d  Name[i]) && zNam
5b20: 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20 20  e[i]!='_' ){.   
5b30: 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 31     needQuote = 1
5b40: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
5b50: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b  e[i]=='\'' ) n++
5b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5b70: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e 20  ( needQuote ) n 
5b80: 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a  += 2;.  z = p->z
5b90: 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
5ba0: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
5bb0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   z==0 ){.    fpr
5bc0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
5bd0: 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
5be0: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
5bf0: 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b  1);.  }.  n = 0;
5c00: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
5c10: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
5c20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
5c30: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
5c40: 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
5c50: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
5c60: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 6e  e[i]=='\'' ) z[n
5c70: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
5c80: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
5c90: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
5ca0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
5cb0: 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65 72  /* zIn is either
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
5cd0: 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
5ce0: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
5cf0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
5d00: 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61  m malloc(), or a
5d10: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54   NULL pointer. T
5d20: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
5d30: 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64 20  d to by zAppend 
5d40: 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a  is.** added to z
5d50: 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73 75  In, and the resu
5d60: 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20 6d  lt returned in m
5d70: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5d80: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  rom malloc()..**
5d90: 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73 20   zIn, if it was 
5da0: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65  not NULL, is fre
5db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
5dc0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c   third argument,
5dd0: 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27   quote, is not '
5de0: 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  \0', then it is 
5df0: 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71 75  used as a .** qu
5e00: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ote character fo
5e10: 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74  r zAppend..*/.st
5e20: 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 65 6e  atic char *appen
5e30: 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e 2c  dText(char *zIn,
5e40: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70   char const *zAp
5e50: 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74 65  pend, char quote
5e60: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
5e70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70  int i;.  int nAp
5e80: 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30 28  pend = strlen30(
5e90: 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74 20  zAppend);.  int 
5ea0: 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c 65  nIn = (zIn?strle
5eb0: 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20 20  n30(zIn):0);..  
5ec0: 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 6e 49  len = nAppend+nI
5ed0: 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74 65  n+1;.  if( quote
5ee0: 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 32   ){.    len += 2
5ef0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5f00: 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a  <nAppend; i++){.
5f10: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
5f20: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c 65  d[i]==quote ) le
5f30: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
5f40: 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20 2a 29    zIn = (char *)
5f50: 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65 6e  realloc(zIn, len
5f60: 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20 29 7b  );.  if( !zIn ){
5f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5f80: 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74 65 20   }..  if( quote 
5f90: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 73  ){.    char *zCs
5fa0: 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a 20  r = &zIn[nIn];. 
5fb0: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f     *zCsr++ = quo
5fc0: 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  te;.    for(i=0;
5fd0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
5fe0: 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20  {.      *zCsr++ 
5ff0: 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20  = zAppend[i];.  
6000: 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b      if( zAppend[
6010: 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73  i]==quote ) *zCs
6020: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
6030: 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d   }.    *zCsr++ =
6040: 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a 43 73   quote;.    *zCs
6050: 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  r++ = '\0';.    
6060: 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d 7a 49  assert( (zCsr-zI
6070: 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65 6c  n)==len );.  }el
6080: 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  se{.    memcpy(&
6090: 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65 6e  zIn[nIn], zAppen
60a0: 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  d, nAppend);.   
60b0: 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27 5c   zIn[len-1] = '\
60c0: 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0';.  }..  retur
60d0: 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n zIn;.}.../*.**
60e0: 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
60f0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
6100: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72 65 73  has a single res
6110: 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50 72 69  ult column.  Pri
6120: 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73 75 6c  nt.** that resul
6130: 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20 6c 69  t column on a li
6140: 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77 69 74  ne by itself wit
6150: 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  h a semicolon te
6160: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
6170: 54 68 69 73 20 69 73 20 75 73 65 64 2c 20 66 6f  This is used, fo
6180: 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 68  r example, to sh
6190: 6f 77 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  ow the schema of
61a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
61b0: 0a 2a 2a 20 71 75 65 72 79 69 6e 67 20 74 68 65  .** querying the
61c0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
61d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
61e0: 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
61f0: 6d 70 5f 71 75 65 72 79 28 0a 20 20 46 49 4c 45  mp_query(.  FILE
6200: 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20   *out,          
6210: 20 20 20 20 2f 2a 20 53 65 6e 64 20 6f 75 74 70      /* Send outp
6220: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 73 71 6c  ut here */.  sql
6230: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6240: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6250: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
6260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65  onst char *zSele
6270: 63 74 2c 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ct,    /* SELECT
6280: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
6290: 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f  tract content */
62a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
62b0: 46 69 72 73 74 52 6f 77 20 20 20 2f 2a 20 50 72  FirstRow   /* Pr
62c0: 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74  int before first
62d0: 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c   row, if not NUL
62e0: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
62f0: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b  3_stmt *pSelect;
6300: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
6310: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6320: 65 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d  e(db, zSelect, -
6330: 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
6340: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6350: 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74  E_OK || !pSelect
6360: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
6370: 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
6380: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
6390: 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ct);.  while( rc
63a0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
63b0: 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f      if( zFirstRo
63c0: 77 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  w ){.      fprin
63d0: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46  tf(out, "%s", zF
63e0: 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  irstRow);.      
63f0: 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20  zFirstRow = 0;. 
6400: 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
6410: 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73  (out, "%s;\n", s
6420: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
6430: 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 29 3b  xt(pSelect, 0));
6440: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6450: 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
6460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
6470: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6480: 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Select);.}../*.*
6490: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
64a0: 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
64b0: 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
64c0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
64d0: 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
64e0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
64f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6500: 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
6510: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
6520: 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
6530: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
6540: 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
6550: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
6560: 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d 73 67 29 3b  malloc(nErrMsg);
6570: 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
6580: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
6590: 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
65a0: 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
65b0: 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
65c0: 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a   zErrMsg;.}../*.
65d0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61  ** Execute a sta
65e0: 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66  tement or set of
65f0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72   statements.  Pr
6600: 69 6e 74 20 0a 2a 2a 20 61 6e 79 20 72 65 73 75  int .** any resu
6610: 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20  lt rows/columns 
6620: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
6630: 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 0a 2a   current mode .*
6640: 2a 20 73 65 74 20 76 69 61 20 74 68 65 20 73 75  * set via the su
6650: 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e  pplied callback.
6660: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76  .**.** This is v
6670: 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53  ery similar to S
6680: 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e  QLite's built-in
6690: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
66a0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63  .** function exc
66b0: 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 73  ept it takes a s
66c0: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
66d0: 74 20 63 61 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  t callback .** a
66e0: 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
66f0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
6700: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
6710: 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xec(.  sqlite3 *
6720: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
6750: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
6760: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
6790: 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a  o be evaluated *
67a0: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
67b0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
67c0: 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
67d0: 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  *),   /* Callbac
67e0: 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
6820: 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
6830: 73 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f  sqlite3_exec) */
6840: 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
6850: 63 6b 5f 64 61 74 61 20 2a 70 41 72 67 2c 20 20  ck_data *pArg,  
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6870: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72  * Pointer to str
6880: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
6890: 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  a */.  char **pz
68a0: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
68d0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
68e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
68f0: 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
6900: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
6910: 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
6920: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6930: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6940: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
6950: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
6960: 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
6970: 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
6980: 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
6990: 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72  L */..  if( pzEr
69a0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45  rMsg ){.    *pzE
69b0: 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrMsg = NULL;.  
69c0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  }..  while( zSql
69d0: 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
69e0: 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
69f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6a00: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
6a10: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
6a20: 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69  Leftover);.    i
6a30: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20  f( SQLITE_OK != 
6a40: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
6a50: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
6a60: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
6a70: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
6a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6a90: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
6aa0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
6ab0: 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   /* this happens
6ac0: 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f   for a comment o
6ad0: 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f  r white-space */
6ae0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
6af0: 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
6b00: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
6b10: 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
6b20: 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  l++;.        con
6b30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
6b40: 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68        /* echo th
6b50: 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
6b60: 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20  if echo on */.  
6b70: 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 65 63      if( pArg->ec
6b80: 68 6f 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  hoOn ){.        
6b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d  const char *zStm
6ba0: 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
6bb0: 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
6bc0: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
6bd0: 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 7a 53 74  >out,"%s\n", zSt
6be0: 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c  mtSql ? zStmtSql
6bf0: 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20   : zSql);.      
6c00: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 65 72 66  }..      /* perf
6c10: 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20 73 74  orm the first st
6c20: 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74  ep.  this will t
6c30: 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20 20 20  ell us if we.   
6c40: 20 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73     ** have a res
6c50: 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
6c60: 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
6c70: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
6c80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
6c90: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
6ca0: 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20    /* if we have 
6cb0: 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20  a result set... 
6cc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  */.      if( SQL
6cd0: 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
6ce0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 77  .        /* if w
6cf0: 65 20 68 61 76 65 20 61 20 63 61 6c 6c 62 61 63  e have a callbac
6d00: 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  k... */.        
6d10: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b  if( xCallback ){
6d20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6c  .          /* al
6d30: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
6d40: 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76   col name ptr, v
6d50: 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79  alue ptr, and ty
6d60: 70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  pe */.          
6d70: 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  int nCol = sqlit
6d80: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
6d90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
6da0: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
6db0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33  sqlite3_malloc(3
6dc0: 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
6dd0: 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
6de0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
6df0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
6e00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6e10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
6e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6e30: 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
6e40: 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
6e50: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
6e60: 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
6e70: 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
6e80: 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
6e90: 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
6ea0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
6eb0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ts */.          
6ec0: 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d    int *aiTypes =
6ed0: 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b   (int *)&azVals[
6ee0: 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74  nCol]; /* Result
6ef0: 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
6f00: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6f10: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
6f20: 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73  sizeof(int) <= s
6f30: 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 20  izeof(char *)); 
6f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6f50: 73 61 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f  save off ptrs to
6f60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
6f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
6f80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
6f90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
6fa0: 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
6fb0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
6fc0: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
6fd0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
6fe0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
6ff0: 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
7000: 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
7010: 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
7020: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
7030: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7040: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
7050: 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
7060: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
7070: 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e          pArg->cn
7080: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
7090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
70a0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
70b0: 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68     /* extract th
70c0: 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20  e data and data 
70d0: 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
70e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
70f0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
7110: 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20  Vals[i] = (char 
7120: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
7130: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
7140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7150: 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 73 71   aiTypes[i] = sq
7160: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
7170: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
7190: 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
71a0: 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
71b0: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
71d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
71e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
71f0: 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f     break; /* fro
7200: 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  m for */.       
7210: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7220: 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
7230: 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  d for */..      
7240: 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
7250: 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
7260: 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
7270: 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
7280: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
7290: 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 20  TE_ROW == rc ){ 
72a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72b0: 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70   /* call the sup
72c0: 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77  plied callback w
72d0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 72  ith the result r
72e0: 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20  ow data */.     
72f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78             if( x
7300: 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  Callback(pArg, n
7310: 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43  Col, azVals, azC
7320: 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b  ols, aiTypes) ){
7330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7340: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41     rc = SQLITE_A
7350: 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BORT;.          
7360: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
7390: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
73a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
73b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
73c0: 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
73d0: 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
73e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
73f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
7400: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
7410: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
7420: 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d             pArg-
7430: 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20  >pStmt = NULL;. 
7440: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
7480: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
7490: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
74a0: 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72        } while( r
74b0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20  c == SQLITE_ROW 
74c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
74d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
74e0: 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74  inalize the stat
74f0: 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75  ement just execu
7500: 74 65 64 2e 20 49 66 20 74 68 69 73 20 66 61 69  ted. If this fai
7510: 6c 73 2c 20 73 61 76 65 20 61 20 0a 20 20 20 20  ls, save a .    
7520: 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
7530: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
7540: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a  Otherwise, set z
7550: 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Sql to point to 
7560: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78  the.      ** nex
7570: 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  t statement to e
7580: 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20  xecute. */.     
7590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
75a0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
75b0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
75c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
75d0: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
75e0: 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
75f0: 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  e( isspace(zSql[
7600: 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
7610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a      }else if( pz
7620: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
7630: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61    *pzErrMsg = sa
7640: 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a  ve_err_msg(db);.
7650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7660: 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a  } /* end while *
7670: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
7680: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  }.../*.** This i
7690: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61  s a different ca
76a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75  llback routine u
76b0: 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20  sed for dumping 
76c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
76d0: 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76   Each row receiv
76e0: 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62  ed by this callb
76f0: 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
7700: 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a  a table name,.**
7710: 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20   the table type 
7720: 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62  ("index" or "tab
7730: 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20  le") and SQL to 
7740: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
7750: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
7760: 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74  e should print t
7770: 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  ext sufficient t
7780: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
7790: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
77a0: 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  int dump_callbac
77b0: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
77c0: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
77d0: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43  zArg, char **azC
77e0: 6f 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ol){.  int rc;. 
77f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
7800: 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
7810: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
7820: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
7830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
7840: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 74 72  pStmt = 0;.  str
7850: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
7860: 61 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63  a *p = (struct c
7870: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29 70  allback_data *)p
7880: 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  Arg;..  UNUSED_P
7890: 41 52 41 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b  ARAMETER(azCol);
78a0: 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29  .  if( nArg!=3 )
78b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54 61   return 1;.  zTa
78c0: 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a  ble = azArg[0];.
78d0: 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b    zType = azArg[
78e0: 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41  1];.  zSql = azA
78f0: 72 67 5b 32 5d 3b 0a 20 20 0a 20 20 69 66 28 20  rg[2];.  .  if( 
7900: 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  strcmp(zTable, "
7910: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
7920: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 50 72 65  )==0 ){.    zPre
7930: 70 53 74 6d 74 20 3d 20 22 44 45 4c 45 54 45 20  pStmt = "DELETE 
7940: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75  FROM sqlite_sequ
7950: 65 6e 63 65 3b 5c 6e 22 3b 0a 20 20 7d 65 6c 73  ence;\n";.  }els
7960: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
7970: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  ble, "sqlite_sta
7980: 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  t1")==0 ){.    f
7990: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
79a0: 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
79b0: 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65  aster;\n");.  }e
79c0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
79d0: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
79e0: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
79f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
7a00: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
7a10: 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  ql, "CREATE VIRT
7a20: 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d  UAL TABLE", 20)=
7a30: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
7a40: 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70  zIns;.    if( !p
7a50: 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
7a60: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
7a70: 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  f(p->out, "PRAGM
7a80: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
7a90: 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  a=ON;\n");.     
7aa0: 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
7ab0: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ma = 1;.    }.  
7ac0: 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33    zIns = sqlite3
7ad0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
7ae0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71   "INSERT INTO sq
7af0: 6c 69 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65  lite_master(type
7b00: 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72  ,name,tbl_name,r
7b10: 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20  ootpage,sql)".  
7b20: 20 20 20 20 20 22 56 41 4c 55 45 53 28 27 74 61       "VALUES('ta
7b30: 62 6c 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30  ble','%q','%q',0
7b40: 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20  ,'%q');",.      
7b50: 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c   zTable, zTable,
7b60: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 66 70 72 69   zSql);.    fpri
7b70: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
7b80: 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
7b90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
7ba0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7bb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
7bc0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
7bd0: 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  s;\n", zSql);.  
7be0: 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  }..  if( strcmp(
7bf0: 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d  zType, "table")=
7c00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7c10: 33 5f 73 74 6d 74 20 2a 70 54 61 62 6c 65 49 6e  3_stmt *pTableIn
7c20: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  fo = 0;.    char
7c30: 20 2a 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20   *zSelect = 0;. 
7c40: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 49     char *zTableI
7c50: 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  nfo = 0;.    cha
7c60: 72 20 2a 7a 54 6d 70 20 3d 20 30 3b 0a 20 20 20  r *zTmp = 0;.   
7c70: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20   int nRow = 0;. 
7c80: 20 20 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66    .    zTableInf
7c90: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
7ca0: 54 61 62 6c 65 49 6e 66 6f 2c 20 22 50 52 41 47  TableInfo, "PRAG
7cb0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 22 2c  MA table_info(",
7cc0: 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49   0);.    zTableI
7cd0: 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74  nfo = appendText
7ce0: 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 7a 54 61  (zTableInfo, zTa
7cf0: 62 6c 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 7a  ble, '"');.    z
7d00: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
7d10: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
7d20: 6f 2c 20 22 29 3b 22 2c 20 30 29 3b 0a 0a 20 20  o, ");", 0);..  
7d30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
7d40: 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 54  repare(p->db, zT
7d50: 61 62 6c 65 49 6e 66 6f 2c 20 2d 31 2c 20 26 70  ableInfo, -1, &p
7d60: 54 61 62 6c 65 49 6e 66 6f 2c 20 30 29 3b 0a 20  TableInfo, 0);. 
7d70: 20 20 20 66 72 65 65 28 7a 54 61 62 6c 65 49 6e     free(zTableIn
7d80: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fo);.    if( rc!
7d90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
7da0: 54 61 62 6c 65 49 6e 66 6f 20 29 7b 0a 20 20 20  TableInfo ){.   
7db0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7dc0: 20 7d 0a 0a 20 20 20 20 7a 53 65 6c 65 63 74 20   }..    zSelect 
7dd0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
7de0: 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 27 49  lect, "SELECT 'I
7df0: 4e 53 45 52 54 20 49 4e 54 4f 20 27 20 7c 7c 20  NSERT INTO ' || 
7e00: 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54 6d 70 20  ", 0);.    zTmp 
7e10: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 6d  = appendText(zTm
7e20: 70 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b  p, zTable, '"');
7e30: 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 20 29 7b  .    if( zTmp ){
7e40: 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d  .      zSelect =
7e50: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c   appendText(zSel
7e60: 65 63 74 2c 20 7a 54 6d 70 2c 20 27 5c 27 27 29  ect, zTmp, '\'')
7e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c  ;.    }.    zSel
7e80: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
7e90: 28 7a 53 65 6c 65 63 74 2c 20 22 20 7c 7c 20 27  (zSelect, " || '
7ea0: 20 56 41 4c 55 45 53 28 27 20 7c 7c 20 22 2c 20   VALUES(' || ", 
7eb0: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
7ec0: 69 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65  ite3_step(pTable
7ed0: 49 6e 66 6f 29 3b 0a 20 20 20 20 77 68 69 6c 65  Info);.    while
7ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
7ef0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
7f00: 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63  char *zText = (c
7f10: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
7f20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7f30: 70 54 61 62 6c 65 49 6e 66 6f 2c 20 31 29 3b 0a  pTableInfo, 1);.
7f40: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
7f50: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
7f60: 63 74 2c 20 22 71 75 6f 74 65 28 22 2c 20 30 29  ct, "quote(", 0)
7f70: 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20  ;.      zSelect 
7f80: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
7f90: 6c 65 63 74 2c 20 7a 54 65 78 74 2c 20 27 22 27  lect, zText, '"'
7fa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
7fb0: 6c 69 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c  lite3_step(pTabl
7fc0: 65 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  eInfo);.      if
7fd0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
7fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c   ){.        zSel
7ff0: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
8000: 28 7a 53 65 6c 65 63 74 2c 20 22 29 20 7c 7c 20  (zSelect, ") || 
8010: 27 2c 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20  ',' || ", 0);.  
8020: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8030: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
8040: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
8050: 20 22 29 20 22 2c 20 30 29 3b 0a 20 20 20 20 20   ") ", 0);.     
8060: 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b 3b   }.      nRow++;
8070: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8080: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8090: 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20  (pTableInfo);.  
80a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
80b0: 5f 4f 4b 20 7c 7c 20 6e 52 6f 77 3d 3d 30 20 29  _OK || nRow==0 )
80c0: 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 53 65  {.      free(zSe
80d0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74  lect);.      ret
80e0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
80f0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
8100: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
8110: 7c 7c 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20  || ')' FROM  ", 
8120: 30 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20  0);.    zSelect 
8130: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
8140: 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22  lect, zTable, '"
8150: 27 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75  ');..    rc = ru
8160: 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
8170: 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62  ry(p->out, p->db
8180: 2c 20 7a 53 65 6c 65 63 74 2c 20 7a 50 72 65 70  , zSelect, zPrep
8190: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
81a0: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
81b0: 54 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65  T ){.      zSele
81c0: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
81d0: 7a 53 65 6c 65 63 74 2c 20 22 20 4f 52 44 45 52  zSelect, " ORDER
81e0: 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
81f0: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
8200: 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
8210: 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  uery(p->out, p->
8220: 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 30 29 3b  db, zSelect, 0);
8230: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
8240: 53 65 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53  Select ) free(zS
8250: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65  elect);.  }.  re
8260: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8270: 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
8280: 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
8290: 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
82a0: 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
82b0: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
82c0: 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
82d0: 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
82e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
82f0: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
8310: 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
8320: 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
8330: 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
8340: 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
8350: 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
8360: 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
8370: 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
8380: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
8390: 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f 6e  _data *p, .  con
83a0: 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c  st char *zQuery,
83b0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
83c0: 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sg.){.  int rc;.
83d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
83e0: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  xec(p->db, zQuer
83f0: 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  y, dump_callback
8400: 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  , p, pzErrMsg);.
8410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8420: 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
8430: 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
8440: 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
8450: 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 69  0(zQuery);.    i
8460: 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 73 71  f( pzErrMsg ) sq
8470: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 45 72  lite3_free(*pzEr
8480: 72 4d 73 67 29 3b 0a 20 20 20 20 7a 51 32 20 3d  rMsg);.    zQ2 =
8490: 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30   malloc( len+100
84a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d   );.    if( zQ2=
84b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
84c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
84d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 51 32 29  intf(sizeof(zQ2)
84e0: 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52  , zQ2, "%s ORDER
84f0: 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
8500: 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63   zQuery);.    rc
8510: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
8520: 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70  p->db, zQ2, dump
8530: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 70 7a  _callback, p, pz
8540: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 66 72 65  ErrMsg);.    fre
8550: 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65  e(zQ2);.  }.  re
8560: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8570: 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70  * Text of a help
8580: 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74   message.*/.stat
8590: 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20  ic char zHelp[] 
85a0: 3d 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  =.  ".backup ?DB
85b0: 3f 20 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b  ? FILE      Back
85c0: 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  up DB (default \
85d0: 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45  "main\") to FILE
85e0: 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20 4f 4e 7c  \n".  ".bail ON|
85f0: 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 53 74  OFF           St
8600: 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67  op after hitting
8610: 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61   an error.  Defa
8620: 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 64  ult OFF\n".  ".d
8630: 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20  atabases        
8640: 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
8650: 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
8660: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c  ached databases\
8670: 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42  n".  ".dump ?TAB
8680: 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d  LE? ...      Dum
8690: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  p the database i
86a0: 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f  n an SQL text fo
86b0: 72 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20  rmat\n".  "     
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
86e0: 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d  cified, only dum
86f0: 70 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  p tables matchin
8700: 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
8730: 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f  BLE.\n".  ".echo
8740: 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20   ON|OFF         
8750: 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
8760: 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  cho on or off\n"
8770: 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20 20 20  .  ".exit       
8780: 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
8790: 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a  this program\n".
87a0: 20 20 22 2e 65 78 70 6c 61 69 6e 20 3f 4f 4e 7c    ".explain ?ON|
87b0: 4f 46 46 3f 20 20 20 20 20 20 54 75 72 6e 20 6f  OFF?      Turn o
87c0: 75 74 70 75 74 20 6d 6f 64 65 20 73 75 69 74 61  utput mode suita
87d0: 62 6c 65 20 66 6f 72 20 45 58 50 4c 41 49 4e 20  ble for EXPLAIN 
87e0: 6f 6e 20 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20 20  on or off.\n".  
87f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8800: 20 20 20 20 20 20 20 20 20 20 57 69 74 68 20 6e            With n
8810: 6f 20 61 72 67 73 2c 20 69 74 20 74 75 72 6e 73  o args, it turns
8820: 20 45 58 50 4c 41 49 4e 20 6f 6e 2e 5c 6e 22 0a   EXPLAIN on.\n".
8830: 20 20 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e    ".header(s) ON
8840: 7c 4f 46 46 20 20 20 20 20 20 54 75 72 6e 20 64  |OFF      Turn d
8850: 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
8860: 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
8870: 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
8880: 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
8890: 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
88a0: 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
88b0: 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
88c0: 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
88d0: 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e  to TABLE\n".  ".
88e0: 69 6e 64 69 63 65 73 20 3f 54 41 42 4c 45 3f 20  indices ?TABLE? 
88f0: 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
8900: 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 5c   of all indices\
8910: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
8930: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
8940: 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
8950: 69 63 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c  ices for tables\
8960: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8980: 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
8990: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23  tern TABLE.\n".#
89a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89b0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e  BLE_IOTRACE.  ".
89c0: 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20  iotrace FILE    
89d0: 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
89e0: 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
89f0: 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23  ing to FILE\n".#
8a00: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
8a10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8a20: 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61  XTENSION.  ".loa
8a30: 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20  d FILE ?ENTRY?  
8a40: 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e     Load an exten
8a50: 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a  sion library\n".
8a60: 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
8a70: 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
8a80: 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e   Turn logging on
8a90: 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63   or off.  FILE c
8aa0: 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64  an be stderr/std
8ab0: 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20  out\n".  ".mode 
8ac0: 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20  MODE ?TABLE?    
8ad0: 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   Set output mode
8ae0: 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f   where MODE is o
8af0: 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20  ne of:\n".  "   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43        csv      C
8b20: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76  omma-separated v
8b30: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  alues\n".  "    
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
8b60: 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
8b70: 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
8b80: 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  )\n".  "        
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c   html     HTML <
8bb0: 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20  table> code\n". 
8bc0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
8bd0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72             inser
8be0: 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
8bf0: 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
8c00: 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  BLE\n".  "      
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
8c30: 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e  value per line\n
8c40: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
8c60: 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
8c70: 6c 69 6d 69 74 65 64 20 62 79 20 2e 73 65 70 61  limited by .sepa
8c80: 72 61 74 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a  rator string\n".
8c90: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73              tabs
8cb0: 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
8cc0: 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20           tcl    
8cf0: 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65    TCL list eleme
8d00: 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76  nts\n".  ".nullv
8d10: 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
8d20: 20 50 72 69 6e 74 20 53 54 52 49 4e 47 20 69 6e   Print STRING in
8d30: 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
8d40: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 75 74  alues\n".  ".out
8d50: 70 75 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  put FILENAME    
8d60: 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
8d70: 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  o FILENAME\n".  
8d80: 22 2e 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20  ".output stdout 
8d90: 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
8da0: 70 75 74 20 74 6f 20 74 68 65 20 73 63 72 65 65  put to the scree
8db0: 6e 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  n\n".  ".prompt 
8dc0: 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
8dd0: 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
8de0: 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
8df0: 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
8e00: 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
8e10: 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
8e20: 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
8e30: 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
8e40: 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
8e50: 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
8e60: 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
8e70: 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
8e80: 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
8e90: 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
8ea0: 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54  n".  ".schema ?T
8eb0: 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f  ABLE?        Sho
8ec0: 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
8ed0: 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20  tements\n".  "  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
8f00: 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
8f10: 73 68 6f 77 20 74 61 62 6c 65 73 20 6d 61 74 63  show tables matc
8f20: 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
8f50: 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73   TABLE.\n".  ".s
8f60: 65 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20  eparator STRING 
8f70: 20 20 20 20 20 43 68 61 6e 67 65 20 73 65 70 61       Change sepa
8f80: 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75  rator used by ou
8f90: 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69  tput mode and .i
8fa0: 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e 73 68 6f  mport\n".  ".sho
8fb0: 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
8fc0: 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
8fd0: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
8fe0: 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
8ff0: 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  n".  ".tables ?T
9000: 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73  ABLE?        Lis
9010: 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
9020: 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
9050: 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74  ied, only list t
9060: 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
9070: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
9090: 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
90a0: 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74  .\n".  ".timeout
90b0: 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54   MS            T
90c0: 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
90d0: 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
90e0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a  milliseconds\n".
90f0: 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
9100: 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f  UM2 ...   Set co
9110: 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
9120: 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c  \"column\" mode\
9130: 6e 22 0a 3b 0a 0a 73 74 61 74 69 63 20 63 68 61  n".;..static cha
9140: 72 20 7a 54 69 6d 65 72 48 65 6c 70 5b 5d 20 3d  r zTimerHelp[] =
9150: 0a 20 20 22 2e 74 69 6d 65 72 20 4f 4e 7c 4f 46  .  ".timer ON|OF
9160: 46 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  F          Turn 
9170: 74 68 65 20 43 50 55 20 74 69 6d 65 72 20 6d 65  the CPU timer me
9180: 61 73 75 72 65 6d 65 6e 74 20 6f 6e 20 6f 72 20  asurement on or 
9190: 6f 66 66 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f 72  off\n".;../* For
91a0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
91b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
91c0: 63 65 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63  cess_input(struc
91d0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
91e0: 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a  *p, FILE *in);..
91f0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
9200: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
9210: 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
9220: 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
9230: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
9240: 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
9250: 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
9260: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
9270: 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
9280: 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 73 74   void open_db(st
9290: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
92a0: 74 61 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ta *p){.  if( p-
92b0: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  >db==0 ){.    sq
92c0: 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
92d0: 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
92e0: 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e  b);.    db = p->
92f0: 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26  db;.    if( db &
9300: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
9310: 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e(db)==SQLITE_OK
9320: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9330: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9340: 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74  n(db, "shellstat
9350: 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  ic", 0, SQLITE_U
9360: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
9370: 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e    shellstaticFun
9380: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
9390: 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c      if( db==0 ||
93a0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
93b0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20  te3_errcode(db) 
93c0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
93d0: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
93e0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
93f0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
9400: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
9410: 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
9420: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
9430: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 65 78 69  (db));.      exi
9440: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
9450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9460: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
9470: 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
9480: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
9490: 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
94a0: 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
94b0: 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
94c0: 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
94d0: 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  *.**    \t    ->
94e0: 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
94f0: 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
9500: 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
9510: 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
9520: 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
9530: 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
9540: 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c 20   octal.**    \\ 
9550: 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a     -> backslash.
9560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
9570: 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
9580: 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  es(char *z){.  i
9590: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
95a0: 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  c;.  for(i=j=0; 
95b0: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
95c0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
95d0: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
95e0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
95f0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20       if( c=='n' 
9600: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
9610: 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
9620: 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
9630: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
9640: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9650: 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
9660: 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
9670: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
9680: 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
9690: 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
96a0: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
96b0: 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
96c0: 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
96d0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
96e0: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
96f0: 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
9700: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
9710: 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
9720: 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
9730: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
9740: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
9750: 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
9760: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9780: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
9790: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
97a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
97b0: 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 20  rpret zArg as a 
97c0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
97d0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 30 20  Return either 0 
97e0: 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  or 1..*/.static 
97f0: 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
9800: 28 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20  (char *zArg){.  
9810: 69 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 7a  int val = atoi(z
9820: 41 72 67 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Arg);.  int j;. 
9830: 20 66 6f 72 28 6a 3d 30 3b 20 7a 41 72 67 5b 6a   for(j=0; zArg[j
9840: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 41 72  ]; j++){.    zAr
9850: 67 5b 6a 5d 20 3d 20 28 63 68 61 72 29 74 6f 6c  g[j] = (char)tol
9860: 6f 77 65 72 28 7a 41 72 67 5b 6a 5d 29 3b 0a 20  ower(zArg[j]);. 
9870: 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
9880: 7a 41 72 67 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b  zArg,"on")==0 ){
9890: 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20  .    val = 1;.  
98a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
98b0: 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
98c0: 29 7b 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  ){.    val = 1;.
98d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 61 6c    }.  return val
98e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
98f0: 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
9900: 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
9910: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
9920: 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
9930: 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
9940: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
9950: 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
9960: 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
9970: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9980: 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
9990: 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74  (char *zLine, st
99a0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
99b0: 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20  ta *p){.  int i 
99c0: 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
99d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
99e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
99f0: 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
9a00: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
9a10: 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
9a20: 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
9a30: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d   while( zLine[i]
9a40: 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
9a50: 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
9a60: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
9a70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
9a80: 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b  Line[i]) ){ i++;
9a90: 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
9aa0: 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
9ab0: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
9ac0: 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
9ad0: 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  i]=='"' ){.     
9ae0: 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
9af0: 6e 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[i++];.      a
9b00: 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
9b10: 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20  zLine[i];.      
9b20: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20  while( zLine[i] 
9b30: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c  && zLine[i]!=del
9b40: 69 6d 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  im ){ i++; }.   
9b50: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d     if( zLine[i]=
9b60: 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
9b70: 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30    zLine[i++] = 0
9b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b90: 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
9ba0: 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
9bb0: 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
9bc0: 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
9bd0: 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
9be0: 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b  ++] = &zLine[i];
9bf0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
9c00: 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70 61  ine[i] && !isspa
9c10: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
9c20: 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  r)zLine[i]) ){ i
9c30: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
9c40: 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e 65  zLine[i] ) zLine
9c50: 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [i++] = 0;.     
9c60: 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
9c70: 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
9c80: 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
9c90: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
9ca0: 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
9cb0: 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
9cc0: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
9cd0: 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
9ce0: 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
9cf0: 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
9d00: 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
9d10: 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  ];.  if( c=='b' 
9d20: 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
9d30: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
9d40: 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20  ckup", n)==0 && 
9d50: 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 34  nArg>1 && nArg<4
9d60: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9d70: 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20  r *zDestFile;.  
9d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
9d90: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
9da0: 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pDest;.    sqlit
9db0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
9dc0: 75 70 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  up;.    if( nArg
9dd0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==2 ){.      zDe
9de0: 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  stFile = azArg[1
9df0: 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22  ];.      zDb = "
9e00: 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  main";.    }else
9e10: 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  {.      zDestFil
9e20: 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
9e30: 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b      zDb = azArg[
9e40: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  1];.    }.    rc
9e50: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
9e60: 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
9e70: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
9e80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9e90: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9ea0: 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
9eb0: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
9ec0: 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
9ee0: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
9ef0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
9f00: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
9f10: 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
9f20: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
9f30: 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
9f40: 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20   p->db, zDb);.  
9f50: 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
9f60: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
9f70: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
9f80: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
9f90: 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b  _errmsg(pDest));
9fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
9fb0: 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
9fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9fd0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
9fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
9ff0: 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
a000: 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
a010: 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
a020: 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
a030: 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
a040: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
a050: 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
a060: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
a070: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
a080: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
a090: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
a0a0: 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
a0b0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
a0c0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
a0d0: 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65  (pDest);.  }else
a0e0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
a0f0: 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
a100: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69  p(azArg[0], "bai
a110: 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  l", n)==0 && nAr
a120: 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  g>1 && nArg<3 ){
a130: 0a 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72  .    bail_on_err
a140: 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
a150: 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
a160: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
a170: 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
a180: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
a190: 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
a1a0: 30 20 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a  0 && nArg==1 ){.
a1b0: 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62      struct callb
a1c0: 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
a1d0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
a1e0: 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
a1f0: 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  b(p);.    memcpy
a200: 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
a210: 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
a220: 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
a230: 31 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  1;.    data.mode
a240: 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
a250: 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74      data.colWidt
a260: 68 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61  h[0] = 3;.    da
a270: 74 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d  ta.colWidth[1] =
a280: 20 31 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f   15;.    data.co
a290: 6c 57 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a  lWidth[2] = 58;.
a2a0: 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30      data.cnt = 0
a2b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
a2c0: 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
a2d0: 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b  A database_list;
a2e0: 20 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64   ", callback, &d
a2f0: 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
a300: 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
a310: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
a320: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
a330: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
a340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a350: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
a360: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
a370: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
a380: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63   c=='d' && strnc
a390: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75  mp(azArg[0], "du
a3a0: 6d 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  mp", n)==0 && nA
a3b0: 72 67 3c 33 20 29 7b 0a 20 20 20 20 63 68 61 72  rg<3 ){.    char
a3c0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
a3d0: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
a3e0: 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69     /* When playi
a3f0: 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22  ng back a "dump"
a400: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69  , the content mi
a410: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e  ght appear in an
a420: 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68   order.    ** wh
a430: 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64  ich causes immed
a440: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
a450: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
a460: 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20  be violated..   
a470: 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66   ** So disable f
a480: 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74  oreign-key const
a490: 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
a4a0: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f  t to prevent pro
a4b0: 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 70  blems. */.    fp
a4c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
a4d0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
a4e0: 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ys=OFF;\n");.   
a4f0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
a500: 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54   "BEGIN TRANSACT
a510: 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  ION;\n");.    p-
a520: 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
a530: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
a540: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
a550: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
a560: 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
a570: 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
a580: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==1 ){.      run
a590: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
a5a0: 72 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22  ry(p, .        "
a5b0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
a5c0: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
a5d0: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
a5e0: 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
a5f0: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
a600: 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
a610: 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
a620: 65 6e 63 65 27 22 2c 20 30 0a 20 20 20 20 20 20  ence'", 0.      
a630: 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
a640: 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
a650: 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
a660: 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
a670: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
a680: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
a690: 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
a6a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 2c  lite_sequence'",
a6b0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
a6c0: 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
a6d0: 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70  _query(p->out, p
a6e0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53  ->db,.        "S
a6f0: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
a700: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
a710: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
a720: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
a730: 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
a740: 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
a750: 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
a760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a770: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
a780: 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
a790: 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  +){.        zShe
a7a0: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
a7b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 72 75 6e  [i];.        run
a7c0: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
a7d0: 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20  ry(p,.          
a7e0: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
a7f0: 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
a800: 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
a810: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
a820: 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
a830: 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79  lstatic() AND ty
a840: 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
a850: 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
a860: 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 30 29 3b  l NOT NULL", 0);
a870: 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 74 61 62  .        run_tab
a880: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d  le_dump_query(p-
a890: 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a 20 20 20  >out, p->db,.   
a8a0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
a8b0: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
a8c0: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
a8d0: 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
a8e0: 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20   NULL".         
a8f0: 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
a900: 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
a910: 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
a920: 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
a930: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
a940: 73 74 61 74 69 63 28 29 22 2c 20 30 0a 20 20 20  static()", 0.   
a950: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
a960: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30  zShellStatic = 0
a970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a980: 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
a990: 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
a9a0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
a9b0: 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
a9c0: 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
a9d0: 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
a9e0: 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
a9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
aa00: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
aa10: 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
aa20: 5f 73 63 68 65 6d 61 3d 4f 46 46 22 2c 20 30 2c  _schema=OFF", 0,
aa30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
aa40: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
aa50: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
aa60: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
aa70: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
aa80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
aa90: 4d 73 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Msg);.    }else{
aaa0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
aab0: 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b 5c  ->out, "COMMIT;\
aac0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n");.    }.  }el
aad0: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
aae0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
aaf0: 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29  g[0], "echo", n)
ab00: 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26  ==0 && nArg>1 &&
ab10: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 70   nArg<3 ){.    p
ab20: 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65  ->echoOn = boole
ab30: 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
ab40: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
ab50: 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
ab60: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
ab70: 78 69 74 22 2c 20 6e 29 3d 3d 30 20 20 26 26 20  xit", n)==0  && 
ab80: 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 72  nArg==1 ){.    r
ab90: 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
aba0: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
abb0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
abc0: 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d  , "explain", n)=
abd0: 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a  =0 && nArg<3 ){.
abe0: 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 6e 41      int val = nA
abf0: 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56  rg>=2 ? booleanV
ac00: 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a  alue(azArg[1]) :
ac10: 20 31 3b 0a 20 20 20 20 69 66 28 76 61 6c 20 3d   1;.    if(val =
ac20: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69 66 28  = 1) {.      if(
ac30: 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e  !p->explainPrev.
ac40: 76 61 6c 69 64 29 20 7b 0a 20 20 20 20 20 20 20  valid) {.       
ac50: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
ac60: 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  valid = 1;.     
ac70: 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65     p->explainPre
ac80: 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  v.mode = p->mode
ac90: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70  ;.        p->exp
aca0: 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61  lainPrev.showHea
acb0: 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61  der = p->showHea
acc0: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  der;.        mem
acd0: 63 70 79 28 70 2d 3e 65 78 70 6c 61 69 6e 50 72  cpy(p->explainPr
ace0: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 63  ev.colWidth,p->c
acf0: 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70  olWidth,sizeof(p
ad00: 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20  ->colWidth));.  
ad10: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 57      }.      /* W
ad20: 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68 69 73  e could put this
ad30: 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68 65 20   code under the 
ad40: 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c 69 64  !p->explainValid
ad50: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  .      ** condit
ad60: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 64  ion so that it d
ad70: 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74 65 20  oes not execute 
ad80: 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
ad90: 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  y in.      ** ex
ada0: 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f 77 65  plain mode. Howe
adb0: 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78 65 63  ver, always exec
adc0: 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77 73 20  uting it allows 
add0: 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20 20 20  us an easy.     
ade0: 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73 65 74   ** was to reset
adf0: 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65   to explain mode
ae00: 20 69 6e 20 63 61 73 65 20 74 68 65 20 75 73 65   in case the use
ae10: 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  r previously.   
ae20: 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e 65 78     ** did an .ex
ae30: 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  plain followed b
ae40: 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d 6f 64  y a .width, .mod
ae50: 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20 20 20  e or .header.   
ae60: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20     ** command.. 
ae70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
ae80: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
ae90: 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 73  lain;.      p->s
aea0: 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20  howHeader = 1;. 
aeb0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 63       memset(p->c
aec0: 6f 6c 57 69 64 74 68 2c 30 2c 41 72 72 61 79 53  olWidth,0,ArrayS
aed0: 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
aee0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  );.      p->colW
aef0: 69 64 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20  idth[0] = 4;    
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af10: 20 61 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70   addr */.      p
af20: 2d 3e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20  ->colWidth[1] = 
af30: 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  13;             
af40: 20 20 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f      /* opcode */
af50: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
af60: 74 68 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[2] = 4;      
af70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
af80: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  1 */.      p->co
af90: 6c 57 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20  lWidth[3] = 4;  
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70  /* P2 */.      p
afc0: 2d 3e 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20  ->colWidth[4] = 
afd0: 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4;              
afe0: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
aff0: 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35     p->colWidth[5
b000: 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20  ] = 13;         
b010: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
b020: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
b030: 74 68 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20  th[6] = 2;      
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b050: 35 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  5 */.      p->co
b060: 6c 57 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20  lWidth[7] = 13; 
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
b090: 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e     }else if (p->
b0a0: 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69  explainPrev.vali
b0b0: 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  d) {.      p->ex
b0c0: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
b0d0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  = 0;.      p->mo
b0e0: 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50  de = p->explainP
b0f0: 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rev.mode;.      
b100: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
b110: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73  p->explainPrev.s
b120: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
b130: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69   memcpy(p->colWi
b140: 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72  dth,p->explainPr
b150: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  ev.colWidth,size
b160: 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
b170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
b180: 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
b190: 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
b1a0: 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29  0], "header", n)
b1b0: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
b1c0: 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28          strncmp(
b1d0: 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
b1e0: 72 73 22 2c 20 6e 29 3d 3d 30 29 20 26 26 20 6e  rs", n)==0) && n
b1f0: 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20  Arg>1 && nArg<3 
b200: 29 7b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  ){.    p->showHe
b210: 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
b220: 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
b230: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
b240: 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
b250: 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
b260: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , n)==0 ){.    f
b270: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
b280: 73 22 2c 7a 48 65 6c 70 29 3b 0a 20 20 20 20 69  s",zHelp);.    i
b290: 66 28 20 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a  f( HAS_TIMER ){.
b2a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
b2b0: 64 65 72 72 2c 22 25 73 22 2c 7a 54 69 6d 65 72  derr,"%s",zTimer
b2c0: 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Help);.    }.  }
b2d0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
b2e0: 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
b2f0: 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22  Arg[0], "import"
b300: 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
b310: 3d 33 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =3 ){.    char *
b320: 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32  zTable = azArg[2
b330: 5d 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ];    /* Insert 
b340: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
b350: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
b360: 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
b370: 31 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 66  1];     /* The f
b380: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
b390: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
b3a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
b3b0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
b3c0: 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
b3d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
b3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b400: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
b410: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
b420: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b440: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
b450: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
b460: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
b490: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
b4a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b4b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b4c0: 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65 70   bytes in p->sep
b4d0: 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
b4e0: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b500: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
b510: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69  */.    char *zLi
b520: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
b530: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
b540: 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f  ine of input fro
b550: 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  m the file */.  
b560: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20    char **azCol; 
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b580: 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20   zLine[] broken 
b590: 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20  up into columns 
b5a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  */.    char *zCo
b5b0: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
b5c0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d     /* How to com
b5d0: 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 20 20  mit changes */  
b5e0: 20 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20   .    FILE *in; 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
b610: 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
b620: 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
b630: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
b640: 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
b650: 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e  ile */..    open
b660: 5f 64 62 28 70 29 3b 0a 20 20 20 20 6e 53 65 70  _db(p);.    nSep
b670: 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73   = strlen30(p->s
b680: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69  eparator);.    i
b690: 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
b6a0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b6b0: 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  rr, "Error: non-
b6c0: 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
b6d0: 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
b6e0: 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
b6f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
b700: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
b710: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
b720: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
b730: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
b740: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
b750: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b760: 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
b770: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
b780: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b790: 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
b7a0: 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
b7b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
b7c0: 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53  repare(p->db, zS
b7d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
b7e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
b7f0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
b800: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
b810: 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
b820: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
b830: 74 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  t);.      fprint
b840: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
b850: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
b860: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
b870: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b880: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
b890: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
b8a0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
b8b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b8c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
b8d0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
b8e0: 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
b8f0: 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
b900: 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
b910: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
b920: 20 6e 42 79 74 65 20 2b 20 32 30 20 2b 20 6e 43   nByte + 20 + nC
b930: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
b940: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
b950: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b960: 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
b970: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
b980: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b990: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
b9a0: 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
b9b0: 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
b9c0: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
b9d0: 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
b9e0: 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
b9f0: 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
ba00: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
ba10: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
ba20: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
ba30: 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
ba40: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
ba50: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
ba60: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
ba70: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
ba80: 72 65 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  re(p->db, zSql, 
ba90: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
baa0: 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
bab0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
bac0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
bad0: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
bae0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
baf0: 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  g(db));.      if
bb00: 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
bb10: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
bb20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
bb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
bb40: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
bb50: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
bb60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
bb70: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
bb80: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
bb90: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
bba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bbb0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
bbc0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
bbd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
bbe0: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  l = malloc( size
bbf0: 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43  of(azCol[0])*(nC
bc00: 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  ol+1) );.    if(
bc10: 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
bc20: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
bc30: 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
bc40: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
bc50: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
bc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
bc70: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
bc80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
bc90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bca0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
bcb0: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
bcc0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
bcd0: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
bce0: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
bcf0: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
bd00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
bd10: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
bd20: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
bd30: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
bd40: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
bd50: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
bd60: 6e 65 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  ne; *z && *z!='\
bd70: 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 3b 20  n' && *z!='\r'; 
bd80: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
bd90: 28 20 2a 7a 3d 3d 70 2d 3e 73 65 70 61 72 61 74  ( *z==p->separat
bda0: 6f 72 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  or[0] && strncmp
bdb0: 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  (z, p->separator
bdc0: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
bdd0: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
bde0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
bdf0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
be00: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
be10: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
be20: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
be30: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
be40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
be50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
be60: 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * end for */.   
be70: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
be80: 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
be90: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
bea0: 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
beb0: 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
bec0: 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78  : %s line %d: ex
bed0: 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
bee0: 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f  s of data but fo
bef0: 75 6e 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  und %d\n",.     
bf00: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
bf10: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
bf20: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  i+1);.        zC
bf30: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
bf40: 4b 22 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  K";.        free
bf50: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
bf60: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
bf70: 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
bf80: 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d  while */.      }
bf90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
bfa0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
bfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
bfc0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
bfd0: 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
bfe0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
bff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c000: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
c010: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
c020: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
c030: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
c040: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
c050: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c060: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
c070: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
c080: 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
c090: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
c0a0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
c0b0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
c0c0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
c0d0: 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
c0e0: 72 6f 6d 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20  rom while */.   
c0f0: 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
c100: 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 66  d while */.    f
c110: 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
c120: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
c130: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c140: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
c150: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
c160: 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
c170: 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  0);.  }else..  i
c180: 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
c190: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
c1a0: 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20  indices", n)==0 
c1b0: 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  && nArg<3 ){.   
c1c0: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
c1d0: 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20  _data data;.    
c1e0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
c1f0: 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
c200: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
c210: 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
c220: 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
c230: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
c240: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
c250: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 69  MODE_List;.    i
c260: 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
c270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c280: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
c290: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
c2a0: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
c2b0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
c2c0: 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
c2d0: 78 27 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20  x' AND name NOT 
c2e0: 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20  LIKE 'sqlite_%' 
c2f0: 22 0a 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e  ".        "UNION
c300: 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22   ALL ".        "
c310: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
c320: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
c330: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
c340: 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
c350: 27 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44  ' ".        "ORD
c360: 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
c370: 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
c380: 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20  a, &zErrMsg.    
c390: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
c3a0: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
c3b0: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
c3c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c3d0: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
c3e0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
c3f0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
c400: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
c410: 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
c420: 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
c430: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
c440: 63 28 29 20 22 0a 20 20 20 20 20 20 20 20 22 55  c() ".        "U
c450: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
c460: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
c470: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
c480: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
c490: 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 69    "WHERE type='i
c4a0: 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
c4b0: 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61  me LIKE shellsta
c4c0: 74 69 63 28 29 20 22 0a 20 20 20 20 20 20 20 20  tic() ".        
c4d0: 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20  "ORDER BY 1",.  
c4e0: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
c4f0: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
c500: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
c510: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
c520: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
c530: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
c540: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c550: 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
c560: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
c570: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
c580: 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
c590: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
c5a0: 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
c5b0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
c5c0: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
c5d0: 20 71 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65   querying sqlite
c5e0: 5f 6d 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69  _master and sqli
c5f0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e  te_temp_master\n
c600: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
c610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
c620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c630: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20  NABLE_IOTRACE.  
c640: 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
c650: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
c660: 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30  "iotrace", n)==0
c670: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
c680: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
c690: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
c6a0: 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28  *, ...);.    if(
c6b0: 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72   iotrace && iotr
c6c0: 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63  ace!=stdout ) fc
c6d0: 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20  lose(iotrace);. 
c6e0: 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a     iotrace = 0;.
c6f0: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
c700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
c710: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
c720: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
c730: 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d  (azArg[1], "-")=
c740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c750: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74  te3IoTrace = iot
c760: 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20  racePrintf;.    
c770: 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f    iotrace = stdo
c780: 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
c790: 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66       iotrace = f
c7a0: 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
c7b0: 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  w");.      if( i
c7c0: 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20  otrace==0 ){.   
c7d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
c7e0: 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
c7f0: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
c800: 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
c810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f         sqlite3Io
c820: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
c830: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
c840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c850: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
c860: 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
c870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c880: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69  }else.#endif..#i
c890: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c8a0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
c8b0: 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
c8c0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
c8d0: 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30  ], "load", n)==0
c8e0: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
c8f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c900: 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20  File, *zProc;.  
c910: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
c920: 3d 20 30 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  = 0;.    zFile =
c930: 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
c940: 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
c950: 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
c960: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
c970: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c980: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
c990: 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
c9a0: 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
c9b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c9c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70  E_OK ){.      fp
c9d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
c9e0: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
c9f0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
ca00: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
ca10: 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
ca20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
ca30: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
ca40: 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='l' && strncmp(
ca50: 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c  azArg[0], "log",
ca60: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d   n)==0 && nArg>=
ca70: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
ca80: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41  har *zFile = azA
ca90: 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70  rg[1];.    if( p
caa0: 2d 3e 70 4c 6f 67 20 26 26 20 70 2d 3e 70 4c 6f  ->pLog && p->pLo
cab0: 67 21 3d 73 74 64 6f 75 74 20 26 26 20 70 2d 3e  g!=stdout && p->
cac0: 70 4c 6f 67 21 3d 73 74 64 65 72 72 20 29 7b 0a  pLog!=stderr ){.
cad0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e        fclose(p->
cae0: 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pLog);.      p->
caf0: 70 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pLog = 0;.    }.
cb00: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
cb10: 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
cb20: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  0 ){.      p->pL
cb30: 6f 67 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  og = stdout;.   
cb40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
cb50: 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
cb60: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
cb70: 2d 3e 70 4c 6f 67 20 3d 20 73 74 64 65 72 72 3b  ->pLog = stderr;
cb80: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
cb90: 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66  trcmp(zFile, "of
cba0: 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f")==0 ){.      
cbb0: 70 2d 3e 70 4c 6f 67 20 3d 20 30 3b 0a 20 20 20  p->pLog = 0;.   
cbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
cbd0: 3e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 46  >pLog = fopen(zF
cbe0: 69 6c 65 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  ile, "w");.     
cbf0: 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20   if( p->pLog==0 
cc00: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
cc10: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
cc20: 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
cc30: 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
cc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cc50: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
cc60: 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70  =='m' && strncmp
cc70: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65  (azArg[0], "mode
cc80: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
cc90: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==2 ){.    int n
cca0: 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 = strlen30(azA
ccb0: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
ccc0: 28 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d  (n2==4 && strncm
ccd0: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65  p(azArg[1],"line
cce0: 22 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  ",n2)==0).      
ccf0: 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 6e 32    ||.        (n2
cd00: 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==5 && strncmp(a
cd10: 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c  zArg[1],"lines",
cd20: 6e 32 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  n2)==0) ){.     
cd30: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
cd40: 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Line;.    }else 
cd50: 69 66 28 20 28 6e 32 3d 3d 36 20 26 26 20 73 74  if( (n2==6 && st
cd60: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
cd70: 63 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 29 0a  column",n2)==0).
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
cd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
cda0: 6e 32 3d 3d 37 20 26 26 20 73 74 72 6e 63 6d 70  n2==7 && strncmp
cdb0: 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
cdc0: 6e 73 22 2c 6e 32 29 3d 3d 30 29 20 29 7b 0a 20  ns",n2)==0) ){. 
cdd0: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
cde0: 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
cdf0: 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20  }else if( n2==4 
ce00: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
ce10: 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
ce20: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
ce30: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
ce40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32      }else if( n2
ce50: 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==4 && strncmp(a
ce60: 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e  zArg[1],"html",n
ce70: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
ce80: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74  ->mode = MODE_Ht
ce90: 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ml;.    }else if
cea0: 28 20 6e 32 3d 3d 33 20 26 26 20 73 74 72 6e 63  ( n2==3 && strnc
ceb0: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c  mp(azArg[1],"tcl
cec0: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
ced0: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
cee0: 5f 54 63 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  _Tcl;.    }else 
cef0: 69 66 28 20 6e 32 3d 3d 33 20 26 26 20 73 74 72  if( n2==3 && str
cf00: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
cf10: 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
cf20: 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
cf30: 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
cf40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
cf50: 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74  izeof(p->separat
cf60: 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  or), p->separato
cf70: 72 2c 20 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c  r, ",");.    }el
cf80: 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26 20  se if( n2==4 && 
cf90: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
cfa0: 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29  ,"tabs",n2)==0 )
cfb0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
cfc0: 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
cfd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
cfe0: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65  ntf(sizeof(p->se
cff0: 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70  parator), p->sep
d000: 61 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20  arator, "\t");. 
d010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d     }else if( n2=
d020: 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =6 && strncmp(az
d030: 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
d040: 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
d050: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
d060: 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
d070: 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22  _table_name(p, "
d080: 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c  table");.    }el
d090: 73 65 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  se {.      fprin
d0a0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
d0b0: 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  : mode should be
d0c0: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
d0d0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63 73 76 20      "column csv 
d0e0: 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
d0f0: 20 6c 69 73 74 20 74 61 62 73 20 74 63 6c 5c 6e   list tabs tcl\n
d100: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
d110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
d120: 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26  .  if( c=='m' &&
d130: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
d140: 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30  ], "mode", n)==0
d150: 20 26 26 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20   && nArg==3 ){. 
d160: 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c     int n2 = strl
d170: 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
d180: 20 20 20 20 69 66 28 20 6e 32 3d 3d 36 20 26 26      if( n2==6 &&
d190: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
d1a0: 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d  ],"insert",n2)==
d1b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
d1c0: 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
d1d0: 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c  ;.      set_tabl
d1e0: 65 5f 6e 61 6d 65 28 70 2c 20 61 7a 41 72 67 5b  e_name(p, azArg[
d1f0: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b  2]);.    }else {
d200: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
d210: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
d220: 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
d230: 3a 20 22 0a 20 20 20 20 20 20 20 20 22 20 5c 22  : ".        " \"
d240: 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68  %s\". Enter \".h
d250: 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e  elp\" for help\n
d260: 22 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ", azArg[2]);.  
d270: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d280: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
d290: 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
d2a0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
d2b0: 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
d2c0: 26 26 20 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20  && nArg==2 ) {. 
d2d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
d2e0: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
d2f0: 6c 6c 76 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llvalue), p->nul
d300: 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lvalue,.        
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
d320: 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
d330: 69 7a 65 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  ize(p->nullvalue
d340: 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
d350: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
d360: 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70  =='o' && strncmp
d370: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
d380: 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ut", n)==0 && nA
d390: 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  rg==2 ){.    if(
d3a0: 20 70 2d 3e 6f 75 74 21 3d 73 74 64 6f 75 74 20   p->out!=stdout 
d3b0: 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  ){.      fclose(
d3c0: 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  p->out);.    }. 
d3d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
d3e0: 41 72 67 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29  Arg[1],"stdout")
d3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
d400: 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
d410: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d420: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
d430: 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
d440: 69 6c 65 2c 20 22 73 74 64 6f 75 74 22 29 3b 0a  ile, "stdout");.
d450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d460: 20 70 2d 3e 6f 75 74 20 3d 20 66 6f 70 65 6e 28   p->out = fopen(
d470: 61 7a 41 72 67 5b 31 5d 2c 20 22 77 62 22 29 3b  azArg[1], "wb");
d480: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
d490: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
d4a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
d4b0: 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
d4c0: 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
d4d0: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
d4e0: 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
d4f0: 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
d500: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c   = 1;.      } el
d510: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 73 71  se {.         sq
d520: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
d530: 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
d540: 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
d550: 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  %s", azArg[1]);.
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d570: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
d580: 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
d590: 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
d5a0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72  ", n)==0 && (nAr
d5b0: 67 3d 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29  g==2 || nArg==3)
d5c0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
d5d0: 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
d5e0: 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
d5f0: 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
d600: 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
d610: 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
d620: 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
d630: 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
d640: 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
d650: 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
d660: 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
d670: 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
d680: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
d690: 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
d6a0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
d6b0: 75 69 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  uit", n)==0 && n
d6c0: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63  Arg==1 ){.    rc
d6d0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
d6e0: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
d6f0: 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
d700: 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c  zArg[0], "read",
d710: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
d720: 32 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61  2 ){.    FILE *a
d730: 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  lt = fopen(azArg
d740: 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  [1], "rb");.    
d750: 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20  if( alt==0 ){.  
d760: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d770: 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
d780: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
d790: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
d7a0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
d7b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d7c0: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
d7d0: 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
d7e0: 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
d7f0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
d800: 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
d810: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
d820: 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e  0], "restore", n
d830: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26  )==0 && nArg>1 &
d840: 26 20 6e 41 72 67 3c 34 29 7b 0a 20 20 20 20 63  & nArg<4){.    c
d850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
d860: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
d870: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71  har *zDb;.    sq
d880: 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20  lite3 *pSrc;.   
d890: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
d8a0: 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
d8b0: 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  t nTimeout = 0;.
d8c0: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
d8d0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69   ){.      zSrcFi
d8e0: 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
d8f0: 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e       zDb = "main
d900: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
d910: 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
d920: 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a  zArg[2];.      z
d930: 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  Db = azArg[1];. 
d940: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
d950: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46  lite3_open(zSrcF
d960: 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20  ile, &pSrc);.   
d970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d980: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  OK ){.      fpri
d990: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
d9a0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
d9b0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46  \"%s\"\n", zSrcF
d9c0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
d9d0: 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
d9e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
da00: 64 62 28 70 29 3b 0a 20 20 20 20 70 42 61 63 6b  db(p);.    pBack
da10: 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
da20: 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  kup_init(p->db, 
da30: 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  zDb, pSrc, "main
da40: 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
da50: 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
da60: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
da70: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
da80: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
da90: 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  >db));.      sql
daa0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
dab0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
dac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
dad0: 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
dae0: 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
daf0: 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
db00: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
db10: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
db20: 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28  SY  ){.      if(
db30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
db40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
db50: 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
db60: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
db70: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
db80: 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
db90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
dba0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
dbb0: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
dbc0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
dbd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
dbe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
dbf0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
dc00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
dc10: 45 44 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ED ){.      fpri
dc20: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
dc30: 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
dc40: 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
dc50: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
dc60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dc70: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
dc80: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
dc90: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
dca0: 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20  >db));.      rc 
dcb0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
dcc0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
dcd0: 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  c);.  }else..  i
dce0: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
dcf0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
dd00: 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 26  schema", n)==0 &
dd10: 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
dd20: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
dd30: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
dd40: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
dd50: 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ;.    open_db(p)
dd60: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
dd70: 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
dd80: 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
dd90: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
dda0: 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
ddb0: 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
ddc0: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
ddd0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
dde0: 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d  or(i=0; azArg[1]
ddf0: 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b  [i]; i++) azArg[
de00: 31 5d 5b 69 5d 20 3d 20 28 63 68 61 72 29 74 6f  1][i] = (char)to
de10: 6c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d 5b 69  lower(azArg[1][i
de20: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
de30: 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73  rcmp(azArg[1],"s
de40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d  qlite_master")==
de50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
de60: 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
de70: 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
de80: 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
de90: 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c  ] = "CREATE TABL
dea0: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
deb0: 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
dec0: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
ded0: 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
df00: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
df10: 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
df20: 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
df50: 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
df80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df90: 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20         ")";.    
dfa0: 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
dfb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
dfc0: 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
dfd0: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
dfe0: 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
dff0: 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
e000: 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
e010: 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
e020: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
e030: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  K;.      }else i
e040: 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
e050: 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  1],"sqlite_temp_
e060: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
e070: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
e080: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
e090: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
e0a0: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
e0b0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
e0c0: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
e0d0: 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20  ter (\n".       
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e0f0: 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a    type text,\n".
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65        "  name te
e120: 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
e140: 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e  tbl_name text,\n
e150: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
e160: 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70          "  rootp
e170: 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a  age integer,\n".
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78        "  sql tex
e1a0: 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  t\n".           
e1b0: 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a             ")";.
e1c0: 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
e1d0: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
e1e0: 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22   new_colv[0] = "
e1f0: 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65  sql";.        ne
e200: 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_colv[1] = 0;. 
e210: 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28         callback(
e220: 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72  &data, 1, new_ar
e230: 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20  gv, new_colv);. 
e240: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e250: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
e260: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  se{.        zShe
e270: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
e280: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20  [1];.        rc 
e290: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
e2a0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
e2b0: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
e2c0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20   ".          "  
e2d0: 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
e2e0: 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
e2f0: 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
e300: 61 6d 65 20 6e 61 6d 65 22 0a 20 20 20 20 20 20  ame name".      
e310: 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
e320: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
e330: 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20  ON ALL".        
e340: 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
e350: 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
e360: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  , name FROM sqli
e370: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
e380: 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
e390: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  RE tbl_name LIKE
e3a0: 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41   shellstatic() A
e3b0: 4e 44 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  ND type!='meta' 
e3c0: 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
e3d0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44  ".          "ORD
e3e0: 45 52 20 42 59 20 73 75 62 73 74 72 28 74 79 70  ER BY substr(typ
e3f0: 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20  e,2,1), name",. 
e400: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
e410: 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
e420: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68  sg);.        zSh
e430: 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
e440: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e450: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e460: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
e470: 0a 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  .         "SELEC
e480: 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20  T sql FROM ".   
e490: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
e4a0: 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74   sql sql, type t
e4b0: 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62  ype, tbl_name tb
e4c0: 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d  l_name, name nam
e4d0: 65 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20  e".         "   
e4e0: 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
e4f0: 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
e500: 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c           "   SEL
e510: 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
e520: 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 46 52  bl_name, name FR
e530: 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
e540: 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
e550: 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
e560: 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
e570: 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e  TNULL AND name N
e580: 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
e590: 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f 52  %'".         "OR
e5a0: 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74 79  DER BY substr(ty
e5b0: 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a  pe,2,1), name",.
e5c0: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
e5d0: 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
e5e0: 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
e5f0: 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
e600: 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
e610: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
e620: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
e630: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e640: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
e650: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
e660: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21    }else if( rc !
e670: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
e680: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
e690: 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
e6a0: 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f  ying schema info
e6b0: 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20  rmation\n");.   
e6c0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
e6e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
e6f0: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
e700: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
e710: 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
e720: 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
e730: 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =2 ){.    sqlite
e740: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
e750: 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c  f(p->separator),
e760: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 0a 20   p->separator,. 
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
e790: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72  )sizeof(p->separ
e7a0: 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31  ator)-1, azArg[1
e7b0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ]);.  }else..  i
e7c0: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
e7d0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
e7e0: 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 26 26 20  show", n)==0 && 
e7f0: 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 69  nArg==1 ){.    i
e800: 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e 74  nt i;.    fprint
e810: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
e820: 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70   %s\n","echo", p
e830: 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20  ->echoOn ? "on" 
e840: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
e850: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
e860: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  .9s: %s\n","expl
e870: 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e  ain", p->explain
e880: 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e  Prev.valid ? "on
e890: 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66  " :"off");.    f
e8a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
e8b0: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61  9.9s: %s\n","hea
e8c0: 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65  ders", p->showHe
e8d0: 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  ader ? "on" : "o
e8e0: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
e8f0: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
e900: 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
e910: 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
e920: 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
e930: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
e940: 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
e950: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e960: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
e970: 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
e980: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
e990: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
e9a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
e9b0: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  .9s: %s\n","outp
e9c0: 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
e9d0: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74   strlen30(p->out
e9e0: 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69  file) ? p->outfi
e9f0: 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a  le : "stdout");.
ea00: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
ea10: 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 73  ut,"%9.9s: ", "s
ea20: 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20  eparator");.    
ea30: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
ea40: 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70  g(p->out, p->sep
ea50: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66  arator);.      f
ea60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ea70: 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  \n");.    fprint
ea80: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
ea90: 20 22 2c 22 77 69 64 74 68 22 29 3b 0a 20 20 20   ","width");.   
eaa0: 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74   for (i=0;i<(int
eab0: 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  )ArraySize(p->co
eac0: 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f  lWidth) && p->co
ead0: 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69  lWidth[i] != 0;i
eae0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66 70 72 69  ++) {.      fpri
eaf0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 64 20 22  ntf(p->out,"%d "
eb00: 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29  ,p->colWidth[i])
eb10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
eb20: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
eb30: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
eb40: 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26   c=='t' && n>1 &
eb50: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
eb60: 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29  0], "tables", n)
eb70: 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
eb80: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  .    char **azRe
eb90: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52  sult;.    int nR
eba0: 6f 77 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ow;.    char *zE
ebb0: 72 72 4d 73 67 3b 0a 20 20 20 20 6f 70 65 6e 5f  rrMsg;.    open_
ebc0: 64 62 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e  db(p);.    if( n
ebd0: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
ebe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
ebf0: 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20  _table(p->db,.  
ec00: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
ec10: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
ec20: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
ec30: 22 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28  "WHERE type IN (
ec40: 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20  'table','view') 
ec50: 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
ec60: 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20  E 'sqlite_%' ". 
ec70: 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c         "UNION AL
ec80: 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c  L ".        "SEL
ec90: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
eca0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
ecb0: 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
ecc0: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
ecd0: 65 27 2c 27 76 69 65 77 27 29 20 22 0a 20 20 20  e','view') ".   
ece0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31       "ORDER BY 1
ecf0: 22 2c 0a 20 20 20 20 20 20 20 20 26 61 7a 52 65  ",.        &azRe
ed00: 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20  sult, &nRow, 0, 
ed10: 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29  &zErrMsg.      )
ed20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ed30: 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20     zShellStatic 
ed40: 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
ed50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
ed60: 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a  et_table(p->db,.
ed70: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
ed80: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
ed90: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
eda0: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
edb0: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
edc0: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
edd0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
ede0: 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
edf0: 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
ee00: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
ee10: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
ee20: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
ee30: 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
ee40: 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20  le','view') AND 
ee50: 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
ee60: 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20  tatic() ".      
ee70: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
ee80: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
ee90: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
eea0: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
eeb0: 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
eec0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
eed0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
eee0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
eef0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
ef00: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
ef10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ef20: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
ef30: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
ef40: 73 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c  se if( rc != SQL
ef50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ef60: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
ef70: 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
ef80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
ef90: 64 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  d sqlite_temp_ma
efa0: 73 74 65 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ster\n");.      
efb0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
efc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e{.      int len
efd0: 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20 20  , maxlen = 0;.  
efe0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
eff0: 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74 43 6f      int nPrintCo
f000: 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20 20  l, nPrintRow;.  
f010: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
f020: 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
f030: 20 20 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74      if( azResult
f040: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
f050: 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  e;.        len =
f060: 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75   strlen30(azResu
f070: 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lt[i]);.        
f080: 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29  if( len>maxlen )
f090: 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20   maxlen = len;. 
f0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72       }.      nPr
f0b0: 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78  intCol = 80/(max
f0c0: 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  len+2);.      if
f0d0: 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20  ( nPrintCol<1 ) 
f0e0: 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20  nPrintCol = 1;. 
f0f0: 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d       nPrintRow =
f100: 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43   (nRow + nPrintC
f110: 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f  ol - 1)/nPrintCo
f120: 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
f130: 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69  ; i<nPrintRow; i
f140: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
f150: 28 6a 3d 69 2b 31 3b 20 6a 3c 3d 6e 52 6f 77 3b  (j=i+1; j<=nRow;
f160: 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a   j+=nPrintRow){.
f170: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
f180: 7a 53 70 20 3d 20 6a 3c 3d 6e 50 72 69 6e 74 52  zSp = j<=nPrintR
f190: 6f 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a  ow ? "" : "  ";.
f1a0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
f1b0: 28 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70 2c 20  ("%s%-*s", zSp, 
f1c0: 6d 61 78 6c 65 6e 2c 20 61 7a 52 65 73 75 6c 74  maxlen, azResult
f1d0: 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a  [j] ? azResult[j
f1e0: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
f1f0: 20 7d 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74   }.        print
f200: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  f("\n");.      }
f210: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f220: 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 7a  e3_free_table(az
f230: 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65  Result);.  }else
f240: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
f250: 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70  & n>4 && strncmp
f260: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65  (azArg[0], "time
f270: 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  out", n)==0 && n
f280: 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 6f 70  Arg==2 ){.    op
f290: 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 73 71  en_db(p);.    sq
f2a0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
f2b0: 75 74 28 70 2d 3e 64 62 2c 20 61 74 6f 69 28 61  ut(p->db, atoi(a
f2c0: 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65 6c  zArg[1]));.  }el
f2d0: 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20 48 41  se.    .  if( HA
f2e0: 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d 27 74  S_TIMER && c=='t
f2f0: 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72  ' && n>=5 && str
f300: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
f310: 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 26 26  timer", n)==0 &&
f320: 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
f330: 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f  enableTimer = bo
f340: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
f350: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  [1]);.  }else.  
f360: 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26  .  if( c=='w' &&
f370: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
f380: 5d 2c 20 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d  ], "width", n)==
f390: 30 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20  0 && nArg>1 ){. 
f3a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73     int j;.    as
f3b0: 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61  sert( nArg<=Arra
f3c0: 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a  ySize(azArg) );.
f3d0: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e      for(j=1; j<n
f3e0: 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69  Arg && j<ArraySi
f3f0: 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b  ze(p->colWidth);
f400: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   j++){.      p->
f410: 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20  colWidth[j-1] = 
f420: 61 74 6f 69 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a  atoi(azArg[j]);.
f430: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
f440: 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   {.    fprintf(s
f450: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75  tderr, "Error: u
f460: 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
f470: 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
f480: 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
f490: 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
f4a0: 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
f4b0: 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
f4c0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a     rc = 1;.  }..
f4d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f4e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f4f0: 45 20 69 66 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  E if a semicolon
f500: 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
f510: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 4e 20   in the first N 
f520: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66  characters.** of
f530: 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a   string z[]..*/.
f540: 73 74 61 74 69 63 20 69 6e 74 20 5f 63 6f 6e 74  static int _cont
f550: 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63  ains_semicolon(c
f560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
f570: 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
f580: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
f590: 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ++){  if( z[i]==
f5a0: 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20  ';' ) return 1; 
f5b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f5c0: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
f5d0: 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e  ee if a line con
f5e0: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
f5f0: 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  f whitespace..*/
f600: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c  .static int _all
f610: 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
f620: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f  t char *z){.  fo
f630: 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  r(; *z; z++){.  
f640: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 2a 28    if( isspace(*(
f650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
f660: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
f670: 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26    if( *z=='/' &&
f680: 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[1]=='*' ){.  
f690: 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
f6a0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 28    while( *z && (
f6b0: 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21  *z!='*' || z[1]!
f6c0: 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  ='/') ){ z++; }.
f6d0: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20        if( *z==0 
f6e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
f6f0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e    z++;.      con
f700: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
f710: 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26 20   if( *z=='-' && 
f720: 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]=='-' ){.   
f730: 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
f740: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
f750: 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d  !='\n' ){ z++; }
f760: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
f770: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
f780: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
f790: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
f7a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
f7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f7c0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69 6e   TRUE if the lin
f7d0: 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61 6e  e typed in is an
f7e0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65 72   SQL command ter
f7f0: 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a 2a  minator other.**
f800: 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f 6c   than a semi-col
f810: 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65 72  on.  The SQL Ser
f820: 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20 63  ver style "go" c
f830: 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72 73  ommand is unders
f840: 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74 68  tood.** as is th
f850: 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f  e Oracle "/"..*/
f860: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69 73 5f  .static int _is_
f870: 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
f880: 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
f890: 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  Line){.  while( 
f8a0: 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
f8b0: 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65 29 20  ed char*)zLine) 
f8c0: 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20  ){ zLine++; };. 
f8d0: 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
f8e0: 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  /' && _all_white
f8f0: 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d 29  space(&zLine[1])
f900: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
f910: 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a  ;  /* Oracle */.
f920: 20 20 7d 0a 20 20 69 66 28 20 74 6f 6c 6f 77 65    }.  if( tolowe
f930: 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27  r(zLine[0])=='g'
f940: 20 26 26 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e   && tolower(zLin
f950: 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20  e[1])=='o'.     
f960: 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74      && _all_whit
f970: 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d  espace(&zLine[2]
f980: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f990: 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65  1;  /* SQL Serve
f9a0: 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  r */.  }.  retur
f9b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
f9c0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53 71  turn true if zSq
f9d0: 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  l is a complete 
f9e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
f9f0: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
fa00: 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74 68  it.** ends in th
fa10: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73 74  e middle of a st
fa20: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72 20  ring literal or 
fa30: 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 2e  C-style comment.
fa40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
fa50: 69 73 5f 63 6f 6d 70 6c 65 74 65 28 63 68 61 72  is_complete(char
fa60: 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 6e 53 71 6c   *zSql, int nSql
fa70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
fa80: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
fa90: 75 72 6e 20 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53  urn 1;.  zSql[nS
faa0: 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20 20 7a 53 71  ql] = ';';.  zSq
fab0: 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20  l[nSql+1] = 0;. 
fac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
fad0: 6d 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a 20 20  mplete(zSql);.  
fae0: 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a  zSql[nSql] = 0;.
faf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fb00: 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
fb10: 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70 72   from *in and pr
fb20: 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a 69  ocess it.  If *i
fb30: 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74 0a  n==0 then input.
fb40: 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69 76  ** is interactiv
fb50: 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73 20  e - the user is 
fb60: 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20 4f  typing it it.  O
fb70: 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74 0a  therwise, input.
fb80: 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
fb90: 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76 69  m a file or devi
fba0: 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69 73  ce.  A prompt is
fbb0: 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73 74   issued and hist
fbc0: 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64 20  ory.** is saved 
fbd0: 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69 73  only if input is
fbe0: 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20 41   interactive.  A
fbf0: 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67 6e  n interrupt sign
fc00: 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73 65  al will.** cause
fc10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
fc20: 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c   exit immediatel
fc30: 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74 20  y, unless input 
fc40: 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  is interactive..
fc50: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
fc60: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
fc70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
fc80: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73   process_input(s
fc90: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
fca0: 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e  ata *p, FILE *in
fcb0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
fcc0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
fcd0: 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
fce0: 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
fcf0: 71 6c 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 63  qlPrior = 0;.  c
fd00: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
fd10: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 72  int rc;.  int er
fd20: 72 43 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rCnt = 0;.  int 
fd30: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 69 6e  lineno = 0;.  in
fd40: 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
fd50: 0a 0a 20 20 77 68 69 6c 65 28 20 65 72 72 43 6e  ..  while( errCn
fd60: 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c 5f 6f 6e  t==0 || !bail_on
fd70: 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e 3d 3d 30  _error || (in==0
fd80: 20 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74   && stdin_is_int
fd90: 65 72 61 63 74 69 76 65 29 20 29 7b 0a 20 20 20  eractive) ){.   
fda0: 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 3b   fflush(p->out);
fdb0: 0a 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29  .    free(zLine)
fdc0: 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20 6f 6e  ;.    zLine = on
fdd0: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a 53 71  e_input_line(zSq
fde0: 6c 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  l, in);.    if( 
fdf0: 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLine==0 ){.    
fe00: 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 57 65 20    break;  /* We 
fe10: 68 61 76 65 20 72 65 61 63 68 65 64 20 45 4f 46  have reached EOF
fe20: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
fe30: 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  ( seenInterrupt 
fe40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21  ){.      if( in!
fe50: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
fe60: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
fe70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
fe80: 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
fe90: 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20 7a 53 71   (zSql==0 || zSq
fea0: 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f 61 6c 6c  l[0]==0) && _all
feb0: 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69 6e  _whitespace(zLin
fec0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
fed0: 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26 26 20     if( zLine && 
fee0: 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26 26  zLine[0]=='.' &&
fef0: 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   nSql==0 ){.    
ff00: 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f 6e 20    if( p->echoOn 
ff10: 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c  ) printf("%s\n",
ff20: 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72   zLine);.      r
ff30: 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
ff40: 61 6e 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a 20  and(zLine, p);. 
ff50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29       if( rc==2 )
ff60: 7b 20 2f 2a 20 65 78 69 74 20 72 65 71 75 65 73  { /* exit reques
ff70: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ted */.        b
ff80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
ff90: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
ffa0: 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20      errCnt++;.  
ffb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
ffc0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
ffd0: 69 66 28 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f  if( _is_command_
ffe0: 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c 69 6e 65  terminator(zLine
fff0: 29 20 26 26 20 5f 69 73 5f 63 6f 6d 70 6c 65 74  ) && _is_complet
10000 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b  e(zSql, nSql) ){
10010 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c  .      memcpy(zL
10020 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20  ine,";",2);.    
10030 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69 6f 72 20  }.    nSqlPrior 
10040 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  = nSql;.    if( 
10050 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
10060 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
10070 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20  r(i=0; zLine[i] 
10080 26 26 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  && isspace((unsi
10090 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b  gned char)zLine[
100a0 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
100b0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 21 3d    if( zLine[i]!=
100c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 71  0 ){.        nSq
100d0 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69  l = strlen30(zLi
100e0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  ne);.        zSq
100f0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 71 6c  l = malloc( nSql
10100 2b 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +3 );.        if
10110 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
10120 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
10130 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
10140 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
10150 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69 74  ;.          exit
10160 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (1);.        }. 
10170 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53         memcpy(zS
10180 71 6c 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c 2b  ql, zLine, nSql+
10190 31 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72  1);.        star
101a0 74 6c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  tline = lineno;.
101b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
101c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e{.      int len
101d0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
101e0 65 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  e);.      zSql =
101f0 20 72 65 61 6c 6c 6f 63 28 20 7a 53 71 6c 2c 20   realloc( zSql, 
10200 6e 53 71 6c 20 2b 20 6c 65 6e 20 2b 20 34 20 29  nSql + len + 4 )
10210 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c  ;.      if( zSql
10220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
10230 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
10240 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
10250 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
10260 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
10270 7d 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6e 53 71  }.      zSql[nSq
10280 6c 2b 2b 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  l++] = '\n';.   
10290 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 71 6c 5b     memcpy(&zSql[
102a0 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65 2c 20 6c 65  nSql], zLine, le
102b0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c  n+1);.      nSql
102c0 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20   += len;.    }. 
102d0 20 20 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f     if( zSql && _
102e0 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c  contains_semicol
102f0 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69  on(&zSql[nSqlPri
10300 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72  or], nSql-nSqlPr
10310 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ior).           
10320 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
10330 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29  complete(zSql) )
10340 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d  {.      p->cnt =
10350 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
10360 62 28 70 29 3b 0a 20 20 20 20 20 20 42 45 47 49  b(p);.      BEGI
10370 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20 72  N_TIMER;.      r
10380 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70  c = shell_exec(p
10390 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c  ->db, zSql, shel
103a0 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  l_callback, p, &
103b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
103c0 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20  END_TIMER;.     
103d0 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
103e0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  sg ){.        ch
103f0 61 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b  ar zPrefix[100];
10400 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 21  .        if( in!
10410 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73 5f  =0 || !stdin_is_
10420 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20  interactive ){. 
10430 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10440 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10450 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66  (zPrefix), zPref
10460 69 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ix, .           
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69 6e  "Error: near lin
10490 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69 6e  e %d:", startlin
104a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
104b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
104c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
104d0 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
104e0 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22  Prefix, "Error:"
104f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10500 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
10510 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
10520 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
10530 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65   "%s %s\n", zPre
10540 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  fix, zErrMsg);. 
10550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10560 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
10570 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73            zErrMs
10580 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
10590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
105a0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
105b0 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66  "%s %s\n", zPref
105c0 69 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ix, sqlite3_errm
105d0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
105e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72      }.        er
105f0 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rCnt++;.      }.
10600 20 20 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29        free(zSql)
10610 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 30  ;.      zSql = 0
10620 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30  ;.      nSql = 0
10630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10640 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 69 66  ( zSql ){.    if
10650 28 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  ( !_all_whitespa
10660 63 65 28 7a 53 71 6c 29 20 29 20 66 70 72 69 6e  ce(zSql) ) fprin
10670 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
10680 72 3a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51  r: incomplete SQ
10690 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  L: %s\n", zSql);
106a0 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b  .    free(zSql);
106b0 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69 6e  .  }.  free(zLin
106c0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72  e);.  return err
106d0 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cnt;.}../*.** Re
106e0 74 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20  turn a pathname 
106f0 77 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65  which is the use
10700 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  r's home directo
10710 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75  ry.  A.** 0 retu
10720 72 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20  rn indicates an 
10730 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69  error of some ki
10740 6e 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  nd.  Space to ho
10750 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ld the.** result
10760 69 6e 67 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ing string is ob
10770 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
10780 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
10790 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  ng.** function s
107a0 68 6f 75 6c 64 20 66 72 65 65 20 74 68 65 20 72  hould free the r
107b0 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
107c0 20 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65   char *find_home
107d0 5f 64 69 72 28 76 6f 69 64 29 7b 0a 20 20 63 68  _dir(void){.  ch
107e0 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e  ar *home_dir = N
107f0 55 4c 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ULL;..#if !defin
10800 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
10810 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
10820 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f   !defined(__OS2_
10830 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
10840 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 21 64  WIN32_WCE) && !d
10850 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
10860 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
10870 5f 4b 45 52 4e 45 4c 29 0a 20 20 73 74 72 75 63  _KERNEL).  struc
10880 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74 3b  t passwd *pwent;
10890 0a 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20 67  .  uid_t uid = g
108a0 65 74 75 69 64 28 29 3b 0a 20 20 69 66 28 20 28  etuid();.  if( (
108b0 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28 75  pwent=getpwuid(u
108c0 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  id)) != NULL) {.
108d0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 70      home_dir = p
108e0 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20 20  went->pw_dir;.  
108f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
10900 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
10910 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20 43  ).  /* Windows C
10920 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
10930 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
10940 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65 74   not provide get
10950 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68 6f  env().   */.  ho
10960 6d 65 5f 64 69 72 20 3d 20 73 74 72 64 75 70 28  me_dir = strdup(
10970 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a 23 69 66  "/");.#else..#if
10980 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
10990 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
109a0 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  2) || defined(__
109b0 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21 68 6f  OS2__).  if (!ho
109c0 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f  me_dir) {.    ho
109d0 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28  me_dir = getenv(
109e0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
109f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
10a00 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20   (!home_dir) {. 
10a10 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65     home_dir = ge
10a20 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20  tenv("HOME");.  
10a30 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  }..#if defined(_
10a40 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
10a50 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  d(WIN32) || defi
10a60 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20 69  ned(__OS2__).  i
10a70 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
10a80 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76 65      char *zDrive
10a90 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69 6e  , *zPath;.    in
10aa0 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65 20  t n;.    zDrive 
10ab0 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44 52  = getenv("HOMEDR
10ac0 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74 68  IVE");.    zPath
10ad0 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 50   = getenv("HOMEP
10ae0 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  ATH");.    if( z
10af0 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20 29  Drive && zPath )
10b00 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c  {.      n = strl
10b10 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b 20 73  en30(zDrive) + s
10b20 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2b  trlen30(zPath) +
10b30 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64   1;.      home_d
10b40 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29  ir = malloc( n )
10b50 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 6d 65  ;.      if( home
10b60 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  _dir==0 ) return
10b70 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
10b80 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f  3_snprintf(n, ho
10b90 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22 2c 20  me_dir, "%s%s", 
10ba0 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a  zDrive, zPath);.
10bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 6f 6d        return hom
10bc0 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20  e_dir;.    }.   
10bd0 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c   home_dir = "c:\
10be0 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  \";.  }.#endif..
10bf0 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33  #endif /* !_WIN3
10c00 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20  2_WCE */..  if( 
10c10 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20 20  home_dir ){.    
10c20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
10c30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b 0a  (home_dir) + 1;.
10c40 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d 61      char *z = ma
10c50 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 69  lloc( n );.    i
10c60 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a 2c  f( z ) memcpy(z,
10c70 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a 20   home_dir, n);. 
10c80 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a 3b     home_dir = z;
10c90 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68  .  }..  return h
10ca0 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  ome_dir;.}../*.*
10cb0 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
10cc0 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76 65 6e  m the file given
10cd0 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f 76 65   by sqliterc_ove
10ce0 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20 74 68  rride.  Or if th
10cf0 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  at.** parameter 
10d00 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69 6e  is NULL, take in
10d10 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c 69  put from ~/.sqli
10d20 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  terc.**.** Retur
10d30 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
10d40 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
10d50 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 73  ic int process_s
10d60 71 6c 69 74 65 72 63 28 0a 20 20 73 74 72 75 63  qliterc(.  struc
10d70 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
10d80 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *p,        /* Co
10d90 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61  nfiguration data
10da0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10db0 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72   *sqliterc_overr
10dc0 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ide   /* Name of
10dd0 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55   config file. NU
10de0 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  LL to use defaul
10df0 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
10e00 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b  home_dir = NULL;
10e10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  .  const char *s
10e20 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65  qliterc = sqlite
10e30 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63  rc_override;.  c
10e40 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20  har *zBuf = 0;. 
10e50 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c   FILE *in = NULL
10e60 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
10e70 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69  int rc = 0;..  i
10e80 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e  f (sqliterc == N
10e90 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
10ea0 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f  dir = find_home_
10eb0 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68  dir();.    if( h
10ec0 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69  ome_dir==0 ){.#i
10ed0 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  f !defined(__RTP
10ee0 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
10ef0 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20  _WRS_KERNEL).   
10f00 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
10f10 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 63 61  r,"%s: Error: ca
10f20 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72  nnot locate your
10f30 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 5c   home directory\
10f40 6e 22 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e 64  n", Argv0);.#end
10f50 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
10f60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 75  1;.    }.    nBu
10f70 66 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d  f = strlen30(hom
10f80 65 5f 64 69 72 29 20 2b 20 31 36 3b 0a 20 20 20  e_dir) + 16;.   
10f90 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 20   zBuf = malloc( 
10fa0 6e 42 75 66 20 29 3b 0a 20 20 20 20 69 66 28 20  nBuf );.    if( 
10fb0 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
10fc0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
10fd0 22 25 73 3a 20 45 72 72 6f 72 3a 20 6f 75 74 20  "%s: Error: out 
10fe0 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 2c 41 72 67  of memory\n",Arg
10ff0 76 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  v0);.      retur
11000 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
11010 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11020 6e 42 75 66 2c 20 7a 42 75 66 2c 22 25 73 2f 2e  nBuf, zBuf,"%s/.
11030 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f 64  sqliterc",home_d
11040 69 72 29 3b 0a 20 20 20 20 66 72 65 65 28 68 6f  ir);.    free(ho
11050 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73 71 6c  me_dir);.    sql
11060 69 74 65 72 63 20 3d 20 28 63 6f 6e 73 74 20 63  iterc = (const c
11070 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 7d 0a 20  har*)zBuf;.  }. 
11080 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
11090 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
110a0 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
110b0 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
110c0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66 70  tive ){.      fp
110d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d 2d  rintf(stderr,"--
110e0 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72 63   Loading resourc
110f0 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73 71  es from %s\n",sq
11100 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a 20  literc);.    }. 
11110 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
11120 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20  input(p,in);.   
11130 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
11140 0a 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  .  free(zBuf);. 
11150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11160 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c 61  *.** Show availa
11170 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ble command line
11180 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
11190 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4f  ic const char zO
111a0 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22 20  ptions[] = .  " 
111b0 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20 20 20    -help         
111c0 20 20 20 20 20 20 20 73 68 6f 77 20 74 68 69 73         show this
111d0 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 20   message\n".  " 
111e0 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61 6d 65    -init filename
111f0 20 20 20 20 20 20 20 72 65 61 64 2f 70 72 6f 63         read/proc
11200 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65 5c 6e  ess named file\n
11210 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
11230 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo
11240 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a  re execution\n".
11250 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65    "   -[no]heade
11260 72 20 20 20 20 20 20 20 20 20 20 74 75 72 6e 20  r          turn 
11270 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
11280 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69 6c  f\n".  "   -bail
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  stop after hitti
112b0 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20  ng an error\n". 
112c0 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76   "   -interactiv
112d0 65 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20  e         force 
112e0 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c  interactive I/O\
112f0 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63 68 20  n".  "   -batch 
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
11310 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22  rce batch I/O\n"
11320 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20  .  "   -column  
11330 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11340 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
11350 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20  column'\n".  "  
11360 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20   -csv           
11370 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
11380 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e   mode to 'csv'\n
11390 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20 20 20  ".  "   -html   
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
113b0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
113c0 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  HTML\n".  "   -l
113d0 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
113e0 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
113f0 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
11400 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
11410 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
11420 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
11430 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73  ist'\n".  "   -s
11440 65 70 61 72 61 74 6f 72 20 27 78 27 20 20 20 20  eparator 'x'    
11450 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 66 69     set output fi
11460 65 6c 64 20 73 65 70 61 72 61 74 6f 72 20 28 7c  eld separator (|
11470 29 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c  )\n".  "   -null
11480 76 61 6c 75 65 20 27 74 65 78 74 27 20 20 20 20  value 'text'    
11490 73 65 74 20 74 65 78 74 20 73 74 72 69 6e 67 20  set text string 
114a0 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c  for NULL values\
114b0 6e 22 0a 20 20 22 20 20 20 2d 76 65 72 73 69 6f  n".  "   -versio
114c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68  n             sh
114d0 6f 77 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  ow SQLite versio
114e0 6e 5c 6e 22 0a 3b 0a 73 74 61 74 69 63 20 76 6f  n\n".;.static vo
114f0 69 64 20 75 73 61 67 65 28 69 6e 74 20 73 68 6f  id usage(int sho
11500 77 44 65 74 61 69 6c 29 7b 0a 20 20 66 70 72 69  wDetail){.  fpri
11510 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
11520 20 20 22 55 73 61 67 65 3a 20 25 73 20 5b 4f 50    "Usage: %s [OP
11530 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d 45 20  TIONS] FILENAME 
11540 5b 53 51 4c 5d 5c 6e 22 20 20 0a 20 20 20 20 20  [SQL]\n"  .     
11550 20 22 46 49 4c 45 4e 41 4d 45 20 69 73 20 74 68   "FILENAME is th
11560 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 53 51 4c  e name of an SQL
11570 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 41 20  ite database. A 
11580 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
11590 63 72 65 61 74 65 64 5c 6e 22 0a 20 20 20 20 20  created\n".     
115a0 20 22 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f   "if the file do
115b0 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  es not previousl
115c0 79 20 65 78 69 73 74 2e 5c 6e 22 2c 20 41 72 67  y exist.\n", Arg
115d0 76 30 29 3b 0a 20 20 69 66 28 20 73 68 6f 77 44  v0);.  if( showD
115e0 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 66 70 72  etail ){.    fpr
115f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 50  intf(stderr, "OP
11600 54 49 4f 4e 53 20 69 6e 63 6c 75 64 65 3a 5c 6e  TIONS include:\n
11610 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b 0a  %s", zOptions);.
11620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
11630 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
11640 65 20 74 68 65 20 2d 68 65 6c 70 20 6f 70 74 69  e the -help opti
11650 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
11660 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22  l information\n"
11670 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 31 29  );.  }.  exit(1)
11680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
11690 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 20  alize the state 
116a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 64  information in d
116b0 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ata.*/.static vo
116c0 69 64 20 6d 61 69 6e 5f 69 6e 69 74 28 73 74 72  id main_init(str
116d0 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
116e0 61 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65 6d  a *data) {.  mem
116f0 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73 69 7a  set(data, 0, siz
11700 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20 20 64  eof(*data));.  d
11710 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45  ata->mode = MODE
11720 5f 4c 69 73 74 3b 0a 20 20 6d 65 6d 63 70 79 28  _List;.  memcpy(
11730 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f 72 2c  data->separator,
11740 22 7c 22 2c 20 32 29 3b 0a 20 20 64 61 74 61 2d  "|", 2);.  data-
11750 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  >showHeader = 0;
11760 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
11770 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
11780 4c 4f 47 2c 20 73 68 65 6c 6c 4c 6f 67 2c 20 64  LOG, shellLog, d
11790 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ata);.  sqlite3_
117a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
117b0 6d 61 69 6e 50 72 6f 6d 70 74 29 2c 20 6d 61 69  mainPrompt), mai
117c0 6e 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e  nPrompt,"sqlite>
117d0 20 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   ");.  sqlite3_s
117e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 63  nprintf(sizeof(c
117f0 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2c 20  ontinuePrompt), 
11800 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22  continuePrompt,"
11810 20 20 20 2e 2e 2e 3e 20 22 29 3b 0a 20 20 73 71     ...> ");.  sq
11820 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
11830 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
11840 45 54 48 52 45 41 44 29 3b 0a 7d 0a 0a 69 6e 74  ETHREAD);.}..int
11850 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
11860 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
11870 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
11880 30 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  0;.  struct call
11890 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a  back_data data;.
118a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
118b0 6e 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63  nitFile = 0;.  c
118c0 68 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d  har *zFirstCmd =
118d0 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
118e0 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 41 72  nt rc = 0;..  Ar
118f0 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  gv0 = argv[0];. 
11900 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74 61   main_init(&data
11910 29 3b 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e  );.  stdin_is_in
11920 74 65 72 61 63 74 69 76 65 20 3d 20 69 73 61 74  teractive = isat
11930 74 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ty(0);..  /* Mak
11940 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
11950 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61   valid signal ha
11960 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66  ndler early, bef
11970 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  ore anything.  *
11980 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a  * else is done..
11990 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49    */.#ifdef SIGI
119a0 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49  NT.  signal(SIGI
119b0 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61  NT, interrupt_ha
119c0 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  ndler);.#endif..
119d0 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69    /* Do an initi
119e0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
119f0 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
11a00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63   argument to loc
11a10 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d  ate.  ** the nam
11a20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11a30 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65  e file, the name
11a40 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
11a50 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a  zation file,.  *
11a60 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  * and the first 
11a70 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75  command to execu
11a80 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  te..  */.  for(i
11a90 3d 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20 69 2b  =1; i<argc-1; i+
11aa0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
11ab0 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d  .    if( argv[i]
11ac0 5b 30 5d 21 3d 27 2d 27 20 29 20 62 72 65 61 6b  [0]!='-' ) break
11ad0 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b 69  ;.    z = argv[i
11ae0 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  ];.    if( z[0]=
11af0 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
11b00 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ' ) z++;.    if(
11b10 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
11b20 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30  "-separator")==0
11b30 20 7c 7c 20 73 74 72 63 6d 70 28 61 72 67 76 5b   || strcmp(argv[
11b40 69 5d 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29  i],"-nullvalue")
11b50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
11b60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11b70 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
11b80 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -init")==0 ){.  
11b90 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a      i++;.      z
11ba0 49 6e 69 74 46 69 6c 65 20 3d 20 61 72 67 76 5b  InitFile = argv[
11bb0 69 5d 3b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  i];.    /* Need 
11bc0 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 62 61 74  to check for bat
11bd0 63 68 20 6d 6f 64 65 20 68 65 72 65 20 74 6f 20  ch mode here to 
11be0 73 6f 20 77 65 20 63 61 6e 20 61 76 6f 69 64 20  so we can avoid 
11bf0 70 72 69 6e 74 69 6e 67 0a 20 20 20 20 2a 2a 20  printing.    ** 
11c00 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c 20 6d 65  informational me
11c10 73 73 61 67 65 73 20 28 6c 69 6b 65 20 66 72 6f  ssages (like fro
11c20 6d 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65  m process_sqlite
11c30 72 63 29 20 62 65 66 6f 72 65 20 0a 20 20 20 20  rc) before .    
11c40 2a 2a 20 77 65 20 64 6f 20 74 68 65 20 61 63 74  ** we do the act
11c50 75 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ual processing o
11c60 66 20 61 72 67 75 6d 65 6e 74 73 20 6c 61 74 65  f arguments late
11c70 72 20 69 6e 20 61 20 73 65 63 6f 6e 64 20 70 61  r in a second pa
11c80 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ss..    */.    }
11c90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11ca0 61 72 67 76 5b 69 5d 2c 22 2d 62 61 74 63 68 22  argv[i],"-batch"
11cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  )==0 ){.      st
11cc0 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
11cd0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
11ce0 7d 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29  }.  if( i<argc )
11cf0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
11d00 4c 49 54 45 5f 4f 53 5f 4f 53 32 29 20 26 26 20  LITE_OS_OS2) && 
11d10 53 51 4c 49 54 45 5f 4f 53 5f 4f 53 32 0a 20 20  SQLITE_OS_OS2.  
11d20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61    data.zDbFilena
11d30 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
11d40 20 2a 29 63 6f 6e 76 65 72 74 43 70 50 61 74 68   *)convertCpPath
11d50 54 6f 55 74 66 38 28 20 61 72 67 76 5b 69 2b 2b  ToUtf8( argv[i++
11d60 5d 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  ] );.#else.    d
11d70 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20  ata.zDbFilename 
11d80 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 23 65 6e  = argv[i++];.#en
11d90 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  dif.  }else{.#if
11da0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11db0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 64 61  _MEMORYDB.    da
11dc0 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  ta.zDbFilename =
11dd0 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6c   ":memory:";.#el
11de0 73 65 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46  se.    data.zDbF
11df0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 23 65 6e  ilename = 0;.#en
11e00 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  dif.  }.  if( i<
11e10 61 72 67 63 20 29 7b 0a 20 20 20 20 7a 46 69 72  argc ){.    zFir
11e20 73 74 43 6d 64 20 3d 20 61 72 67 76 5b 69 2b 2b  stCmd = argv[i++
11e30 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 61  ];.  }.  if( i<a
11e40 72 67 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  rgc ){.    fprin
11e50 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45  tf(stderr,"%s: E
11e60 72 72 6f 72 3a 20 74 6f 6f 20 6d 61 6e 79 20 6f  rror: too many o
11e70 70 74 69 6f 6e 73 3a 20 5c 22 25 73 5c 22 5c 6e  ptions: \"%s\"\n
11e80 22 2c 20 41 72 67 76 30 2c 20 61 72 67 76 5b 69  ", Argv0, argv[i
11e90 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
11ea0 73 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c  stderr,"Use -hel
11eb0 70 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20  p for a list of 
11ec0 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20  options.\n");.  
11ed0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11ee0 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64    data.out = std
11ef0 6f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  out;..#ifdef SQL
11f00 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
11f10 42 0a 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62  B.  if( data.zDb
11f20 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
11f30 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11f40 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6e 6f  r,"%s: Error: no
11f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
11f60 6d 65 20 73 70 65 63 69 66 69 65 64 5c 6e 22 2c  me specified\n",
11f70 20 41 72 67 76 30 29 3b 0a 20 20 20 20 72 65 74   Argv0);.    ret
11f80 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
11f90 66 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64  f..  /* Go ahead
11fa0 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61   and open the da
11fb0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
11fc0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
11fd0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66  .  If the.  ** f
11fe0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
11ff0 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e  st, delay openin
12000 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65 76  g it.  This prev
12010 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61 62  ents empty datab
12020 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66  ase.  ** files f
12030 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65  rom being create
12040 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73 74  d if a user mist
12050 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ypes the databas
12060 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a  e name argument.
12070 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69    ** to the sqli
12080 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  te command-line 
12090 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tool..  */.  if(
120a0 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62   access(data.zDb
120b0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20  Filename, 0)==0 
120c0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26  ){.    open_db(&
120d0 64 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  data);.  }..  /*
120e0 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 69   Process the ini
120f0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65  tialization file
12100 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
12110 2e 20 20 49 66 20 6e 6f 20 2d 69 6e 69 74 20 6f  .  If no -init o
12120 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 67 69  ption.  ** is gi
12130 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ven on the comma
12140 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f  nd line, look fo
12150 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 7e  r a file named ~
12160 2f 2e 73 71 6c 69 74 65 72 63 20 61 6e 64 0a 20  /.sqliterc and. 
12170 20 2a 2a 20 74 72 79 20 74 6f 20 70 72 6f 63 65   ** try to proce
12180 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 72 63  ss it..  */.  rc
12190 20 3d 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74   = process_sqlit
121a0 65 72 63 28 26 64 61 74 61 2c 7a 49 6e 69 74 46  erc(&data,zInitF
121b0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3e 30  ile);.  if( rc>0
121c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
121d0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  c;.  }..  /* Mak
121e0 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
121f0 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d  through the comm
12200 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
12210 74 20 61 6e 64 20 73 65 74 0a 20 20 2a 2a 20 6f  t and set.  ** o
12220 70 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 65  ptions.  This se
12230 63 6f 6e 64 20 70 61 73 73 20 69 73 20 64 65 6c  cond pass is del
12240 61 79 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72  ayed until after
12250 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
12260 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ion.  ** file is
12270 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 74 68   processed so th
12280 61 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  at the command-l
12290 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69  ine arguments wi
122a0 6c 6c 20 6f 76 65 72 72 69 64 65 0a 20 20 2a 2a  ll override.  **
122b0 20 73 65 74 74 69 6e 67 73 20 69 6e 20 74 68 65   settings in the
122c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
122d0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  file..  */.  for
122e0 28 69 3d 31 3b 20 69 3c 61 72 67 63 20 26 26 20  (i=1; i<argc && 
122f0 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 3b  argv[i][0]=='-';
12300 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
12310 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  *z = argv[i];.  
12320 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
12330 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
12340 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69  ( strcmp(z,"-ini
12350 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12360 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
12370 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74  f( strcmp(z,"-ht
12380 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ml")==0 ){.     
12390 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
123a0 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
123b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
123c0 2d 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -list")==0 ){.  
123d0 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
123e0 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
123f0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12400 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b  z,"-line")==0 ){
12410 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
12420 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
12430 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12440 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d  mp(z,"-column")=
12450 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
12460 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  .mode = MODE_Col
12470 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  umn;.    }else i
12480 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73  f( strcmp(z,"-cs
12490 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  v")==0 ){.      
124a0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
124b0 5f 43 73 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63  _Csv;.      memc
124c0 70 79 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f  py(data.separato
124d0 72 2c 22 2c 22 2c 32 29 3b 0a 20 20 20 20 7d 65  r,",",2);.    }e
124e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
124f0 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d  ,"-separator")==
12500 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
12510 20 20 20 20 20 20 69 66 28 69 3e 3d 61 72 67 63        if(i>=argc
12520 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
12530 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45  tf(stderr,"%s: E
12540 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72  rror: missing ar
12550 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f  gument for optio
12560 6e 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c  n: %s\n", Argv0,
12570 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72   z);.        fpr
12580 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73 65  intf(stderr,"Use
12590 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73   -help for a lis
125a0 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22  t of options.\n"
125b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
125c0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
125d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
125e0 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
125f0 73 65 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61  separator), data
12600 2e 73 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20  .separator,.    
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 20 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73     "%.*s",(int)s
12630 69 7a 65 6f 66 28 64 61 74 61 2e 73 65 70 61 72  izeof(data.separ
12640 61 74 6f 72 29 2d 31 2c 61 72 67 76 5b 69 5d 29  ator)-1,argv[i])
12650 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12660 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76  strcmp(z,"-nullv
12670 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  alue")==0 ){.   
12680 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
12690 28 69 3e 3d 61 72 67 63 29 7b 0a 20 20 20 20 20  (i>=argc){.     
126a0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
126b0 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d 69  r,"%s: Error: mi
126c0 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 66  ssing argument f
126d0 6f 72 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  or option: %s\n"
126e0 2c 20 41 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20  , Argv0, z);.   
126f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
12700 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70 20 66  err,"Use -help f
12710 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f 70 74  or a list of opt
12720 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  ions.\n");.     
12730 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12740 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12750 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
12760 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75  of(data.nullvalu
12770 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  e), data.nullval
12780 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
12790 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73             "%.*s
127a0 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61  ",(int)sizeof(da
127b0 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c  ta.nullvalue)-1,
127c0 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  argv[i]);.    }e
127d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
127e0 2c 22 2d 68 65 61 64 65 72 22 29 3d 3d 30 20 29  ,"-header")==0 )
127f0 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68 6f  {.      data.sho
12800 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
12810 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12820 70 28 7a 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29  p(z,"-noheader")
12830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
12840 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
12850 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12860 73 74 72 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22  strcmp(z,"-echo"
12870 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
12880 74 61 2e 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20  ta.echoOn = 1;. 
12890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
128a0 63 6d 70 28 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d  cmp(z,"-bail")==
128b0 30 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  0 ){.      bail_
128c0 6f 6e 5f 65 72 72 6f 72 20 3d 20 31 3b 0a 20 20  on_error = 1;.  
128d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
128e0 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22 29  mp(z,"-version")
128f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ==0 ){.      pri
12900 6e 74 66 28 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ntf("%s\n", sqli
12910 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
12920 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12930 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
12940 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 74 65   strcmp(z,"-inte
12950 72 61 63 74 69 76 65 22 29 3d 3d 30 20 29 7b 0a  ractive")==0 ){.
12960 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69        stdin_is_i
12970 6e 74 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a  nteractive = 1;.
12980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12990 72 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29  rcmp(z,"-batch")
129a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64  ==0 ){.      std
129b0 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
129c0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
129d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
129e0 68 65 6c 70 22 29 3d 3d 30 20 7c 7c 20 73 74 72  help")==0 || str
129f0 63 6d 70 28 7a 2c 20 22 2d 2d 68 65 6c 70 22 29  cmp(z, "--help")
12a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 61  ==0 ){.      usa
12a10 67 65 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(1);.    }else
12a20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
12a30 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f  stderr,"%s: Erro
12a40 72 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  r: unknown optio
12a50 6e 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c  n: %s\n", Argv0,
12a60 20 7a 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e   z);.      fprin
12a70 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d  tf(stderr,"Use -
12a80 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20  help for a list 
12a90 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b  of options.\n");
12aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
12ac0 28 20 7a 46 69 72 73 74 43 6d 64 20 29 7b 0a 20  ( zFirstCmd ){. 
12ad0 20 20 20 2f 2a 20 52 75 6e 20 6a 75 73 74 20 74     /* Run just t
12ae0 68 65 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20  he command that 
12af0 66 6f 6c 6c 6f 77 73 20 74 68 65 20 64 61 74 61  follows the data
12b00 62 61 73 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2f  base name.    */
12b10 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 43  .    if( zFirstC
12b20 6d 64 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20  md[0]=='.' ){.  
12b30 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61      rc = do_meta
12b40 5f 63 6f 6d 6d 61 6e 64 28 7a 46 69 72 73 74 43  _command(zFirstC
12b50 6d 64 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20  md, &data);.    
12b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 65  }else{.      ope
12b70 6e 5f 64 62 28 26 64 61 74 61 29 3b 0a 20 20 20  n_db(&data);.   
12b80 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
12b90 65 63 28 64 61 74 61 2e 64 62 2c 20 7a 46 69 72  ec(data.db, zFir
12ba0 73 74 43 6d 64 2c 20 73 68 65 6c 6c 5f 63 61 6c  stCmd, shell_cal
12bb0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
12bc0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  ErrMsg);.      i
12bd0 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b  f( zErrMsg!=0 ){
12be0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
12bf0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
12c00 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
12c10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12c20 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b 0a  rc!=0 ? rc : 1;.
12c30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12c40 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
12c50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12c60 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
12c70 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 5c 22  o process SQL \"
12c80 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 72 73 74 43  %s\"\n", zFirstC
12c90 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  md);.        ret
12ca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12cb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12cc0 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d 61 6e     /* Run comman
12cd0 64 73 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d  ds received from
12ce0 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 0a   standard input.
12cf0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
12d00 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
12d10 69 76 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ive ){.      cha
12d20 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20 20  r *zHome;.      
12d30 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20 3d  char *zHistory =
12d40 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48   0;.      int nH
12d50 69 73 74 6f 72 79 3b 0a 20 20 20 20 20 20 70 72  istory;.      pr
12d60 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
12d70 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 25 73  QLite version %s
12d80 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 45 6e 74  \n".        "Ent
12d90 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72  er \".help\" for
12da0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22   instructions\n"
12db0 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20  .        "Enter 
12dc0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74  SQL statements t
12dd0 65 72 6d 69 6e 61 74 65 64 20 77 69 74 68 20 61  erminated with a
12de0 20 5c 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20 20 20   \";\"\n",.     
12df0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65     sqlite3_libve
12e00 72 73 69 6f 6e 28 29 0a 20 20 20 20 20 20 29 3b  rsion().      );
12e10 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
12e20 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
12e30 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20        if( zHome 
12e40 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74  ){.        nHist
12e50 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ory = strlen30(z
12e60 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20  Home) + 20;.    
12e70 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72      if( (zHistor
12e80 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74  y = malloc(nHist
12e90 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ory))!=0 ){.    
12ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
12eb0 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c  printf(nHistory,
12ec0 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73   zHistory,"%s/.s
12ed0 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20  qlite_history", 
12ee0 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zHome);.        
12ef0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65  }.      }.#if de
12f00 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
12f10 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45 41  INE) && HAVE_REA
12f20 44 4c 49 4e 45 3d 3d 31 0a 20 20 20 20 20 20 69  DLINE==1.      i
12f30 66 28 20 7a 48 69 73 74 6f 72 79 20 29 20 72 65  f( zHistory ) re
12f40 61 64 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74  ad_history(zHist
12f50 6f 72 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ory);.#endif.   
12f60 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
12f70 69 6e 70 75 74 28 26 64 61 74 61 2c 20 30 29 3b  input(&data, 0);
12f80 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69 73 74  .      if( zHist
12f90 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ory ){.        s
12fa0 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 31 30  tifle_history(10
12fb0 30 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  0);.        writ
12fc0 65 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f  e_history(zHisto
12fd0 72 79 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ry);.        fre
12fe0 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  e(zHistory);.   
12ff0 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
13000 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zHome);.    }els
13010 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
13020 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74  ocess_input(&dat
13030 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d  a, stdin);.    }
13040 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65  .  }.  set_table
13050 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b  _name(&data, 0);
13060 0a 20 20 69 66 28 20 64 61 74 61 2e 64 62 20 29  .  if( data.db )
13070 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
13080 33 5f 63 6c 6f 73 65 28 64 61 74 61 2e 64 62 29  3_close(data.db)
13090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
130a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
130b0 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
130c0 6f 74 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  ot close databas
130d0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  e \"%s\"\n",.   
130e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
130f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
13100 20 20 20 20 20 20 72 63 2b 2b 3b 0a 20 20 20 20        rc++;.    
13110 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13120 63 3b 0a 7d 0a                                   c;.}.