/ Hex Artifact Content
Login

Artifact 8517fc1f9c59ae4007e6cc8b9af91ab231ea2056:


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 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  t statsOn;      
27c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
27d0: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
27e0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
27f0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69   finalize */.  i
2800: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
2810: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2820: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
2830: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
2840: 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20   FILE *out;     
2850: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2860: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2870: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
2880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2890: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
28a0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69  ing */.  int wri
28b0: 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20  tableSchema;    
28c0: 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  /* True if PRAGM
28d0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
28e0: 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  a=ON */.  int sh
28f0: 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20  owHeader;       
2900: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77   /* True to show
2910: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
2920: 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20   List or Column 
2930: 6d 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mode */.  char *
2940: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
2950: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
2960: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
2970: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
2980: 2f 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74  /.  char separat
2990: 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65  or[20];    /* Se
29a0: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
29b0: 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20  r for MODE_List 
29c0: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  */.  int colWidt
29d0: 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52  h[100];     /* R
29e0: 65 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f  equested width o
29f0: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68  f each column wh
2a00: 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64  en in column mod
2a10: 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c  e*/.  int actual
2a20: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
2a30: 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20  Actual width of 
2a40: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  each column */. 
2a50: 20 63 68 61 72 20 6e 75 6c 6c 76 61 6c 75 65 5b   char nullvalue[
2a60: 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  20];    /* The t
2a70: 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65  ext to print whe
2a80: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
2a90: 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  ack from.       
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2ac0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 72  e */.  struct pr
2ad0: 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61  evious_mode_data
2ae0: 20 65 78 70 6c 61 69 6e 50 72 65 76 3b 0a 20 20   explainPrev;.  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 73 20         /* Holds 
2b10: 74 68 65 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61  the mode informa
2b20: 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65  tion just before
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2e 65 78            ** .ex
2b50: 70 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68  plain ON */.  ch
2b60: 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e  ar outfile[FILEN
2b70: 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c  AME_MAX]; /* Fil
2b80: 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a  ename for *out *
2b90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ba0: 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  zDbFilename;    
2bb0: 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2bd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2be0: 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72  pStmt;   /* Curr
2bf0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66  ent statement if
2c00: 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20   any. */.  FILE 
2c10: 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20  *pLog;          
2c20: 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f    /* Write log o
2c30: 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 7d 3b  utput here */.};
2c40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
2c50: 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f  e the allowed mo
2c60: 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  des..*/.#define 
2c70: 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20  MODE_Line     0 
2c80: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70   /* One column p
2c90: 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20  er line.  Blank 
2ca0: 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63  line between rec
2cb0: 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ords */.#define 
2cc0: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20  MODE_Column   1 
2cd0: 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70   /* One record p
2ce0: 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20  er line in neat 
2cf0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  columns */.#defi
2d00: 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20  ne MODE_List    
2d10: 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72   2  /* One recor
2d20: 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20  d per line with 
2d30: 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23  a separator */.#
2d40: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69  define MODE_Semi
2d50: 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20       3  /* Same 
2d60: 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74  as MODE_List but
2d70: 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65   append ";" to e
2d80: 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  ach line */.#def
2d90: 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20  ine MODE_Html   
2da0: 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    4  /* Generate
2db0: 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20   an XHTML table 
2dc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
2dd0: 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47  Insert   5  /* G
2de0: 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73  enerate SQL "ins
2df0: 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ert" statements 
2e00: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
2e10: 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20 47  Tcl      6  /* G
2e20: 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f  enerate ANSI-C o
2e30: 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65  r TCL quoted ele
2e40: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
2e50: 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 37   MODE_Csv      7
2e60: 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e    /* Quote strin
2e70: 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  gs, numbers are 
2e80: 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  plain */.#define
2e90: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 38   MODE_Explain  8
2ea0: 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43    /* Like MODE_C
2eb0: 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f  olumn, but do no
2ec0: 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20  t truncate data 
2ed0: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
2ee0: 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72   char *modeDescr
2ef0: 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c  [] = {.  "line",
2f00: 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22  .  "column",.  "
2f10: 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c  list",.  "semi",
2f20: 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e  .  "html",.  "in
2f30: 73 65 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a  sert",.  "tcl",.
2f40: 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c    "csv",.  "expl
2f50: 61 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ain",.};../*.** 
2f60: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
2f70: 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a  ts in an array.*
2f80: 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53  /.#define ArrayS
2f90: 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73 69  ize(X)  (int)(si
2fa0: 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58  zeof(X)/sizeof(X
2fb0: 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  [0]))../*.** Com
2fc0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65  pute a string le
2fd0: 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d  ngth that is lim
2fe0: 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e  ited to what can
2ff0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
3000: 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f   lower 30 bits o
3010: 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65  f a 32-bit signe
3020: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
3030: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33  atic int strlen3
3040: 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  0(const char *z)
3050: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3060: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
3070: 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a   *z2 ){ z2++; }.
3080: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
3090: 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d  fff & (int)(z2 -
30a0: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   z);.}../*.** A 
30b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
30c0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69   sqlite3_log() i
30d0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
30e0: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f  tic void shellLo
30f0: 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  g(void *pArg, in
3100: 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73  t iErrCode, cons
3110: 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20  t char *zMsg){. 
3120: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
3130: 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75  _data *p = (stru
3140: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
3150: 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d  *)pArg;.  if( p-
3160: 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72  >pLog==0 ) retur
3170: 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  n;.  fprintf(p->
3180: 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e  pLog, "(%d) %s\n
3190: 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73  ", iErrCode, zMs
31a0: 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e  g);.  fflush(p->
31b0: 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pLog);.}../*.** 
31c0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
31d0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
31e0: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
31f0: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
3200: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
3210: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
3220: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
3230: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
3240: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
3250: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
3260: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
3270: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22  fprintf(out,"X'"
3280: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
3290: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70 72  nBlob; i++){ fpr
32a0: 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c  intf(out,"%02x",
32b0: 7a 42 6c 6f 62 5b 69 5d 29 3b 20 7d 0a 20 20 66  zBlob[i]); }.  f
32c0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b  printf(out,"'");
32d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
32e0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
32f0: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
3300: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
3310: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
3320: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
3330: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
3340: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
3350: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
3360: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3370: 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20  t nSingle = 0;. 
3380: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
3390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
33a0: 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67  i]=='\'' ) nSing
33b0: 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  le++;.  }.  if( 
33c0: 6e 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20  nSingle==0 ){.  
33d0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27    fprintf(out,"'
33e0: 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  %s'",z);.  }else
33f0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
3400: 74 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c  t,"'");.    whil
3410: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66  e( *z ){.      f
3420: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
3430: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29  z[i]!='\''; i++)
3440: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  {}.      if( i==
3450: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
3460: 69 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a  intf(out,"''");.
3470: 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
3480: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
3490: 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  ]=='\'' ){.     
34a0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
34b0: 25 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20  %.*s''",i,z);.  
34c0: 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a        z += i+1;.
34d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
34f0: 2c 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20  ,"%s",z);.      
3500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3510: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
3520: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d  tf(out,"'");.  }
3530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
3540: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
3550: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63  g as a quoted ac
3560: 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20  cording to C or 
3570: 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65  TCL quoting rule
3580: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3590: 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e  d output_c_strin
35a0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
35b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75  st char *z){.  u
35c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20  nsigned int c;. 
35d0: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
35e0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ;.  while( (c = 
35f0: 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  *(z++))!=0 ){.  
3600: 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b    if( c=='\\' ){
3610: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
3620: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
3630: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
3640: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27  else if( c=='\t'
3650: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
3660: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
3670: 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74    fputc('t', out
3680: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3690: 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20   c=='\n' ){.    
36a0: 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75    fputc('\\', ou
36b0: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
36c0: 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  'n', out);.    }
36d0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27  else if( c=='\r'
36e0: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
36f0: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
3700: 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74    fputc('r', out
3710: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3720: 20 21 69 73 70 72 69 6e 74 28 63 29 20 29 7b 0a   !isprint(c) ){.
3730: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
3740: 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30  t, "\\%03o", c&0
3750: 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xff);.    }else{
3760: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
3770: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
3780: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
3790: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
37a0: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
37b0: 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63 74  ing with charact
37c0: 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70 65  ers that are spe
37d0: 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20  cial to.** HTML 
37e0: 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  escaped..*/.stat
37f0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
3800: 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  tml_string(FILE 
3810: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
3820: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
3830: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
3840: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
3850: 5d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ] .            &
3860: 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20 20  & z[i]!='<' .   
3870: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
3880: 21 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20 20  !='&' .         
3890: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 20     && z[i]!='>' 
38a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
38b0: 7a 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20 20  z[i]!='\"' .    
38c0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
38d0: 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\'';.        i
38e0: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e  ++){}.    if( i>
38f0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
3900: 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c  tf(out,"%.*s",i,
3910: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
3920: 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20  ( z[i]=='<' ){. 
3930: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
3940: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
3950: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
3960: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ' ){.      fprin
3970: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
3980: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
3990: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
39a0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
39b0: 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gt;");.    }else
39c0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20   if( z[i]=='\"' 
39d0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
39e0: 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a  (out,"&quot;");.
39f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
3a00: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
3a10: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
3a20: 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  #39;");.    }els
3a30: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
3a40: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69      }.    z += i
3a50: 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   + 1;.  }.}../*.
3a60: 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f  ** If a field co
3a70: 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
3a80: 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  cter identified 
3a90: 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f  by a 1 in the fo
3aa0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79  llowing.** array
3ab0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  , then the strin
3ac0: 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64  g must be quoted
3ad0: 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61   for CSV..*/.sta
3ae0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
3af0: 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20  eedCsvQuote[] = 
3b00: 7b 0a 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 31 2c  1, 1, 1, 1,   1,
3b20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3b30: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
3b40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3b50: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
3b60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
3b70: 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c    1, 0, 1, 0, 0,
3b80: 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30   0, 0, 1,   0, 0
3b90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3ba0: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
3bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
3bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3bd0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
3be0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3bf0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
3c00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
3c10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3c20: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
3c30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3c40: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
3c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
3c60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3c70: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
3c80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3c90: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
3ca0: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20 20   0, 0, 0, 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 31 2c 20 31 2c 20  , 1, 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 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  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 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d10: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  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 31 2c 20 31 2c 20 31 2c  1, 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: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
3d60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
3d70: 2c 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 20 20 0a 20 20 31 2c 20 31   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 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
3db0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3dc0: 0a 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 31 2c 20  , 1, 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 20 20 0a 20 20 31 2c 20 31 2c 20  , 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 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
3e20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
3e30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e40: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
3e50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e60: 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1,   .};../*.** 
3e70: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
3e80: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
3e90: 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61 72  tually, p->separ
3ea0: 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ator is used for
3eb0: 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f  .** the separato
3ec0: 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  r, which may or 
3ed0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
3ee0: 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  ma.  p->nullvalu
3ef0: 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c  e is.** the null
3f00: 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73   value.  Strings
3f10: 20 61 72 65 20 71 75 6f 74 65 64 20 75 73 69 6e   are quoted usin
3f20: 67 20 41 4e 53 49 2d 43 20 72 75 6c 65 73 2e 20  g ANSI-C rules. 
3f30: 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 70 70 65   Numbers.** appe
3f40: 61 72 20 6f 75 74 73 69 64 65 20 6f 66 20 71 75  ar outside of qu
3f50: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
3f60: 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28  void output_csv(
3f70: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
3f80: 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63  data *p, const c
3f90: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70  har *z, int bSep
3fa0: 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  ){.  FILE *out =
3fb0: 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a   p->out;.  if( z
3fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
3fd0: 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e  tf(out,"%s",p->n
3fe0: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65 6c  ullvalue);.  }el
3ff0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
4000: 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74     int nSep = st
4010: 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72 61  rlen30(p->separa
4020: 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
4030: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
4040: 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76       if( needCsv
4050: 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64  Quote[((unsigned
4060: 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a 20   char*)z)[i]] . 
4070: 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d          || (z[i]
4080: 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30  ==p->separator[0
4090: 5d 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  ] && .          
40a0: 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d     (nSep==1 || m
40b0: 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 73 65 70 61  emcmp(z, p->sepa
40c0: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
40d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
40e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
40f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4100: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
4110: 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27 2c  .      putc('"',
4120: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f 72   out);.      for
4130: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
4140: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
4150: 69 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28 27  i]=='"' ) putc('
4160: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  "', out);.      
4170: 20 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75 74    putc(z[i], out
4180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4190: 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b   putc('"', out);
41a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
41b0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
41c0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  %s", z);.    }. 
41d0: 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b   }.  if( bSep ){
41e0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
41f0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65  out, "%s", p->se
4200: 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a  parator);.  }.}.
4210: 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a 2f  .#ifdef SIGINT./
4220: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4230: 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20  e runs when the 
4240: 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72  user presses Ctr
4250: 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  l-C.*/.static vo
4260: 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e  id interrupt_han
4270: 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64  dler(int NotUsed
4280: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
4290: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
42a0: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
42b0: 3d 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29 20  = 1;.  if( db ) 
42c0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
42d0: 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t(db);.}.#endif.
42e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
42f0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
4300: 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65  ine that the she
4310: 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f  ll.** invokes fo
4320: 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20  r each row of a 
4330: 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f  query result..*/
4340: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
4350: 6c 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  l_callback(void 
4360: 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
4370: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
4380: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 69 6e 74  har **azCol, int
4390: 20 2a 61 69 54 79 70 65 29 7b 0a 20 20 69 6e 74   *aiType){.  int
43a0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c   i;.  struct cal
43b0: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20  lback_data *p = 
43c0: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
43d0: 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 0a 20 20  _data*)pArg;..  
43e0: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
43f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
4400: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
4410: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
4420: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
4430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
4440: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
4450: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
4460: 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  en = strlen30(az
4470: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
4480: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
4490: 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d   if( len>w ) w =
44a0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
44b0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
44c0: 3e 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  >0 ) fprintf(p->
44d0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
44e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
44f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4500: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4510: 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20  %*s = %s\n", w, 
4520: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
4530: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
4540: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
4550: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
4560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4580: 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a  se MODE_Explain:
4590: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
45a0: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69  olumn: {.      i
45b0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
45c0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
45d0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
45e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
45f0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
4600: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
4610: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
4620: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
4630: 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ->colWidth[i];. 
4640: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4650: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
4660: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
4670: 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 3d           if( w<=
4680: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
4690: 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   w = strlen30(az
46a0: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
46b0: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
46c0: 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20       if( w<10 ) 
46d0: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
46e0: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
46f0: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
4700: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
4710: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
4720: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
4730: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
4740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4750: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
4760: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
4770: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
4780: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
4790: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
47a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
47b0: 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ( p->showHeader 
47c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
47d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
47e0: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a 43  -*.*s%s",w,w,azC
47f0: 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31  ol[i], i==nArg-1
4800: 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a   ? "\n": "  ");.
4810: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4830: 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ( p->showHeader 
4840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
4850: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4860: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
4870: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20  int w;.         
4880: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
4890: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
48a0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
48b0: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
48c0: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
48d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
48f0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
4900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4910: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4920: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22 2d  %-*.*s%s",w,w,"-
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 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  --".            
4960: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d         "--------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  --",.           
49b0: 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67           i==nArg
49c0: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
49d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
49e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
49f0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
4a00: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
4a10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4a20: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
4a30: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
4a40: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
4a50: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
4a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
4a70: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
4a80: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
4a90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
4aa0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
4ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4ac0: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
4ad0: 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26  in && azArg[i] &
4ae0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 74  & .           st
4af0: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
4b00: 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >w ){.          
4b10: 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  w = strlen30(azA
4b20: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
4b30: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
4b40: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
4b50: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
4b60: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
4b70: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
4b80: 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67  llvalue, i==nArg
4b90: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
4ba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4bc0: 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a   case MODE_Semi:
4bd0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
4be0: 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ist: {.      if(
4bf0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
4c00: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
4c10: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4c20: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
4c30: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
4c40: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
4c50: 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72  azCol[i], i==nAr
4c60: 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d 3e  g-1 ? "\n" : p->
4c70: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
4c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4c90: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
4ca0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4cb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
4cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
4cd0: 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
4ce0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
4cf0: 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c  ==0 ) z = p->nul
4d00: 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lvalue;.        
4d10: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
4d20: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
4d30: 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29    if( i<nArg-1 )
4d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
4d50: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
4d60: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  , p->separator);
4d70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
4d80: 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
4d90: 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20 20  _Semi ){.       
4da0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
4db0: 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t, ";\n");.     
4dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4dd0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
4de0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
4df0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4e00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4e10: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74      case MODE_Ht
4e20: 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ml: {.      if( 
4e30: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
4e40: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
4e50: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
4e60: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
4e70: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4e80: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
4e90: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
4ea0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b  (p->out,"<TH>");
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
4ec0: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
4ed0: 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  >out, azCol[i]);
4ee0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
4ef0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e  tf(p->out,"</TH>
4f00: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
4f10: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
4f20: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
4f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4f40: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
4f50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72  break;.      fpr
4f60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
4f70: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
4f80: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4f90: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
4fa0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29  f(p->out,"<TD>")
4fb0: 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  ;.        output
4fc0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
4fd0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
4fe0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
4ff0: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
5000: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5010: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
5020: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
5030: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
5040: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
5050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5060: 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20  e MODE_Tcl: {.  
5070: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
5080: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
5090: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
50a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
50b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
50c0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
50d0: 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d  (p->out,azCol[i]
50e0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
50f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  );.          fpr
5100: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
5110: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
5120: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5130: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5140: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
5150: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
5160: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
5170: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5180: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
5190: 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
51a0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
51b0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
51c0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
51d0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
51e0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
51f0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
5200: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
5210: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
5220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5230: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
5240: 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 69  E_Csv: {.      i
5250: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
5260: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
5270: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
5280: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
5290: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
52a0: 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b  ut_csv(p, azCol[
52b0: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
52c0: 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20  "", i<nArg-1);. 
52d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
52e0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
52f0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
5300: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
5310: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
5320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5340: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
5350: 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31  Arg[i], i<nArg-1
5360: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5370: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
5380: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
5390: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
53a0: 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20  se MODE_Insert: 
53b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  {.      p->cnt++
53c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  ;.      if( azAr
53d0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
53e0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
53f0: 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ut,"INSERT INTO 
5400: 25 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e 7a  %s VALUES(",p->z
5410: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
5420: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5430: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5440: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69 3e   char *zSep = i>
5450: 30 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20 20  0 ? ",": "";.   
5460: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
5470: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
5480: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
5490: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
54a0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
54b0: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c  f(p->out,"%sNULL
54c0: 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20  ",zSep);.       
54d0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
54e0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
54f0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
5500: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65           if( zSe
5510: 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70  p[0] ) fprintf(p
5520: 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29  ->out,"%s",zSep)
5530: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
5540: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
5550: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
5560: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
5570: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
5580: 28 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49  (aiType[i]==SQLI
5590: 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 69  TE_INTEGER || ai
55a0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
55b0: 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 20 20  FLOAT) ){.      
55c0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
55d0: 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c 20  ut,"%s%s",zSep, 
55e0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
55f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
5600: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
5610: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
5620: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
5630: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
5640: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
5650: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
5660: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
5670: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
5680: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
5690: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
56a0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
56b0: 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70  if( zSep[0] ) fp
56c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
56d0: 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20  ",zSep);.       
56e0: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
56f0: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
5700: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
5710: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
5720: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
5730: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
5740: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5750: 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72 67  s%s",zSep, azArg
5760: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
5770: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
5780: 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72  f( zSep[0] ) fpr
5790: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
57a0: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
57b0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
57c0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
57d0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
57e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
57f0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5800: 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ,");\n");.      
5810: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5820: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
5840: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
5850: 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69  ne that the SQLi
5860: 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e  te library.** in
5870: 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72  vokes for each r
5880: 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65  ow of a query re
5890: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
58a0: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69  int callback(voi
58b0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
58c0: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
58d0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a   char **azCol){.
58e0: 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f    /* since we do
58f0: 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e  n't have type in
5900: 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65  fo, call the she
5910: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ll_callback with
5920: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f   a NULL value */
5930: 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f  .  return shell_
5940: 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  callback(pArg, n
5950: 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f  Arg, azArg, azCo
5960: 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  l, NULL);.}../*.
5970: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69  ** Set the desti
5980: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65  nation table fie
5990: 6c 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61  ld of the callba
59a0: 63 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75 72  ck_data structur
59b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
59c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
59d0: 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
59e0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
59f0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
5a00: 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
5a10: 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
5a20: 5f 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61 6c  _name(struct cal
5a30: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63  lback_data *p, c
5a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5a50: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
5a60: 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a   int needQuote;.
5a70: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
5a80: 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  ( p->zDestTable 
5a90: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a  ){.    free(p->z
5aa0: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
5ab0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
5ac0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
5ad0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5ae0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69    needQuote = !i
5af0: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5b00: 20 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26   char)*zName) &&
5b10: 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20   *zName!='_';.  
5b20: 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65  for(i=n=0; zName
5b30: 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a  [i]; i++, n++){.
5b40: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
5b50: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
5b60: 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61  zName[i]) && zNa
5b70: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20  me[i]!='_' ){.  
5b80: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
5b90: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  1;.      if( zNa
5ba0: 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b  me[i]=='\'' ) n+
5bb0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
5bc0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e  f( needQuote ) n
5bd0: 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e   += 2;.  z = p->
5be0: 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
5bf0: 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
5c00: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( z==0 ){.    fp
5c10: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
5c20: 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
5c30: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
5c40: 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30  (1);.  }.  n = 0
5c50: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
5c60: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27  e ) z[n++] = '\'
5c70: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  ';.  for(i=0; zN
5c80: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
5c90: 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
5ca0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
5cb0: 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  me[i]=='\'' ) z[
5cc0: 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  n++] = '\'';.  }
5cd0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
5ce0: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
5cf0: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a  ;.  z[n] = 0;.}.
5d00: 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65  ./* zIn is eithe
5d10: 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
5d20: 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64   NULL-terminated
5d30: 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72   string in memor
5d40: 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  y obtained.** fr
5d50: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20  om malloc(), or 
5d60: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20  a NULL pointer. 
5d70: 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  The string point
5d80: 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64  ed to by zAppend
5d90: 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20   is.** added to 
5da0: 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73  zIn, and the res
5db0: 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ult returned in 
5dc0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5dd0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  from malloc()..*
5de0: 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73  * zIn, if it was
5df0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72   not NULL, is fr
5e00: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eed..**.** If th
5e10: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
5e20: 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20  , quote, is not 
5e30: 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73  '\0', then it is
5e40: 20 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71   used as a .** q
5e50: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66  uote character f
5e60: 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73  or zAppend..*/.s
5e70: 74 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 65  tatic char *appe
5e80: 6e 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e  ndText(char *zIn
5e90: 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41  , char const *zA
5ea0: 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74  ppend, char quot
5eb0: 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  e){.  int len;. 
5ec0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41   int i;.  int nA
5ed0: 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30  ppend = strlen30
5ee0: 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74  (zAppend);.  int
5ef0: 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c   nIn = (zIn?strl
5f00: 65 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20  en30(zIn):0);.. 
5f10: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 6e   len = nAppend+n
5f20: 49 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74  In+1;.  if( quot
5f30: 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20  e ){.    len += 
5f40: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
5f50: 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b  i<nAppend; i++){
5f60: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65  .      if( zAppe
5f70: 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c  nd[i]==quote ) l
5f80: 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en++;.    }.  }.
5f90: 0a 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20 2a  .  zIn = (char *
5fa0: 29 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65  )realloc(zIn, le
5fb0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20 29  n);.  if( !zIn )
5fc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fd0: 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74 65    }..  if( quote
5fe0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
5ff0: 73 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a  sr = &zIn[nIn];.
6000: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
6010: 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ote;.    for(i=0
6020: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
6030: 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b  ){.      *zCsr++
6040: 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20   = zAppend[i];. 
6050: 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64       if( zAppend
6060: 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43  [i]==quote ) *zC
6070: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
6080: 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20    }.    *zCsr++ 
6090: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a 43  = quote;.    *zC
60a0: 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20  sr++ = '\0';.   
60b0: 20 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d 7a   assert( (zCsr-z
60c0: 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65  In)==len );.  }e
60d0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  lse{.    memcpy(
60e0: 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65  &zIn[nIn], zAppe
60f0: 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20  nd, nAppend);.  
6100: 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27    zIn[len-1] = '
6110: 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  \0';.  }..  retu
6120: 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn zIn;.}.../*.*
6130: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
6140: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
6150: 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72 65   has a single re
6160: 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50 72  sult column.  Pr
6170: 69 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73 75  int.** that resu
6180: 6c 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20 6c  lt column on a l
6190: 69 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77 69  ine by itself wi
61a0: 74 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  th a semicolon t
61b0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
61c0: 20 54 68 69 73 20 69 73 20 75 73 65 64 2c 20 66   This is used, f
61d0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73  or example, to s
61e0: 68 6f 77 20 74 68 65 20 73 63 68 65 6d 61 20 6f  how the schema o
61f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  f the database b
6200: 79 0a 2a 2a 20 71 75 65 72 79 69 6e 67 20 74 68  y.** querying th
6210: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
6220: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
6230: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
6240: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 46 49 4c  ump_query(.  FIL
6250: 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20  E *out,         
6260: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 6f 75 74       /* Send out
6270: 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 73 71  put here */.  sq
6280: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
6290: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
62a0: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
62b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
62c0: 65 63 74 2c 20 20 20 20 2f 2a 20 53 45 4c 45 43  ect,    /* SELEC
62d0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
62e0: 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a  xtract content *
62f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6300: 7a 46 69 72 73 74 52 6f 77 20 20 20 2f 2a 20 50  zFirstRow   /* P
6310: 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73  rint before firs
6320: 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55  t row, if not NU
6330: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
6340: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
6350: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  ;.  int rc;.  rc
6360: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6370: 72 65 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20  re(db, zSelect, 
6380: 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29  -1, &pSelect, 0)
6390: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
63a0: 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63  TE_OK || !pSelec
63b0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
63c0: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
63d0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
63e0: 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ect);.  while( r
63f0: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
6400: 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52  .    if( zFirstR
6410: 6f 77 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ow ){.      fpri
6420: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
6430: 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20  FirstRow);.     
6440: 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a   zFirstRow = 0;.
6450: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
6460: 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  f(out, "%s;\n", 
6470: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
6480: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 29  ext(pSelect, 0))
6490: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
64a0: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
64b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
64c0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
64d0: 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pSelect);.}../*.
64e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
64f0: 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63  e and save off c
6500: 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72  urrent error str
6510: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
6520: 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73  har *save_err_ms
6530: 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g(.  sqlite3 *db
6540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6550: 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
6560: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
6570: 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33  rMsg = 1+strlen3
6580: 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  0(sqlite3_errmsg
6590: 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a  (db));.  char *z
65a0: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
65b0: 5f 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d 73 67 29  _malloc(nErrMsg)
65c0: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
65d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  ){.    memcpy(zE
65e0: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
65f0: 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d  rrmsg(db), nErrM
6600: 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
6610: 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a  n zErrMsg;.}../*
6620: 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f  .** Display memo
6630: 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  ry stats..*/.sta
6640: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f  tic int display_
6650: 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
6660: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6670: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6680: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 73   to query */.  s
6690: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
66a0: 61 74 61 20 2a 70 41 72 67 2c 20 2f 2a 20 50 6f  ata *pArg, /* Po
66b0: 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74 20  inter to struct 
66c0: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 2f  callback_data */
66d0: 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20  .  int bReset   
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66f0: 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
6700: 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  the stats */.){.
6710: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
6720: 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69 66 28  t iHiwtr;..  if(
6730: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f   pArg && pArg->o
6740: 75 74 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 69  ut ){.    .    i
6750: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
6760: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
6770: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
6780: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
6790: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
67a0: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
67b0: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
67c0: 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 20 20   "Memory Used:  
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
67f0: 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75  d) bytes\n", iCu
6800: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
6810: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
6820: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
6830: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6840: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e  ATUS_MALLOC_COUN
6850: 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  T, &iCur, &iHiwt
6860: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
6870: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
6880: 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 41 6c  t, "Number of Al
6890: 6c 6f 63 61 74 69 6f 6e 73 3a 20 20 20 20 20 20  locations:      
68a0: 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78           %d (max
68b0: 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20 69   %d)\n", iCur, i
68c0: 48 69 77 74 72 29 3b 0a 2f 2a 0a 2a 2a 20 4e 6f  Hiwtr);./*.** No
68d0: 74 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  t currently used
68e0: 20 62 79 20 74 68 65 20 43 4c 49 2e 0a 2a 2a 20   by the CLI..** 
68f0: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
6900: 20 3d 20 2d 31 3b 0a 2a 2a 20 20 20 20 73 71 6c   = -1;.**    sql
6910: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
6920: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
6930: 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  CHE_USED, &iCur,
6940: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
6950: 29 3b 0a 2a 2a 20 20 20 20 66 70 72 69 6e 74 66  );.**    fprintf
6960: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d  (pArg->out, "Num
6970: 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61  ber of Pcache Pa
6980: 67 65 73 20 55 73 65 64 3a 20 20 20 20 20 20 20  ges Used:       
6990: 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 70 61    %d (max %d) pa
69a0: 67 65 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48  ges\n", iCur, iH
69b0: 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20 20 69 48  iwtr);.*/.    iH
69c0: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
69d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
69e0: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
69f0: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45  US_PAGECACHE_OVE
6a00: 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26 69  RFLOW, &iCur, &i
6a10: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
6a20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
6a30: 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
6a40: 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c 6f  f Pcache Overflo
6a50: 77 20 42 79 74 65 73 3a 20 20 20 20 20 25 64 20  w Bytes:     %d 
6a60: 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e  (max %d) bytes\n
6a70: 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  ", iCur, iHiwtr)
6a80: 3b 0a 2f 2a 0a 2a 2a 20 4e 6f 74 20 63 75 72 72  ;./*.** Not curr
6a90: 65 6e 74 6c 79 20 75 73 65 64 20 62 79 20 74 68  ently used by th
6aa0: 65 20 43 4c 49 2e 0a 2a 2a 20 20 20 20 69 48 69  e CLI..**    iHi
6ab0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
6ac0: 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .**    sqlite3_s
6ad0: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
6ae0: 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45 44  TUS_SCRATCH_USED
6af0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
6b00: 2c 20 62 52 65 73 65 74 29 3b 0a 2a 2a 20 20 20  , bReset);.**   
6b10: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
6b20: 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 53  ut, "Number of S
6b30: 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74 69 6f  cratch Allocatio
6b40: 6e 73 20 55 73 65 64 3a 20 20 25 64 20 28 6d 61  ns Used:  %d (ma
6b50: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20  x %d)\n", iCur, 
6b60: 69 48 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20 20  iHiwtr);.*/.    
6b70: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
6b80: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
6b90: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6ba0: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45  ATUS_SCRATCH_OVE
6bb0: 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26 69  RFLOW, &iCur, &i
6bc0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
6bd0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
6be0: 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
6bf0: 66 20 53 63 72 61 74 63 68 20 4f 76 65 72 66 6c  f Scratch Overfl
6c00: 6f 77 20 42 79 74 65 73 3a 20 20 20 20 25 64 20  ow Bytes:    %d 
6c10: 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e  (max %d) bytes\n
6c20: 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  ", iCur, iHiwtr)
6c30: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
6c40: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
6c50: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
6c60: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
6c70: 43 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26  C_SIZE, &iCur, &
6c80: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
6c90: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
6ca0: 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73 74  g->out, "Largest
6cb0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20   Allocation:    
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
6cd0: 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77 74   bytes\n", iHiwt
6ce0: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
6cf0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
6d00: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
6d10: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
6d20: 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 26 69 43  ECACHE_SIZE, &iC
6d30: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
6d40: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
6d50: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61  f(pArg->out, "La
6d60: 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
6d70: 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20  ocation:        
6d80: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20     %d bytes\n", 
6d90: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69 48 69  iHiwtr);.    iHi
6da0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
6db0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61  .    sqlite3_sta
6dc0: 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55  tus(SQLITE_STATU
6dd0: 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20  S_SCRATCH_SIZE, 
6de0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
6df0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
6e00: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
6e10: 22 4c 61 72 67 65 73 74 20 53 63 72 61 74 63 68  "Largest Scratch
6e20: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20   Allocation:    
6e30: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
6e40: 22 2c 20 69 48 69 77 74 72 29 3b 0a 23 69 66 64  ", iHiwtr);.#ifd
6e50: 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
6e60: 43 4b 44 45 50 54 48 0a 20 20 20 20 69 48 69 77  CKDEPTH.    iHiw
6e70: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
6e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
6e90: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
6ea0: 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 26  _PARSER_STACK, &
6eb0: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
6ec0: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
6ed0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
6ee0: 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20 53  Deepest Parser S
6ef0: 74 61 63 6b 3a 20 20 20 20 20 20 20 20 20 20 20  tack:           
6f00: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
6f10: 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74  \n", iCur, iHiwt
6f20: 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  r);.#endif.  }..
6f30: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
6f40: 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b  rg->out && db ){
6f50: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
6f60: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
6f70: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
6f80: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
6f90: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
6fa0: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
6fb0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
6fc0: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
6fd0: 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c  t, "Lookaside Sl
6fe0: 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20 20 20  ots Used:       
6ff0: 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78           %d (max
7000: 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20 69   %d)\n", iCur, i
7010: 48 69 77 74 72 29 3b 0a 20 20 20 20 69 48 69 77  Hiwtr);.    iHiw
7020: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
7030: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
7040: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
7050: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
7060: 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
7070: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
7080: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
7090: 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61  >out, "Pager Hea
70a0: 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
70c0: 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b 20  ytes\n", iCur); 
70d0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
70e0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
70f0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
7100: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
7110: 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20  US_SCHEMA_USED, 
7120: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
7130: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
7140: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
7150: 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
7160: 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
7170: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
7180: 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69  ", iCur); .    i
7190: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
71a0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
71b0: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
71c0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d  ITE_DBSTATUS_STM
71d0: 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  T_USED, &iCur, &
71e0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
71f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
7200: 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
7210: 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
7220: 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
7230: 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29   bytes\n", iCur)
7240: 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41  ; .  }..  if( pA
7250: 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
7260: 26 26 20 64 62 20 26 26 20 70 41 72 67 2d 3e 70  && db && pArg->p
7270: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
7280: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
7290: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
72a0: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
72b0: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
72c0: 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  TEP, bReset);.  
72d0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
72e0: 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53  out, "Fullscan S
72f0: 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
7300: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
7310: 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
7320: 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
7330: 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
7340: 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
7350: 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65  STATUS_SORT, bRe
7360: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
7370: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f  f(pArg->out, "So
7380: 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20  rt Operations:  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
73b0: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
73c0: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
73d0: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
73e0: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
73f0: 55 54 4f 49 4e 44 45 58 2c 20 62 52 65 73 65 74  UTOINDEX, bReset
7400: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7410: 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69  Arg->out, "Autoi
7420: 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20  ndex Inserts:   
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
7450: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
7460: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
7470: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
7480: 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
7490: 2e 20 20 50 72 69 6e 74 20 0a 2a 2a 20 61 6e 79  .  Print .** any
74a0: 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
74b0: 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
74c0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
74d0: 64 65 20 0a 2a 2a 20 73 65 74 20 76 69 61 20 74  de .** set via t
74e0: 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c  he supplied call
74f0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
7500: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
7510: 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69   to SQLite's bui
7520: 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78  lt-in sqlite3_ex
7530: 65 63 28 29 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  ec() .** functio
7540: 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
7550: 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
7560: 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20  ferent callback 
7570: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b  .** and callback
7580: 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a   data argument..
7590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
75a0: 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69  ell_exec(.  sqli
75b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
75e0: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
75f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
7600: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7620: 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61  SQL to be evalua
7630: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ted */.  int (*x
7640: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
7650: 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a  int,char**,char*
7660: 2a 2c 69 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61  *,int*),   /* Ca
7670: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
7680: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 2f 2a 20 28 6e 6f 74 20 74 68 65 20 73 61 6d   /* (not the sam
76c0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 65 78 65  e as sqlite3_exe
76d0: 63 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  c) */.  struct c
76e0: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 41  allback_data *pA
76f0: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
7700: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7710: 6f 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  o struct callbac
7720: 6b 5f 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72  k_data */.  char
7730: 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
7760: 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72   msg written her
7770: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
7780: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
7790: 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61  NULL;     /* Sta
77a0: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
77b0: 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  e. */.  int rc =
77c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
77e0: 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  n Code */.  cons
77f0: 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65  t char *zLeftove
7800: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
7810: 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73  ail of unprocess
7820: 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20 69 66 28  ed SQL */..  if(
7830: 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
7840: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c   *pzErrMsg = NUL
7850: 4c 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  L;.  }..  while(
7860: 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c   zSql[0] && (SQL
7870: 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b  ITE_OK == rc) ){
7880: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7890: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
78a0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
78b0: 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a  t, &zLeftover);.
78c0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
78d0: 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20 20  K != rc ){.     
78e0: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
78f0: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d  .        *pzErrM
7900: 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73  sg = save_err_ms
7910: 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g(db);.      }. 
7920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7930: 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20  if( !pStmt ){.  
7940: 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20 68 61        /* this ha
7950: 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d  ppens for a comm
7960: 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73 70 61  ent or white-spa
7970: 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  ce */.        zS
7980: 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
7990: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
79a0: 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sspace(zSql[0]) 
79b0: 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
79c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
79d0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61    }..      /* sa
79e0: 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
79f0: 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
7a00: 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
7a10: 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
7a20: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
7a30: 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
7a40: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
7a50: 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
7a60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7a70: 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
7a80: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
7a90: 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
7aa0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
7ab0: 65 63 68 6f 4f 6e 20 29 7b 0a 20 20 20 20 20 20  echoOn ){.      
7ac0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7ad0: 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
7ae0: 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
7af0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72       fprintf(pAr
7b00: 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  g->out, "%s\n", 
7b10: 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74  zStmtSql ? zStmt
7b20: 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20  Sql : zSql);.   
7b30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70     }..      /* p
7b40: 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
7b50: 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
7b60: 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
7b70: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20        ** have a 
7b80: 72 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f  result set or no
7b90: 74 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69  t and how wide i
7ba0: 74 20 69 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  t is..      */. 
7bb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7bc0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
7bd0: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61       /* if we ha
7be0: 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
7bf0: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .. */.      if( 
7c00: 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
7c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69   ){.        /* i
7c20: 66 20 77 65 20 68 61 76 65 20 61 20 63 61 6c 6c  f we have a call
7c30: 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  back... */.     
7c40: 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b     if( xCallback
7c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7c60: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
7c70: 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72  for col name ptr
7c80: 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64  , value ptr, and
7c90: 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 20   type */.       
7ca0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
7cb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7cc0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
7cd0: 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
7ce0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7cf0: 63 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  c(3*nCol*sizeof(
7d00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20 31  const char*) + 1
7d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7d20: 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20   !pData ){.     
7d30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7d40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7d50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d60: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a         char **az
7d70: 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29  Cols = (char **)
7d80: 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e  pData;      /* N
7d90: 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63  ames of result c
7da0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
7db0: 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56        char **azV
7dc0: 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43  als = &azCols[nC
7dd0: 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  ol];       /* Re
7de0: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  sults */.       
7df0: 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65       int *aiType
7e00: 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61  s = (int *)&azVa
7e10: 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73  ls[nCol]; /* Res
7e20: 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ult types */.   
7e30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
7e50: 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
7e60: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
7e70: 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ); .            
7e80: 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73  /* save off ptrs
7e90: 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   to column names
7ea0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
7ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
7ed0: 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d       azCols[i] =
7ee0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
7ef0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
7f00: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
7f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7f20: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
7f30: 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74      /* extract t
7f40: 68 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61  he data and data
7f50: 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
7f60: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7f70: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
7f90: 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
7fa0: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
7fb0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
7fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7fd0: 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 73    aiTypes[i] = s
7fe0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
7ff0: 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8010: 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20  ( !azVals[i] && 
8020: 28 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c  (aiTypes[i]!=SQL
8030: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8050: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8070: 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72      break; /* fr
8080: 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  om for */.      
8090: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
80a0: 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
80b0: 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  nd for */..     
80c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64           /* if d
80d0: 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78  ata and types ex
80e0: 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66  tracted successf
80f0: 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  ully... */.     
8100: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
8110: 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
8120: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8130: 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75    /* call the su
8140: 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20  pplied callback 
8150: 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
8160: 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  row data */.    
8170: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8180: 78 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  xCallback(pArg, 
8190: 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a  nCol, azVals, az
81a0: 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29  Cols, aiTypes) )
81b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
81c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
81d0: 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20  ABORT;.         
81e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
8210: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
8220: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8240: 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
8250: 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
8260: 63 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  c );.           
8270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
8280: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
8290: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
82a0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  .          do{. 
82b0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
82c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
82d0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mt);.          }
82e0: 20 77 68 69 6c 65 28 20 72 63 20 3d 3d 20 53 51   while( rc == SQ
82f0: 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20  LITE_ROW );.    
8300: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
8310: 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
8320: 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
8330: 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
8340: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
8350: 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
8360: 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
8370: 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
8380: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8390: 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
83a0: 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
83b0: 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
83c0: 66 61 69 6c 73 2c 20 73 61 76 65 20 61 20 0a 20  fails, save a . 
83d0: 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
83e0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
83f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  e. Otherwise, se
8400: 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20  t zSql to point 
8410: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
8420: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
8430: 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
8440: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8450: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8460: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
8470: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8480: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
8490: 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
84a0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53  hile( isspace(zS
84b0: 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
84c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
84d0: 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
84e0: 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
84f0: 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
8500: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
8510: 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
8520: 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
8530: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
8540: 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
8550: 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
8560: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
8570: 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
8580: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
85a0: 61 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  a different call
85b0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65  back routine use
85c0: 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68  d for dumping th
85d0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45  e database..** E
85e0: 61 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64  ach row received
85f0: 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63   by this callbac
8600: 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  k consists of a 
8610: 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74  table name,.** t
8620: 68 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22  he table type ("
8630: 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65  index" or "table
8640: 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72  ") and SQL to cr
8650: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  eate the table..
8660: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8670: 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78  should print tex
8680: 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  t sufficient to 
8690: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62  recreate the tab
86a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
86b0: 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  t dump_callback(
86c0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
86d0: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
86e0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
86f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
8700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
8710: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
8720: 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20  *zType;.  const 
8730: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  char *zSql;.  co
8740: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 70 53  nst char *zPrepS
8750: 74 6d 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  tmt = 0;.  struc
8760: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
8770: 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63 61 6c  *p = (struct cal
8780: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29 70 41 72  lback_data *)pAr
8790: 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g;..  UNUSED_PAR
87a0: 41 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b 0a 20  AMETER(azCol);. 
87b0: 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 20 72   if( nArg!=3 ) r
87c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54 61 62 6c  eturn 1;.  zTabl
87d0: 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
87e0: 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zType = azArg[1]
87f0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67  ;.  zSql = azArg
8800: 5b 32 5d 3b 0a 20 20 0a 20 20 69 66 28 20 73 74  [2];.  .  if( st
8810: 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
8820: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
8830: 3d 30 20 29 7b 0a 20 20 20 20 7a 50 72 65 70 53  =0 ){.    zPrepS
8840: 74 6d 74 20 3d 20 22 44 45 4c 45 54 45 20 46 52  tmt = "DELETE FR
8850: 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  OM sqlite_sequen
8860: 63 65 3b 5c 6e 22 3b 0a 20 20 7d 65 6c 73 65 20  ce;\n";.  }else 
8870: 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
8880: 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  e, "sqlite_stat1
8890: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ")==0 ){.    fpr
88a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
88b0: 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
88c0: 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  ter;\n");.  }els
88d0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54  e if( strncmp(zT
88e0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  able, "sqlite_",
88f0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   7)==0 ){.    re
8900: 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20  turn 0;.  }else 
8910: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c  if( strncmp(zSql
8920: 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  , "CREATE VIRTUA
8930: 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30  L TABLE", 20)==0
8940: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49   ){.    char *zI
8950: 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ns;.    if( !p->
8960: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
8970: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
8980: 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
8990: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
89a0: 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  ON;\n");.      p
89b0: 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
89c0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
89d0: 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zIns = sqlite3_m
89e0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
89f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
8a00: 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e  te_master(type,n
8a10: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f  ame,tbl_name,roo
8a20: 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20  tpage,sql)".    
8a30: 20 20 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c     "VALUES('tabl
8a40: 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27  e','%q','%q',0,'
8a50: 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a  %q');",.       z
8a60: 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a  Table, zTable, z
8a70: 53 71 6c 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Sql);.    fprint
8a80: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
8a90: 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
8aa0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
8ab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8ac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
8ad0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b  ntf(p->out, "%s;
8ae0: 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a  \n", zSql);.  }.
8af0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
8b00: 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
8b10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8b20: 73 74 6d 74 20 2a 70 54 61 62 6c 65 49 6e 66 6f  stmt *pTableInfo
8b30: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
8b40: 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20  zSelect = 0;.   
8b50: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 49 6e 66   char *zTableInf
8b60: 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  o = 0;.    char 
8b70: 2a 7a 54 6d 70 20 3d 20 30 3b 0a 20 20 20 20 69  *zTmp = 0;.    i
8b80: 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nt nRow = 0;.   
8b90: 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20  .    zTableInfo 
8ba0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61  = appendText(zTa
8bb0: 62 6c 65 49 6e 66 6f 2c 20 22 50 52 41 47 4d 41  bleInfo, "PRAGMA
8bc0: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 22 2c 20 30   table_info(", 0
8bd0: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
8be0: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
8bf0: 54 61 62 6c 65 49 6e 66 6f 2c 20 7a 54 61 62 6c  TableInfo, zTabl
8c00: 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 7a 54 61  e, '"');.    zTa
8c10: 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64  bleInfo = append
8c20: 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c  Text(zTableInfo,
8c30: 20 22 29 3b 22 2c 20 30 29 3b 0a 0a 20 20 20 20   ");", 0);..    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
8c50: 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 54 61 62  pare(p->db, zTab
8c60: 6c 65 49 6e 66 6f 2c 20 2d 31 2c 20 26 70 54 61  leInfo, -1, &pTa
8c70: 62 6c 65 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  bleInfo, 0);.   
8c80: 20 66 72 65 65 28 7a 54 61 62 6c 65 49 6e 66 6f   free(zTableInfo
8c90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8ca0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 54 61  QLITE_OK || !pTa
8cb0: 62 6c 65 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  bleInfo ){.     
8cc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8cd0: 0a 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  ..    zSelect = 
8ce0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
8cf0: 63 74 2c 20 22 53 45 4c 45 43 54 20 27 49 4e 53  ct, "SELECT 'INS
8d00: 45 52 54 20 49 4e 54 4f 20 27 20 7c 7c 20 22 2c  ERT INTO ' || ",
8d10: 20 30 29 3b 0a 20 20 20 20 7a 54 6d 70 20 3d 20   0);.    zTmp = 
8d20: 61 70 70 65 6e 64 54 65 78 74 28 7a 54 6d 70 2c  appendText(zTmp,
8d30: 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20   zTable, '"');. 
8d40: 20 20 20 69 66 28 20 7a 54 6d 70 20 29 7b 0a 20     if( zTmp ){. 
8d50: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
8d60: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
8d70: 74 2c 20 7a 54 6d 70 2c 20 27 5c 27 27 29 3b 0a  t, zTmp, '\'');.
8d80: 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65 63      }.    zSelec
8d90: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
8da0: 53 65 6c 65 63 74 2c 20 22 20 7c 7c 20 27 20 56  Select, " || ' V
8db0: 41 4c 55 45 53 28 27 20 7c 7c 20 22 2c 20 30 29  ALUES(' || ", 0)
8dc0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8dd0: 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65 49 6e  e3_step(pTableIn
8de0: 66 6f 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  fo);.    while( 
8df0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
8e00: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
8e10: 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
8e20: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
8e30: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 54  3_column_text(pT
8e40: 61 62 6c 65 49 6e 66 6f 2c 20 31 29 3b 0a 20 20  ableInfo, 1);.  
8e50: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
8e60: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
8e70: 2c 20 22 71 75 6f 74 65 28 22 2c 20 30 29 3b 0a  , "quote(", 0);.
8e80: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
8e90: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
8ea0: 63 74 2c 20 7a 54 65 78 74 2c 20 27 22 27 29 3b  ct, zText, '"');
8eb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8ec0: 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65 49  te3_step(pTableI
8ed0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
8ee0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
8ef0: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65 63  {.        zSelec
8f00: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
8f10: 53 65 6c 65 63 74 2c 20 22 29 20 7c 7c 20 27 2c  Select, ") || ',
8f20: 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20  ' || ", 0);.    
8f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8f40: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
8f50: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
8f60: 29 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ) ", 0);.      }
8f70: 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  .      nRow++;. 
8f80: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
8f90: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
8fa0: 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20  TableInfo);.    
8fb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8fc0: 4b 20 7c 7c 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a  K || nRow==0 ){.
8fd0: 20 20 20 20 20 20 66 72 65 65 28 7a 53 65 6c 65        free(zSele
8fe0: 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ct);.      retur
8ff0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  n 1;.    }.    z
9000: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
9010: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c 7c  ext(zSelect, "||
9020: 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20 30 29   ')' FROM  ", 0)
9030: 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  ;.    zSelect = 
9040: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
9050: 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29  ct, zTable, '"')
9060: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75 6e 5f  ;..    rc = run_
9070: 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
9080: 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 20  (p->out, p->db, 
9090: 7a 53 65 6c 65 63 74 2c 20 7a 50 72 65 70 53 74  zSelect, zPrepSt
90a0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  mt);.    if( rc=
90b0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
90c0: 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74  ){.      zSelect
90d0: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
90e0: 65 6c 65 63 74 2c 20 22 20 4f 52 44 45 52 20 42  elect, " ORDER B
90f0: 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 30  Y rowid DESC", 0
9100: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 75  );.      rc = ru
9110: 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
9120: 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62  ry(p->out, p->db
9130: 2c 20 7a 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , zSelect, 0);. 
9140: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 65     }.    if( zSe
9150: 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c  lect ) free(zSel
9160: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ect);.  }.  retu
9170: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
9180: 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20  un zQuery.  Use 
9190: 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20  dump_callback() 
91a0: 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  as the callback 
91b0: 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a  routine so that.
91c0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
91d0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65  of the query are
91e0: 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20 73   output as SQL s
91f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
9200: 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51 4c   If we get a SQL
9210: 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
9220: 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75 65  r, rerun the que
9230: 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64 69  ry after appendi
9240: 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20  ng.** "ORDER BY 
9250: 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20 74  rowid DESC" to t
9260: 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  he end..*/.stati
9270: 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61  c int run_schema
9280: 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 73  _dump_query(.  s
9290: 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
92a0: 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74  ata *p, .  const
92b0: 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 0a 20   char *zQuery,. 
92c0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
92d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
92e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
92f0: 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  c(p->db, zQuery,
9300: 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
9310: 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  p, pzErrMsg);.  
9320: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
9330: 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68  ORRUPT ){.    ch
9340: 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74  ar *zQ2;.    int
9350: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
9360: 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 69 66 28  zQuery);.    if(
9370: 20 70 7a 45 72 72 4d 73 67 20 29 20 73 71 6c 69   pzErrMsg ) sqli
9380: 74 65 33 5f 66 72 65 65 28 2a 70 7a 45 72 72 4d  te3_free(*pzErrM
9390: 73 67 29 3b 0a 20 20 20 20 7a 51 32 20 3d 20 6d  sg);.    zQ2 = m
93a0: 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
93b0: 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
93c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
93d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
93e0: 74 66 28 73 69 7a 65 6f 66 28 7a 51 32 29 2c 20  tf(sizeof(zQ2), 
93f0: 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42  zQ2, "%s ORDER B
9400: 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
9410: 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  Query);.    rc =
9420: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
9430: 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63  >db, zQ2, dump_c
9440: 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 70 7a 45 72  allback, p, pzEr
9450: 72 4d 73 67 29 3b 0a 20 20 20 20 66 72 65 65 28  rMsg);.    free(
9460: 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zQ2);.  }.  retu
9470: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9480: 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d  Text of a help m
9490: 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  essage.*/.static
94a0: 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a   char zHelp[] =.
94b0: 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
94c0: 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75 70  FILE      Backup
94d0: 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
94e0: 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e  ain\") to FILE\n
94f0: 22 0a 20 20 22 2e 62 61 69 6c 20 4f 4e 7c 4f 46  ".  ".bail ON|OF
9500: 46 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70  F           Stop
9510: 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
9520: 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
9530: 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 64 61 74  t OFF\n".  ".dat
9540: 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20  abases          
9550: 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e     List names an
9560: 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63  d files of attac
9570: 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22  hed databases\n"
9580: 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45  .  ".dump ?TABLE
9590: 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20  ? ...      Dump 
95a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
95b0: 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d  an SQL text form
95c0: 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  at\n".  "       
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
95f0: 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20  fied, only dump 
9600: 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c  tables matching\
9610: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
9630: 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
9640: 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f  E.\n".  ".echo O
9650: 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20  N|OFF           
9660: 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68  Turn command ech
9670: 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  o on or off\n". 
9680: 20 22 2e 65 78 69 74 20 20 20 20 20 20 20 20 20   ".exit         
9690: 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
96a0: 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
96b0: 22 2e 65 78 70 6c 61 69 6e 20 3f 4f 4e 7c 4f 46  ".explain ?ON|OF
96c0: 46 3f 20 20 20 20 20 20 54 75 72 6e 20 6f 75 74  F?      Turn out
96d0: 70 75 74 20 6d 6f 64 65 20 73 75 69 74 61 62 6c  put mode suitabl
96e0: 65 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e  e for EXPLAIN on
96f0: 20 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 20   or off.\n".  " 
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 20 20 20 20 20 20 20 20 57 69 74 68 20 6e 6f 20          With no 
9720: 61 72 67 73 2c 20 69 74 20 74 75 72 6e 73 20 45  args, it turns E
9730: 58 50 4c 41 49 4e 20 6f 6e 2e 5c 6e 22 0a 20 20  XPLAIN on.\n".  
9740: 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e 7c 4f  ".header(s) ON|O
9750: 46 46 20 20 20 20 20 20 54 75 72 6e 20 64 69 73  FF      Turn dis
9760: 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20  play of headers 
9770: 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
9780: 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20  .help           
9790: 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73         Show this
97a0: 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e   message\n".  ".
97b0: 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
97c0: 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74  E     Import dat
97d0: 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
97e0: 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e   TABLE\n".  ".in
97f0: 64 69 63 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dices ?TABLE?   
9800: 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
9810: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 5c 6e 22  f all indices\n"
9820: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
9840: 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
9850: 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 69 63   only show indic
9860: 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22  es for tables\n"
9870: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74               mat
9890: 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65  ching LIKE patte
98a0: 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66  rn TABLE.\n".#if
98b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
98c0: 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f  E_IOTRACE.  ".io
98d0: 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20  trace FILE      
98e0: 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64      Enable I/O d
98f0: 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e  iagnostic loggin
9900: 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e  g to FILE\n".#en
9910: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
9920: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
9930: 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20  ENSION.  ".load 
9940: 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20  FILE ?ENTRY?    
9950: 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69   Load an extensi
9960: 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65  on library\n".#e
9970: 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c  ndif.  ".log FIL
9980: 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54  E|off          T
9990: 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f  urn logging on o
99a0: 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e  r off.  FILE can
99b0: 20 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75   be stderr/stdou
99c0: 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f  t\n".  ".mode MO
99d0: 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 53  DE ?TABLE?     S
99e0: 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 77  et output mode w
99f0: 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65  here MODE is one
9a00: 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20   of:\n".  "     
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
9a30: 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
9a40: 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74     column   Left
9a70: 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73  -aligned columns
9a80: 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 5c  .  (See .width)\
9a90: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
9ab0: 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61  tml     HTML <ta
9ac0: 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22  ble> code\n".  "
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
9af0: 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61    SQL insert sta
9b00: 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c  tements for TABL
9b10: 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  E\n".  "        
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61   line     One va
9b40: 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a  lue per line\n".
9b50: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
9b70: 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69       Values deli
9b80: 6d 69 74 65 64 20 62 79 20 2e 73 65 70 61 72 61  mited by .separa
9b90: 74 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a 20 20  tor string\n".  
9ba0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9bb0: 20 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20            tabs  
9bc0: 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
9bd0: 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20   values\n".  "  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20         tcl      
9c00: 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  TCL list element
9c10: 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c  s\n".  ".nullval
9c20: 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 50  ue STRING      P
9c30: 72 69 6e 74 20 53 54 52 49 4e 47 20 69 6e 20 70  rint STRING in p
9c40: 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c  lace of NULL val
9c50: 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75  ues\n".  ".outpu
9c60: 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  t FILENAME      
9c70: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
9c80: 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
9c90: 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20 20 20  output stdout   
9ca0: 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
9cb0: 74 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 5c  t to the screen\
9cc0: 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41  n".  ".prompt MA
9cd0: 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70  IN CONTINUE  Rep
9ce0: 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64 61 72  lace the standar
9cf0: 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22  d prompts\n".  "
9d00: 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20  .quit           
9d10: 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
9d20: 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e   program\n".  ".
9d30: 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20  read FILENAME   
9d40: 20 20 20 20 20 20 45 78 65 63 75 74 65 20 53 51        Execute SQ
9d50: 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  L in FILENAME\n"
9d60: 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42  .  ".restore ?DB
9d70: 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f  ? FILE     Resto
9d80: 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42  re content of DB
9d90: 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
9da0: 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22  \") from FILE\n"
9db0: 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54 41 42  .  ".schema ?TAB
9dc0: 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20  LE?        Show 
9dd0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
9de0: 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20 20 20  ments\n".  "    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70       If TABLE sp
9e10: 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
9e20: 6f 77 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  ow tables matchi
9e30: 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ng\n".  "       
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54    LIKE pattern T
9e60: 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73 65 70  ABLE.\n".  ".sep
9e70: 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20 20 20  arator STRING   
9e80: 20 20 20 43 68 61 6e 67 65 20 73 65 70 61 72 61     Change separa
9e90: 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75 74 70  tor used by outp
9ea0: 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70  ut mode and .imp
9eb0: 6f 72 74 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20  ort\n".  ".show 
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   Show the curren
9ee0: 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72  t values for var
9ef0: 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c 6e 22  ious settings\n"
9f00: 0a 20 20 22 2e 73 74 61 74 73 20 4f 4e 7c 4f 46  .  ".stats ON|OF
9f10: 46 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  F          Turn 
9f20: 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  stats on or off\
9f30: 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  n".  ".tables ?T
9f40: 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73  ABLE?        Lis
9f50: 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
9f60: 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
9f90: 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74  ied, only list t
9fa0: 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
9fb0: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
9fd0: 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
9fe0: 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74  .\n".  ".timeout
9ff0: 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54   MS            T
a000: 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
a010: 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
a020: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a  milliseconds\n".
a030: 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
a040: 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f  UM2 ...   Set co
a050: 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
a060: 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c  \"column\" mode\
a070: 6e 22 0a 3b 0a 0a 73 74 61 74 69 63 20 63 68 61  n".;..static cha
a080: 72 20 7a 54 69 6d 65 72 48 65 6c 70 5b 5d 20 3d  r zTimerHelp[] =
a090: 0a 20 20 22 2e 74 69 6d 65 72 20 4f 4e 7c 4f 46  .  ".timer ON|OF
a0a0: 46 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  F          Turn 
a0b0: 74 68 65 20 43 50 55 20 74 69 6d 65 72 20 6d 65  the CPU timer me
a0c0: 61 73 75 72 65 6d 65 6e 74 20 6f 6e 20 6f 72 20  asurement on or 
a0d0: 6f 66 66 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f 72  off\n".;../* For
a0e0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
a0f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
a100: 63 65 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63  cess_input(struc
a110: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
a120: 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a  *p, FILE *in);..
a130: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
a140: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
a150: 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
a160: 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
a170: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
a180: 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
a190: 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
a1a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
a1b0: 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
a1c0: 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 73 74   void open_db(st
a1d0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
a1e0: 74 61 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ta *p){.  if( p-
a1f0: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  >db==0 ){.    sq
a200: 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
a210: 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
a220: 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e  b);.    db = p->
a230: 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26  db;.    if( db &
a240: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
a250: 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e(db)==SQLITE_OK
a260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a270: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
a280: 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74  n(db, "shellstat
a290: 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  ic", 0, SQLITE_U
a2a0: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
a2b0: 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e    shellstaticFun
a2c0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
a2d0: 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c      if( db==0 ||
a2e0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
a2f0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20  te3_errcode(db) 
a300: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
a310: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
a320: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
a330: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
a340: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
a350: 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
a360: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
a370: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 65 78 69  (db));.      exi
a380: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
a390: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a3a0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
a3b0: 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
a3c0: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
a3d0: 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
a3e0: 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
a3f0: 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
a400: 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
a410: 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  *.**    \t    ->
a420: 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
a430: 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
a440: 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
a450: 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
a460: 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
a470: 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
a480: 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c 20   octal.**    \\ 
a490: 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a     -> backslash.
a4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a4b0: 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
a4c0: 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  es(char *z){.  i
a4d0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
a4e0: 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  c;.  for(i=j=0; 
a4f0: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
a500: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
a510: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
a520: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
a530: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20       if( c=='n' 
a540: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
a550: 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
a560: 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
a570: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
a580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
a590: 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
a5a0: 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
a5b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
a5c0: 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
a5d0: 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
a5e0: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
a5f0: 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
a600: 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
a610: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
a620: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
a630: 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
a640: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
a650: 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
a660: 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
a670: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
a680: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
a690: 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
a6a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a6c0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
a6d0: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
a6e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
a6f0: 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 20  rpret zArg as a 
a700: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
a710: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 30 20  Return either 0 
a720: 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  or 1..*/.static 
a730: 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
a740: 28 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20  (char *zArg){.  
a750: 69 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 7a  int val = atoi(z
a760: 41 72 67 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Arg);.  int j;. 
a770: 20 66 6f 72 28 6a 3d 30 3b 20 7a 41 72 67 5b 6a   for(j=0; zArg[j
a780: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 41 72  ]; j++){.    zAr
a790: 67 5b 6a 5d 20 3d 20 28 63 68 61 72 29 74 6f 6c  g[j] = (char)tol
a7a0: 6f 77 65 72 28 7a 41 72 67 5b 6a 5d 29 3b 0a 20  ower(zArg[j]);. 
a7b0: 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
a7c0: 7a 41 72 67 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b  zArg,"on")==0 ){
a7d0: 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20  .    val = 1;.  
a7e0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
a7f0: 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
a800: 29 7b 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  ){.    val = 1;.
a810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 61 6c    }.  return val
a820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
a830: 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
a840: 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
a850: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
a860: 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
a870: 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
a880: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
a890: 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
a8a0: 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
a8b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a8c0: 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
a8d0: 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74  (char *zLine, st
a8e0: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
a8f0: 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20  ta *p){.  int i 
a900: 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
a910: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
a920: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
a930: 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
a940: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
a950: 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
a960: 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
a970: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d   while( zLine[i]
a980: 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
a990: 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
a9a0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
a9b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
a9c0: 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b  Line[i]) ){ i++;
a9d0: 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
a9e0: 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
a9f0: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
aa00: 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
aa10: 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  i]=='"' ){.     
aa20: 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
aa30: 6e 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[i++];.      a
aa40: 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
aa50: 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20  zLine[i];.      
aa60: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20  while( zLine[i] 
aa70: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c  && zLine[i]!=del
aa80: 69 6d 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  im ){ i++; }.   
aa90: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d     if( zLine[i]=
aaa0: 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
aab0: 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30    zLine[i++] = 0
aac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aad0: 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
aae0: 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
aaf0: 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
ab00: 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
ab10: 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
ab20: 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b  ++] = &zLine[i];
ab30: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
ab40: 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70 61  ine[i] && !isspa
ab50: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
ab60: 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  r)zLine[i]) ){ i
ab70: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
ab80: 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e 65  zLine[i] ) zLine
ab90: 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [i++] = 0;.     
aba0: 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
abb0: 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
abc0: 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
abd0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
abe0: 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
abf0: 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
ac00: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
ac10: 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
ac20: 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
ac30: 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
ac40: 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
ac50: 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  ];.  if( c=='b' 
ac60: 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
ac70: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
ac80: 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20  ckup", n)==0 && 
ac90: 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 34  nArg>1 && nArg<4
aca0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
acb0: 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20  r *zDestFile;.  
acc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
acd0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
ace0: 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pDest;.    sqlit
acf0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
ad00: 75 70 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  up;.    if( nArg
ad10: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==2 ){.      zDe
ad20: 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  stFile = azArg[1
ad30: 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22  ];.      zDb = "
ad40: 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  main";.    }else
ad50: 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  {.      zDestFil
ad60: 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
ad70: 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b      zDb = azArg[
ad80: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  1];.    }.    rc
ad90: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
ada0: 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
adb0: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
adc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
add0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
ade0: 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
adf0: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
ae00: 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
ae10: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
ae20: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
ae30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ae40: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
ae50: 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
ae60: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
ae70: 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
ae80: 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20   p->db, zDb);.  
ae90: 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
aea0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
aeb0: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
aec0: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
aed0: 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b  _errmsg(pDest));
aee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
aef0: 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
af00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
af10: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
af20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
af30: 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
af40: 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
af50: 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
af60: 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
af70: 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
af80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
af90: 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
afa0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
afb0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
afc0: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
afd0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
afe0: 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
aff0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
b000: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
b010: 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65  (pDest);.  }else
b020: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
b030: 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
b040: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69  p(azArg[0], "bai
b050: 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  l", n)==0 && nAr
b060: 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  g>1 && nArg<3 ){
b070: 0a 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72  .    bail_on_err
b080: 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
b090: 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
b0a0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
b0b0: 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
b0c0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
b0d0: 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
b0e0: 30 20 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a  0 && nArg==1 ){.
b0f0: 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62      struct callb
b100: 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
b110: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
b120: 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
b130: 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  b(p);.    memcpy
b140: 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
b150: 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
b160: 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
b170: 31 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  1;.    data.mode
b180: 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
b190: 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74      data.colWidt
b1a0: 68 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61  h[0] = 3;.    da
b1b0: 74 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d  ta.colWidth[1] =
b1c0: 20 31 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f   15;.    data.co
b1d0: 6c 57 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a  lWidth[2] = 58;.
b1e0: 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30      data.cnt = 0
b1f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
b200: 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
b210: 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b  A database_list;
b220: 20 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64   ", callback, &d
b230: 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
b240: 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
b250: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
b260: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
b270: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
b280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
b290: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
b2a0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
b2b0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
b2c0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63   c=='d' && strnc
b2d0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75  mp(azArg[0], "du
b2e0: 6d 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  mp", n)==0 && nA
b2f0: 72 67 3c 33 20 29 7b 0a 20 20 20 20 63 68 61 72  rg<3 ){.    char
b300: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
b310: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
b320: 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69     /* When playi
b330: 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22  ng back a "dump"
b340: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69  , the content mi
b350: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e  ght appear in an
b360: 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68   order.    ** wh
b370: 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64  ich causes immed
b380: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
b390: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
b3a0: 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20  be violated..   
b3b0: 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66   ** So disable f
b3c0: 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74  oreign-key const
b3d0: 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
b3e0: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f  t to prevent pro
b3f0: 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 70  blems. */.    fp
b400: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
b410: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
b420: 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ys=OFF;\n");.   
b430: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b440: 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54   "BEGIN TRANSACT
b450: 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  ION;\n");.    p-
b460: 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
b470: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
b480: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
b490: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
b4a0: 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
b4b0: 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
b4c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==1 ){.      run
b4d0: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
b4e0: 72 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22  ry(p, .        "
b4f0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
b500: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
b510: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
b520: 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
b530: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
b540: 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
b550: 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
b560: 65 6e 63 65 27 22 2c 20 30 0a 20 20 20 20 20 20  ence'", 0.      
b570: 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
b580: 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
b590: 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
b5a0: 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
b5b0: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
b5c0: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
b5d0: 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
b5e0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 2c  lite_sequence'",
b5f0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
b600: 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
b610: 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70  _query(p->out, p
b620: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53  ->db,.        "S
b630: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
b640: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
b650: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
b660: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
b670: 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
b680: 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
b690: 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
b6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b6b0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
b6c0: 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
b6d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  +){.        zShe
b6e0: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
b6f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 72 75 6e  [i];.        run
b700: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
b710: 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20  ry(p,.          
b720: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
b730: 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
b740: 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
b750: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
b760: 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
b770: 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79  lstatic() AND ty
b780: 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
b790: 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
b7a0: 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 30 29 3b  l NOT NULL", 0);
b7b0: 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 74 61 62  .        run_tab
b7c0: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d  le_dump_query(p-
b7d0: 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a 20 20 20  >out, p->db,.   
b7e0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
b7f0: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
b800: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
b810: 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
b820: 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20   NULL".         
b830: 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
b840: 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
b850: 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
b860: 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
b870: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
b880: 73 74 61 74 69 63 28 29 22 2c 20 30 0a 20 20 20  static()", 0.   
b890: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
b8a0: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30  zShellStatic = 0
b8b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b8c0: 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
b8d0: 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
b8e0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
b8f0: 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
b900: 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
b910: 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
b920: 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
b930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b940: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
b950: 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
b960: 5f 73 63 68 65 6d 61 3d 4f 46 46 22 2c 20 30 2c  _schema=OFF", 0,
b970: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
b980: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
b990: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b9a0: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
b9b0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
b9c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
b9d0: 4d 73 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Msg);.    }else{
b9e0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
b9f0: 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b 5c  ->out, "COMMIT;\
ba00: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n");.    }.  }el
ba10: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
ba20: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
ba30: 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29  g[0], "echo", n)
ba40: 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26  ==0 && nArg>1 &&
ba50: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 70   nArg<3 ){.    p
ba60: 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65  ->echoOn = boole
ba70: 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
ba80: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
ba90: 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
baa0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
bab0: 78 69 74 22 2c 20 6e 29 3d 3d 30 20 20 26 26 20  xit", n)==0  && 
bac0: 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 72  nArg==1 ){.    r
bad0: 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
bae0: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
baf0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
bb00: 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d  , "explain", n)=
bb10: 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a  =0 && nArg<3 ){.
bb20: 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 6e 41      int val = nA
bb30: 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56  rg>=2 ? booleanV
bb40: 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a  alue(azArg[1]) :
bb50: 20 31 3b 0a 20 20 20 20 69 66 28 76 61 6c 20 3d   1;.    if(val =
bb60: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69 66 28  = 1) {.      if(
bb70: 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e  !p->explainPrev.
bb80: 76 61 6c 69 64 29 20 7b 0a 20 20 20 20 20 20 20  valid) {.       
bb90: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
bba0: 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  valid = 1;.     
bbb0: 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65     p->explainPre
bbc0: 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  v.mode = p->mode
bbd0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70  ;.        p->exp
bbe0: 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61  lainPrev.showHea
bbf0: 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61  der = p->showHea
bc00: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  der;.        mem
bc10: 63 70 79 28 70 2d 3e 65 78 70 6c 61 69 6e 50 72  cpy(p->explainPr
bc20: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 63  ev.colWidth,p->c
bc30: 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70  olWidth,sizeof(p
bc40: 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20  ->colWidth));.  
bc50: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 57      }.      /* W
bc60: 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68 69 73  e could put this
bc70: 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68 65 20   code under the 
bc80: 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c 69 64  !p->explainValid
bc90: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  .      ** condit
bca0: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 64  ion so that it d
bcb0: 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74 65 20  oes not execute 
bcc0: 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
bcd0: 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  y in.      ** ex
bce0: 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f 77 65  plain mode. Howe
bcf0: 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78 65 63  ver, always exec
bd00: 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77 73 20  uting it allows 
bd10: 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20 20 20  us an easy.     
bd20: 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73 65 74   ** was to reset
bd30: 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65   to explain mode
bd40: 20 69 6e 20 63 61 73 65 20 74 68 65 20 75 73 65   in case the use
bd50: 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  r previously.   
bd60: 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e 65 78     ** did an .ex
bd70: 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  plain followed b
bd80: 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d 6f 64  y a .width, .mod
bd90: 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20 20 20  e or .header.   
bda0: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20     ** command.. 
bdb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
bdc0: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
bdd0: 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 73  lain;.      p->s
bde0: 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20  howHeader = 1;. 
bdf0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 63       memset(p->c
be00: 6f 6c 57 69 64 74 68 2c 30 2c 41 72 72 61 79 53  olWidth,0,ArrayS
be10: 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
be20: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  );.      p->colW
be30: 69 64 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20  idth[0] = 4;    
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be50: 20 61 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70   addr */.      p
be60: 2d 3e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20  ->colWidth[1] = 
be70: 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  13;             
be80: 20 20 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f      /* opcode */
be90: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
bea0: 74 68 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[2] = 4;      
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
bec0: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  1 */.      p->co
bed0: 6c 57 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20  lWidth[3] = 4;  
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70  /* P2 */.      p
bf00: 2d 3e 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20  ->colWidth[4] = 
bf10: 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4;              
bf20: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
bf30: 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35     p->colWidth[5
bf40: 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20  ] = 13;         
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
bf60: 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
bf70: 74 68 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20  th[6] = 2;      
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
bf90: 35 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  5 */.      p->co
bfa0: 6c 57 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20  lWidth[7] = 13; 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
bfd0: 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e     }else if (p->
bfe0: 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69  explainPrev.vali
bff0: 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  d) {.      p->ex
c000: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
c010: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  = 0;.      p->mo
c020: 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50  de = p->explainP
c030: 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rev.mode;.      
c040: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
c050: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73  p->explainPrev.s
c060: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
c070: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69   memcpy(p->colWi
c080: 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72  dth,p->explainPr
c090: 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  ev.colWidth,size
c0a0: 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
c0b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
c0c0: 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
c0d0: 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
c0e0: 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29  0], "header", n)
c0f0: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
c100: 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28          strncmp(
c110: 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
c120: 72 73 22 2c 20 6e 29 3d 3d 30 29 20 26 26 20 6e  rs", n)==0) && n
c130: 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20  Arg>1 && nArg<3 
c140: 29 7b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  ){.    p->showHe
c150: 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
c160: 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
c170: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
c180: 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
c190: 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
c1a0: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , n)==0 ){.    f
c1b0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
c1c0: 73 22 2c 7a 48 65 6c 70 29 3b 0a 20 20 20 20 69  s",zHelp);.    i
c1d0: 66 28 20 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a  f( HAS_TIMER ){.
c1e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
c1f0: 64 65 72 72 2c 22 25 73 22 2c 7a 54 69 6d 65 72  derr,"%s",zTimer
c200: 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Help);.    }.  }
c210: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
c220: 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
c230: 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22  Arg[0], "import"
c240: 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
c250: 3d 33 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =3 ){.    char *
c260: 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32  zTable = azArg[2
c270: 5d 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ];    /* Insert 
c280: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
c290: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
c2a0: 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
c2b0: 31 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 66  1];     /* The f
c2c0: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
c2d0: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
c2e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
c2f0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
c300: 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
c310: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
c320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c330: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c340: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
c350: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
c360: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
c370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c380: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
c390: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
c3a0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c3d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
c3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c400: 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65 70   bytes in p->sep
c410: 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
c420: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
c430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c440: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
c450: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69  */.    char *zLi
c460: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
c470: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
c480: 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f  ine of input fro
c490: 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  m the file */.  
c4a0: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20    char **azCol; 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4c0: 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20   zLine[] broken 
c4d0: 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20  up into columns 
c4e0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  */.    char *zCo
c4f0: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
c500: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d     /* How to com
c510: 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 20 20  mit changes */  
c520: 20 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20   .    FILE *in; 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
c550: 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
c560: 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
c570: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
c580: 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
c590: 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e  ile */..    open
c5a0: 5f 64 62 28 70 29 3b 0a 20 20 20 20 6e 53 65 70  _db(p);.    nSep
c5b0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73   = strlen30(p->s
c5c0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69  eparator);.    i
c5d0: 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
c5e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
c5f0: 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  rr, "Error: non-
c600: 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
c610: 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
c620: 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
c630: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c640: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
c650: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
c660: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
c670: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
c680: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
c690: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c6a0: 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
c6b0: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
c6c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c6d0: 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
c6e0: 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
c6f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
c700: 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53  repare(p->db, zS
c710: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
c720: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
c730: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
c740: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c750: 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
c760: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
c770: 74 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  t);.      fprint
c780: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
c790: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
c7a0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
c7b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
c7c0: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
c7d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
c7e0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
c7f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
c800: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
c810: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
c820: 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
c830: 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
c840: 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
c850: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
c860: 20 6e 42 79 74 65 20 2b 20 32 30 20 2b 20 6e 43   nByte + 20 + nC
c870: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
c880: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
c890: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c8a0: 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
c8b0: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
c8c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c8d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
c8e0: 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
c8f0: 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
c900: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
c910: 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
c920: 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
c930: 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
c940: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
c950: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
c960: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
c970: 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
c980: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
c990: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
c9a0: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
c9b0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
c9c0: 72 65 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  re(p->db, zSql, 
c9d0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
c9e0: 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
c9f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ca00: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
ca10: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
ca20: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
ca30: 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  g(db));.      if
ca40: 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
ca50: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ca60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
ca70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
ca80: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
ca90: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
caa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
cab0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
cac0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
cad0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
cae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
caf0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
cb00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
cb10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
cb20: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  l = malloc( size
cb30: 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43  of(azCol[0])*(nC
cb40: 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  ol+1) );.    if(
cb50: 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
cb60: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
cb70: 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
cb80: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
cb90: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
cba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
cbb0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
cbc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cbd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cbe0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
cbf0: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
cc00: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
cc10: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
cc20: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
cc30: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
cc40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
cc50: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
cc60: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
cc70: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
cc80: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
cc90: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
cca0: 6e 65 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  ne; *z && *z!='\
ccb0: 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 3b 20  n' && *z!='\r'; 
ccc0: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
ccd0: 28 20 2a 7a 3d 3d 70 2d 3e 73 65 70 61 72 61 74  ( *z==p->separat
cce0: 6f 72 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  or[0] && strncmp
ccf0: 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  (z, p->separator
cd00: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
cd10: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
cd20: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
cd30: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
cd40: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
cd50: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
cd60: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
cd70: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
cd80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cd90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
cda0: 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * end for */.   
cdb0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
cdc0: 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
cdd0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
cde0: 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
cdf0: 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
ce00: 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78  : %s line %d: ex
ce10: 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
ce20: 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f  s of data but fo
ce30: 75 6e 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  und %d\n",.     
ce40: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
ce50: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
ce60: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  i+1);.        zC
ce70: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
ce80: 4b 22 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  K";.        free
ce90: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
cea0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
ceb0: 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
cec0: 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d  while */.      }
ced0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cee0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
cef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
cf00: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
cf10: 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
cf20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
cf30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
cf50: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
cf60: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
cf70: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
cf80: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
cf90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
cfb0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
cfc0: 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
cfd0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
cfe0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
cff0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
d000: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
d010: 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
d020: 72 6f 6d 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20  rom while */.   
d030: 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
d040: 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 66  d while */.    f
d050: 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
d060: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
d070: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
d080: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
d090: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
d0a0: 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
d0b0: 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  0);.  }else..  i
d0c0: 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
d0d0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
d0e0: 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20  indices", n)==0 
d0f0: 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  && nArg<3 ){.   
d100: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
d110: 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20  _data data;.    
d120: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
d130: 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
d140: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
d150: 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
d160: 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
d170: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
d180: 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
d190: 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 69  MODE_List;.    i
d1a0: 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
d1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d1c0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
d1d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
d1e0: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
d1f0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
d200: 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
d210: 78 27 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20  x' AND name NOT 
d220: 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20  LIKE 'sqlite_%' 
d230: 22 0a 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e  ".        "UNION
d240: 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22   ALL ".        "
d250: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
d260: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
d270: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
d280: 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
d290: 27 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44  ' ".        "ORD
d2a0: 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
d2b0: 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
d2c0: 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20  a, &zErrMsg.    
d2d0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
d2e0: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
d2f0: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
d300: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d310: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
d320: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
d330: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
d340: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
d350: 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
d360: 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
d370: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
d380: 63 28 29 20 22 0a 20 20 20 20 20 20 20 20 22 55  c() ".        "U
d390: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
d3a0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
d3b0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
d3c0: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
d3d0: 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 69    "WHERE type='i
d3e0: 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
d3f0: 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61  me LIKE shellsta
d400: 74 69 63 28 29 20 22 0a 20 20 20 20 20 20 20 20  tic() ".        
d410: 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20  "ORDER BY 1",.  
d420: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
d430: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
d440: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
d450: 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
d460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
d470: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
d480: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
d490: 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
d4a0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
d4b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
d4c0: 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
d4d0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
d4e0: 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
d4f0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d500: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
d510: 20 71 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65   querying sqlite
d520: 5f 6d 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69  _master and sqli
d530: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e  te_temp_master\n
d540: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
d550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
d560: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d570: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20  NABLE_IOTRACE.  
d580: 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
d590: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
d5a0: 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30  "iotrace", n)==0
d5b0: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
d5c0: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
d5d0: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
d5e0: 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28  *, ...);.    if(
d5f0: 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72   iotrace && iotr
d600: 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63  ace!=stdout ) fc
d610: 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20  lose(iotrace);. 
d620: 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a     iotrace = 0;.
d630: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
d640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
d650: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
d660: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
d670: 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d  (azArg[1], "-")=
d680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
d690: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74  te3IoTrace = iot
d6a0: 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20  racePrintf;.    
d6b0: 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f    iotrace = stdo
d6c0: 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
d6d0: 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66       iotrace = f
d6e0: 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
d6f0: 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  w");.      if( i
d700: 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20  otrace==0 ){.   
d710: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
d720: 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
d730: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
d740: 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
d750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f         sqlite3Io
d760: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
d770: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
d780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d790: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
d7a0: 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
d7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d7c0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69  }else.#endif..#i
d7d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d7e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
d7f0: 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
d800: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
d810: 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30  ], "load", n)==0
d820: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
d830: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d840: 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20  File, *zProc;.  
d850: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
d860: 3d 20 30 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  = 0;.    zFile =
d870: 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
d880: 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
d890: 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
d8a0: 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
d8b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
d8c0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
d8d0: 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
d8e0: 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
d8f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70  E_OK ){.      fp
d910: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
d920: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
d930: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
d940: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
d950: 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
d960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
d970: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
d980: 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='l' && strncmp(
d990: 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c  azArg[0], "log",
d9a0: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d   n)==0 && nArg>=
d9b0: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
d9c0: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41  har *zFile = azA
d9d0: 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70  rg[1];.    if( p
d9e0: 2d 3e 70 4c 6f 67 20 26 26 20 70 2d 3e 70 4c 6f  ->pLog && p->pLo
d9f0: 67 21 3d 73 74 64 6f 75 74 20 26 26 20 70 2d 3e  g!=stdout && p->
da00: 70 4c 6f 67 21 3d 73 74 64 65 72 72 20 29 7b 0a  pLog!=stderr ){.
da10: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e        fclose(p->
da20: 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pLog);.      p->
da30: 70 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pLog = 0;.    }.
da40: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
da50: 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
da60: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  0 ){.      p->pL
da70: 6f 67 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  og = stdout;.   
da80: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
da90: 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
daa0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
dab0: 2d 3e 70 4c 6f 67 20 3d 20 73 74 64 65 72 72 3b  ->pLog = stderr;
dac0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
dad0: 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66  trcmp(zFile, "of
dae0: 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f")==0 ){.      
daf0: 70 2d 3e 70 4c 6f 67 20 3d 20 30 3b 0a 20 20 20  p->pLog = 0;.   
db00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
db10: 3e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 46  >pLog = fopen(zF
db20: 69 6c 65 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  ile, "w");.     
db30: 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20   if( p->pLog==0 
db40: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
db50: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
db60: 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
db70: 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
db80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db90: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
dba0: 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70  =='m' && strncmp
dbb0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65  (azArg[0], "mode
dbc0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
dbd0: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==2 ){.    int n
dbe0: 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 = strlen30(azA
dbf0: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
dc00: 28 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d  (n2==4 && strncm
dc10: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65  p(azArg[1],"line
dc20: 22 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  ",n2)==0).      
dc30: 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 6e 32    ||.        (n2
dc40: 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==5 && strncmp(a
dc50: 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c  zArg[1],"lines",
dc60: 6e 32 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  n2)==0) ){.     
dc70: 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
dc80: 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Line;.    }else 
dc90: 69 66 28 20 28 6e 32 3d 3d 36 20 26 26 20 73 74  if( (n2==6 && st
dca0: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
dcb0: 63 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 29 0a  column",n2)==0).
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
dce0: 6e 32 3d 3d 37 20 26 26 20 73 74 72 6e 63 6d 70  n2==7 && strncmp
dcf0: 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
dd00: 6e 73 22 2c 6e 32 29 3d 3d 30 29 20 29 7b 0a 20  ns",n2)==0) ){. 
dd10: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
dd20: 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
dd30: 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20  }else if( n2==4 
dd40: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
dd50: 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
dd60: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
dd70: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
dd80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32      }else if( n2
dd90: 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==4 && strncmp(a
dda0: 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e  zArg[1],"html",n
ddb0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
ddc0: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74  ->mode = MODE_Ht
ddd0: 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ml;.    }else if
dde0: 28 20 6e 32 3d 3d 33 20 26 26 20 73 74 72 6e 63  ( n2==3 && strnc
ddf0: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c  mp(azArg[1],"tcl
de00: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
de10: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
de20: 5f 54 63 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  _Tcl;.    }else 
de30: 69 66 28 20 6e 32 3d 3d 33 20 26 26 20 73 74 72  if( n2==3 && str
de40: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
de50: 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
de60: 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
de70: 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
de80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
de90: 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74  izeof(p->separat
dea0: 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  or), p->separato
deb0: 72 2c 20 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c  r, ",");.    }el
dec0: 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26 20  se if( n2==4 && 
ded0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
dee0: 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29  ,"tabs",n2)==0 )
def0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
df00: 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
df10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
df20: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65  ntf(sizeof(p->se
df30: 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70  parator), p->sep
df40: 61 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20  arator, "\t");. 
df50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d     }else if( n2=
df60: 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =6 && strncmp(az
df70: 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
df80: 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
df90: 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
dfa0: 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
dfb0: 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22  _table_name(p, "
dfc0: 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c  table");.    }el
dfd0: 73 65 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  se {.      fprin
dfe0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
dff0: 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  : mode should be
e000: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
e010: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63 73 76 20      "column csv 
e020: 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
e030: 20 6c 69 73 74 20 74 61 62 73 20 74 63 6c 5c 6e   list tabs tcl\n
e040: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
e050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
e060: 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26  .  if( c=='m' &&
e070: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
e080: 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30  ], "mode", n)==0
e090: 20 26 26 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20   && nArg==3 ){. 
e0a0: 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c     int n2 = strl
e0b0: 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
e0c0: 20 20 20 20 69 66 28 20 6e 32 3d 3d 36 20 26 26      if( n2==6 &&
e0d0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
e0e0: 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d  ],"insert",n2)==
e0f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
e100: 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
e110: 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c  ;.      set_tabl
e120: 65 5f 6e 61 6d 65 28 70 2c 20 61 7a 41 72 67 5b  e_name(p, azArg[
e130: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b  2]);.    }else {
e140: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
e150: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
e160: 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
e170: 3a 20 22 0a 20 20 20 20 20 20 20 20 22 20 5c 22  : ".        " \"
e180: 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68  %s\". Enter \".h
e190: 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e  elp\" for help\n
e1a0: 22 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ", azArg[2]);.  
e1b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e1c0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
e1d0: 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
e1e0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
e1f0: 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
e200: 26 26 20 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20  && nArg==2 ) {. 
e210: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e220: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
e230: 6c 6c 76 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llvalue), p->nul
e240: 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lvalue,.        
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
e260: 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
e270: 69 7a 65 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  ize(p->nullvalue
e280: 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
e290: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
e2a0: 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70  =='o' && strncmp
e2b0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
e2c0: 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ut", n)==0 && nA
e2d0: 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  rg==2 ){.    if(
e2e0: 20 70 2d 3e 6f 75 74 21 3d 73 74 64 6f 75 74 20   p->out!=stdout 
e2f0: 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  ){.      fclose(
e300: 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  p->out);.    }. 
e310: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
e320: 41 72 67 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29  Arg[1],"stdout")
e330: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
e340: 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
e350: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e360: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
e370: 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
e380: 69 6c 65 2c 20 22 73 74 64 6f 75 74 22 29 3b 0a  ile, "stdout");.
e390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3a0: 20 70 2d 3e 6f 75 74 20 3d 20 66 6f 70 65 6e 28   p->out = fopen(
e3b0: 61 7a 41 72 67 5b 31 5d 2c 20 22 77 62 22 29 3b  azArg[1], "wb");
e3c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
e3d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
e3e0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
e3f0: 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
e400: 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
e410: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
e420: 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
e430: 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
e440: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c   = 1;.      } el
e450: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 73 71  se {.         sq
e460: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
e470: 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
e480: 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
e490: 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  %s", azArg[1]);.
e4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e4b0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
e4c0: 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
e4d0: 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
e4e0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72  ", n)==0 && (nAr
e4f0: 67 3d 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29  g==2 || nArg==3)
e500: 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
e510: 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
e520: 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
e530: 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
e540: 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
e550: 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
e560: 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
e570: 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
e580: 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
e590: 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
e5a0: 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
e5b0: 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
e5c0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
e5d0: 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
e5e0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
e5f0: 75 69 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  uit", n)==0 && n
e600: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63  Arg==1 ){.    rc
e610: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
e620: 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
e630: 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
e640: 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c  zArg[0], "read",
e650: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
e660: 32 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61  2 ){.    FILE *a
e670: 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  lt = fopen(azArg
e680: 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  [1], "rb");.    
e690: 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20  if( alt==0 ){.  
e6a0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
e6b0: 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
e6c0: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
e6d0: 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
e6e0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
e6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
e700: 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
e710: 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
e720: 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
e730: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
e740: 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
e750: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
e760: 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e  0], "restore", n
e770: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26  )==0 && nArg>1 &
e780: 26 20 6e 41 72 67 3c 34 29 7b 0a 20 20 20 20 63  & nArg<4){.    c
e790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
e7a0: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
e7b0: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71  har *zDb;.    sq
e7c0: 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20  lite3 *pSrc;.   
e7d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
e7e0: 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
e7f0: 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  t nTimeout = 0;.
e800: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
e810: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69   ){.      zSrcFi
e820: 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
e830: 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e       zDb = "main
e840: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
e850: 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
e860: 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a  zArg[2];.      z
e870: 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  Db = azArg[1];. 
e880: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
e890: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46  lite3_open(zSrcF
e8a0: 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20  ile, &pSrc);.   
e8b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e8c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  OK ){.      fpri
e8d0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
e8e0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
e8f0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46  \"%s\"\n", zSrcF
e900: 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
e910: 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
e920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
e930: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
e940: 64 62 28 70 29 3b 0a 20 20 20 20 70 42 61 63 6b  db(p);.    pBack
e950: 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
e960: 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  kup_init(p->db, 
e970: 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  zDb, pSrc, "main
e980: 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
e990: 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
e9a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
e9b0: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
e9c0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
e9d0: 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  >db));.      sql
e9e0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
e9f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
ea00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
ea10: 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
ea20: 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
ea30: 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
ea40: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
ea50: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
ea60: 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28  SY  ){.      if(
ea70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
ea80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ea90: 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
eaa0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
eab0: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
eac0: 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
ead0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
eae0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
eaf0: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
eb00: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
eb10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
eb20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
eb30: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
eb40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
eb50: 45 44 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ED ){.      fpri
eb60: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
eb70: 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
eb80: 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
eb90: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
eba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebb0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
ebc0: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
ebd0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
ebe0: 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20  >db));.      rc 
ebf0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
ec00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
ec10: 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  c);.  }else..  i
ec20: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
ec30: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
ec40: 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 26  schema", n)==0 &
ec50: 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
ec60: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
ec70: 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
ec80: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
ec90: 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ;.    open_db(p)
eca0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
ecb0: 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
ecc0: 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
ecd0: 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
ece0: 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
ecf0: 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
ed00: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
ed10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
ed20: 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d  or(i=0; azArg[1]
ed30: 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b  [i]; i++) azArg[
ed40: 31 5d 5b 69 5d 20 3d 20 28 63 68 61 72 29 74 6f  1][i] = (char)to
ed50: 6c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d 5b 69  lower(azArg[1][i
ed60: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
ed70: 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73  rcmp(azArg[1],"s
ed80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d  qlite_master")==
ed90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
eda0: 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
edb0: 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
edc0: 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
edd0: 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c  ] = "CREATE TABL
ede0: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
edf0: 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
ee00: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
ee10: 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
ee40: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
ee50: 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
ee60: 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
ee90: 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
eec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eed0: 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20         ")";.    
eee0: 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
eef0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
ef00: 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
ef10: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
ef20: 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
ef30: 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
ef40: 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
ef50: 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
ef60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ef70: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  K;.      }else i
ef80: 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
ef90: 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  1],"sqlite_temp_
efa0: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
efb0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
efc0: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
efd0: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
efe0: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
eff0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
f000: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
f010: 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20  ter (\n".       
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f030: 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a    type text,\n".
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65        "  name te
f060: 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
f080: 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e  tbl_name text,\n
f090: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
f0a0: 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70          "  rootp
f0b0: 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a  age integer,\n".
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78        "  sql tex
f0e0: 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  t\n".           
f0f0: 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a             ")";.
f100: 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
f110: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
f120: 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22   new_colv[0] = "
f130: 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65  sql";.        ne
f140: 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_colv[1] = 0;. 
f150: 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28         callback(
f160: 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72  &data, 1, new_ar
f170: 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20  gv, new_colv);. 
f180: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f190: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
f1a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  se{.        zShe
f1b0: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
f1c0: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20  [1];.        rc 
f1d0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
f1e0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
f1f0: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
f200: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20   ".          "  
f210: 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
f220: 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
f230: 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
f240: 61 6d 65 20 6e 61 6d 65 22 0a 20 20 20 20 20 20  ame name".      
f250: 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
f260: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
f270: 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20  ON ALL".        
f280: 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
f290: 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
f2a0: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  , name FROM sqli
f2b0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
f2c0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
f2d0: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  RE tbl_name LIKE
f2e0: 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41   shellstatic() A
f2f0: 4e 44 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  ND type!='meta' 
f300: 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
f310: 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44  ".          "ORD
f320: 45 52 20 42 59 20 73 75 62 73 74 72 28 74 79 70  ER BY substr(typ
f330: 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20  e,2,1), name",. 
f340: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
f350: 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
f360: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68  sg);.        zSh
f370: 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
f380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f390: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
f3a0: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
f3b0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  .         "SELEC
f3c0: 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20  T sql FROM ".   
f3d0: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
f3e0: 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74   sql sql, type t
f3f0: 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62  ype, tbl_name tb
f400: 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d  l_name, name nam
f410: 65 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20  e".         "   
f420: 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
f430: 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
f440: 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c           "   SEL
f450: 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
f460: 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 46 52  bl_name, name FR
f470: 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
f480: 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
f490: 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
f4a0: 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
f4b0: 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e  TNULL AND name N
f4c0: 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
f4d0: 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f 52  %'".         "OR
f4e0: 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74 79  DER BY substr(ty
f4f0: 70 65 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a  pe,2,1), name",.
f500: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
f510: 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
f520: 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
f530: 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
f540: 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
f550: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
f560: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
f570: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f580: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
f590: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
f5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21    }else if( rc !
f5b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
f5c0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
f5d0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
f5e0: 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f  ying schema info
f5f0: 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20  rmation\n");.   
f600: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
f610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
f620: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
f630: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
f640: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
f650: 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
f660: 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
f670: 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =2 ){.    sqlite
f680: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
f690: 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c  f(p->separator),
f6a0: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 0a 20   p->separator,. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
f6d0: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72  )sizeof(p->separ
f6e0: 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31  ator)-1, azArg[1
f6f0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ]);.  }else..  i
f700: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
f710: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
f720: 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 26 26 20  show", n)==0 && 
f730: 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 69  nArg==1 ){.    i
f740: 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e 74  nt i;.    fprint
f750: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
f760: 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70   %s\n","echo", p
f770: 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20  ->echoOn ? "on" 
f780: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
f790: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
f7a0: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  .9s: %s\n","expl
f7b0: 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e  ain", p->explain
f7c0: 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e  Prev.valid ? "on
f7d0: 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66  " :"off");.    f
f7e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f7f0: 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61  9.9s: %s\n","hea
f800: 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65  ders", p->showHe
f810: 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  ader ? "on" : "o
f820: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
f830: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
f840: 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
f850: 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
f860: 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
f870: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
f880: 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
f890: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
f8a0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
f8b0: 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
f8c0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
f8d0: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
f8e0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
f8f0: 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  .9s: %s\n","outp
f900: 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
f910: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74   strlen30(p->out
f920: 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69  file) ? p->outfi
f930: 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a  le : "stdout");.
f940: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
f950: 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 73  ut,"%9.9s: ", "s
f960: 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20  eparator");.    
f970: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
f980: 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70  g(p->out, p->sep
f990: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66  arator);.      f
f9a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f9b0: 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  \n");.    fprint
f9c0: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
f9d0: 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c 20   %s\n","stats", 
f9e0: 70 2d 3e 73 74 61 74 73 4f 6e 20 3f 20 22 6f 6e  p->statsOn ? "on
f9f0: 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
fa00: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
fa10: 25 39 2e 39 73 3a 20 22 2c 22 77 69 64 74 68 22  %9.9s: ","width"
fa20: 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b  );.    for (i=0;
fa30: 69 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  i<(int)ArraySize
fa40: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26  (p->colWidth) &&
fa50: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20   p->colWidth[i] 
fa60: 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20  != 0;i++) {.    
fa70: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
fa80: 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64  ,"%d ",p->colWid
fa90: 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  th[i]);.    }.  
faa0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
fab0: 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a  ,"\n");.  }else.
fac0: 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
fad0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
fae0: 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d  ], "stats", n)==
faf0: 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26 20 6e  0 && nArg>1 && n
fb00: 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 70 2d 3e  Arg<3 ){.    p->
fb10: 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61  statsOn = boolea
fb20: 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
fb30: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
fb40: 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26   c=='t' && n>1 &
fb50: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
fb60: 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29  0], "tables", n)
fb70: 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
fb80: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  .    char **azRe
fb90: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52  sult;.    int nR
fba0: 6f 77 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ow;.    char *zE
fbb0: 72 72 4d 73 67 3b 0a 20 20 20 20 6f 70 65 6e 5f  rrMsg;.    open_
fbc0: 64 62 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e  db(p);.    if( n
fbd0: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
fbe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
fbf0: 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a 20 20  _table(p->db,.  
fc00: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
fc10: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
fc20: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
fc30: 22 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28  "WHERE type IN (
fc40: 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20  'table','view') 
fc50: 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
fc60: 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20  E 'sqlite_%' ". 
fc70: 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c         "UNION AL
fc80: 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c  L ".        "SEL
fc90: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
fca0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
fcb0: 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
fcc0: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
fcd0: 65 27 2c 27 76 69 65 77 27 29 20 22 0a 20 20 20  e','view') ".   
fce0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31       "ORDER BY 1
fcf0: 22 2c 0a 20 20 20 20 20 20 20 20 26 61 7a 52 65  ",.        &azRe
fd00: 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20  sult, &nRow, 0, 
fd10: 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29  &zErrMsg.      )
fd20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fd30: 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20     zShellStatic 
fd40: 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
fd50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
fd60: 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62 2c 0a  et_table(p->db,.
fd70: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
fd80: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
fd90: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
fda0: 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49 4e    "WHERE type IN
fdb0: 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27   ('table','view'
fdc0: 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20  ) AND name LIKE 
fdd0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
fde0: 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
fdf0: 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
fe00: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
fe10: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
fe20: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
fe30: 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
fe40: 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20  le','view') AND 
fe50: 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
fe60: 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20  tatic() ".      
fe70: 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
fe80: 20 20 20 20 20 20 20 20 26 61 7a 52 65 73 75 6c          &azResul
fe90: 74 2c 20 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45  t, &nRow, 0, &zE
fea0: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
feb0: 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
fec0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
fed0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
fee0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
fef0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
ff00: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
ff10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff20: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
ff30: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
ff40: 73 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c  se if( rc != SQL
ff50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ff60: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
ff70: 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
ff80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
ff90: 64 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  d sqlite_temp_ma
ffa0: 73 74 65 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ster\n");.      
ffb0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
ffc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e{.      int len
ffd0: 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20 20  , maxlen = 0;.  
ffe0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
fff0: 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74 43 6f      int nPrintCo
10000 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20 20  l, nPrintRow;.  
10010 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
10020 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
10030 20 20 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74      if( azResult
10040 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
10050 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  e;.        len =
10060 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75   strlen30(azResu
10070 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lt[i]);.        
10080 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29  if( len>maxlen )
10090 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20   maxlen = len;. 
100a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72       }.      nPr
100b0 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78  intCol = 80/(max
100c0 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  len+2);.      if
100d0 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20  ( nPrintCol<1 ) 
100e0 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20  nPrintCol = 1;. 
100f0 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d       nPrintRow =
10100 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43   (nRow + nPrintC
10110 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f  ol - 1)/nPrintCo
10120 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
10130 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69  ; i<nPrintRow; i
10140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
10150 28 6a 3d 69 2b 31 3b 20 6a 3c 3d 6e 52 6f 77 3b  (j=i+1; j<=nRow;
10160 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a   j+=nPrintRow){.
10170 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
10180 7a 53 70 20 3d 20 6a 3c 3d 6e 50 72 69 6e 74 52  zSp = j<=nPrintR
10190 6f 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a  ow ? "" : "  ";.
101a0 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
101b0 28 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70 2c 20  ("%s%-*s", zSp, 
101c0 6d 61 78 6c 65 6e 2c 20 61 7a 52 65 73 75 6c 74  maxlen, azResult
101d0 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a  [j] ? azResult[j
101e0 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
101f0 20 7d 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74   }.        print
10200 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  f("\n");.      }
10210 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10220 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 7a  e3_free_table(az
10230 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65  Result);.  }else
10240 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
10250 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70  & n>4 && strncmp
10260 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65  (azArg[0], "time
10270 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  out", n)==0 && n
10280 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 6f 70  Arg==2 ){.    op
10290 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 73 71  en_db(p);.    sq
102a0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
102b0 75 74 28 70 2d 3e 64 62 2c 20 61 74 6f 69 28 61  ut(p->db, atoi(a
102c0 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65 6c  zArg[1]));.  }el
102d0 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20 48 41  se.    .  if( HA
102e0 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d 27 74  S_TIMER && c=='t
102f0 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72  ' && n>=5 && str
10300 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
10310 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 26 26  timer", n)==0 &&
10320 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
10330 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f  enableTimer = bo
10340 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
10350 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  [1]);.  }else.  
10360 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26  .  if( c=='w' &&
10370 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
10380 5d 2c 20 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d  ], "width", n)==
10390 30 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20  0 && nArg>1 ){. 
103a0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73     int j;.    as
103b0 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61  sert( nArg<=Arra
103c0 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a  ySize(azArg) );.
103d0 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e      for(j=1; j<n
103e0 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69  Arg && j<ArraySi
103f0 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b  ze(p->colWidth);
10400 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   j++){.      p->
10410 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20  colWidth[j-1] = 
10420 61 74 6f 69 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a  atoi(azArg[j]);.
10430 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10440 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   {.    fprintf(s
10450 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75  tderr, "Error: u
10460 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
10470 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
10480 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
10490 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
104a0 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
104b0 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
104c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a     rc = 1;.  }..
104d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
104e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
104f0 45 20 69 66 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  E if a semicolon
10500 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
10510 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 4e 20   in the first N 
10520 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66  characters.** of
10530 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a   string z[]..*/.
10540 73 74 61 74 69 63 20 69 6e 74 20 5f 63 6f 6e 74  static int _cont
10550 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63  ains_semicolon(c
10560 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
10570 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
10580 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
10590 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ++){  if( z[i]==
105a0 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20  ';' ) return 1; 
105b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
105c0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
105d0 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e  ee if a line con
105e0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
105f0 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  f whitespace..*/
10600 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c  .static int _all
10610 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
10620 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f  t char *z){.  fo
10630 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  r(; *z; z++){.  
10640 20 20 69 66 28 20 69 73 73 70 61 63 65 28 2a 28    if( isspace(*(
10650 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
10660 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
10670 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26    if( *z=='/' &&
10680 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[1]=='*' ){.  
10690 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
106a0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 28    while( *z && (
106b0 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21  *z!='*' || z[1]!
106c0 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  ='/') ){ z++; }.
106d0 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20        if( *z==0 
106e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
106f0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e    z++;.      con
10700 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
10710 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26 20   if( *z=='-' && 
10720 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]=='-' ){.   
10730 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
10740 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
10750 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d  !='\n' ){ z++; }
10760 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
10770 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
10780 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10790 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
107a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
107b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
107c0 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69 6e   TRUE if the lin
107d0 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61 6e  e typed in is an
107e0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65 72   SQL command ter
107f0 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a 2a  minator other.**
10800 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f 6c   than a semi-col
10810 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65 72  on.  The SQL Ser
10820 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20 63  ver style "go" c
10830 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72 73  ommand is unders
10840 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74 68  tood.** as is th
10850 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f  e Oracle "/"..*/
10860 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69 73 5f  .static int _is_
10870 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
10880 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
10890 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  Line){.  while( 
108a0 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
108b0 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65 29 20  ed char*)zLine) 
108c0 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20  ){ zLine++; };. 
108d0 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
108e0 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  /' && _all_white
108f0 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d 29  space(&zLine[1])
10900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
10910 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a  ;  /* Oracle */.
10920 20 20 7d 0a 20 20 69 66 28 20 74 6f 6c 6f 77 65    }.  if( tolowe
10930 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27  r(zLine[0])=='g'
10940 20 26 26 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e   && tolower(zLin
10950 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20  e[1])=='o'.     
10960 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74      && _all_whit
10970 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d  espace(&zLine[2]
10980 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
10990 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65  1;  /* SQL Serve
109a0 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  r */.  }.  retur
109b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
109c0 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53 71  turn true if zSq
109d0 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  l is a complete 
109e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
109f0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
10a00 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74 68  it.** ends in th
10a10 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73 74  e middle of a st
10a20 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72 20  ring literal or 
10a30 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 2e  C-style comment.
10a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
10a50 69 73 5f 63 6f 6d 70 6c 65 74 65 28 63 68 61 72  is_complete(char
10a60 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 6e 53 71 6c   *zSql, int nSql
10a70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10a80 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
10a90 75 72 6e 20 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53  urn 1;.  zSql[nS
10aa0 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20 20 7a 53 71  ql] = ';';.  zSq
10ab0 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20  l[nSql+1] = 0;. 
10ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
10ad0 6d 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a 20 20  mplete(zSql);.  
10ae0 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a  zSql[nSql] = 0;.
10af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10b00 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
10b10 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70 72   from *in and pr
10b20 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a 69  ocess it.  If *i
10b30 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74 0a  n==0 then input.
10b40 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69 76  ** is interactiv
10b50 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73 20  e - the user is 
10b60 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20 4f  typing it it.  O
10b70 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74 0a  therwise, input.
10b80 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
10b90 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76 69  m a file or devi
10ba0 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69 73  ce.  A prompt is
10bb0 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73 74   issued and hist
10bc0 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64 20  ory.** is saved 
10bd0 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69 73  only if input is
10be0 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20 41   interactive.  A
10bf0 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67 6e  n interrupt sign
10c00 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73 65  al will.** cause
10c10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
10c20 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c   exit immediatel
10c30 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74 20  y, unless input 
10c40 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  is interactive..
10c50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10c60 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
10c70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10c80 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73   process_input(s
10c90 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
10ca0 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e  ata *p, FILE *in
10cb0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
10cc0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
10cd0 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
10ce0 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
10cf0 71 6c 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 63  qlPrior = 0;.  c
10d00 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
10d10 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 72  int rc;.  int er
10d20 72 43 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rCnt = 0;.  int 
10d30 6c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 69 6e  lineno = 0;.  in
10d40 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
10d50 0a 0a 20 20 77 68 69 6c 65 28 20 65 72 72 43 6e  ..  while( errCn
10d60 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c 5f 6f 6e  t==0 || !bail_on
10d70 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e 3d 3d 30  _error || (in==0
10d80 20 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74   && stdin_is_int
10d90 65 72 61 63 74 69 76 65 29 20 29 7b 0a 20 20 20  eractive) ){.   
10da0 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 3b   fflush(p->out);
10db0 0a 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29  .    free(zLine)
10dc0 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20 6f 6e  ;.    zLine = on
10dd0 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a 53 71  e_input_line(zSq
10de0 6c 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  l, in);.    if( 
10df0 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLine==0 ){.    
10e00 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 57 65 20    break;  /* We 
10e10 68 61 76 65 20 72 65 61 63 68 65 64 20 45 4f 46  have reached EOF
10e20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
10e30 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  ( seenInterrupt 
10e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21  ){.      if( in!
10e50 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
10e60 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
10e70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
10e80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
10e90 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20 7a 53 71   (zSql==0 || zSq
10ea0 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f 61 6c 6c  l[0]==0) && _all
10eb0 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69 6e  _whitespace(zLin
10ec0 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
10ed0 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26 26 20     if( zLine && 
10ee0 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26 26  zLine[0]=='.' &&
10ef0 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   nSql==0 ){.    
10f00 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f 6e 20    if( p->echoOn 
10f10 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c  ) printf("%s\n",
10f20 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72   zLine);.      r
10f30 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
10f40 61 6e 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a 20  and(zLine, p);. 
10f50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29       if( rc==2 )
10f60 7b 20 2f 2a 20 65 78 69 74 20 72 65 71 75 65 73  { /* exit reques
10f70 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ted */.        b
10f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
10f90 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
10fa0 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20      errCnt++;.  
10fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
10fc0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
10fd0 69 66 28 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f  if( _is_command_
10fe0 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c 69 6e 65  terminator(zLine
10ff0 29 20 26 26 20 5f 69 73 5f 63 6f 6d 70 6c 65 74  ) && _is_complet
11000 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b  e(zSql, nSql) ){
11010 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c  .      memcpy(zL
11020 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20  ine,";",2);.    
11030 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69 6f 72 20  }.    nSqlPrior 
11040 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  = nSql;.    if( 
11050 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
11060 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
11070 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20  r(i=0; zLine[i] 
11080 26 26 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  && isspace((unsi
11090 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b  gned char)zLine[
110a0 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
110b0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 21 3d    if( zLine[i]!=
110c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 71  0 ){.        nSq
110d0 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69  l = strlen30(zLi
110e0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  ne);.        zSq
110f0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 71 6c  l = malloc( nSql
11100 2b 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +3 );.        if
11110 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
11120 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
11130 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
11140 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
11150 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69 74  ;.          exit
11160 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (1);.        }. 
11170 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53         memcpy(zS
11180 71 6c 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c 2b  ql, zLine, nSql+
11190 31 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72  1);.        star
111a0 74 6c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  tline = lineno;.
111b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
111c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e{.      int len
111d0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
111e0 65 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  e);.      zSql =
111f0 20 72 65 61 6c 6c 6f 63 28 20 7a 53 71 6c 2c 20   realloc( zSql, 
11200 6e 53 71 6c 20 2b 20 6c 65 6e 20 2b 20 34 20 29  nSql + len + 4 )
11210 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c  ;.      if( zSql
11220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
11230 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
11240 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
11250 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
11260 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
11270 7d 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6e 53 71  }.      zSql[nSq
11280 6c 2b 2b 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  l++] = '\n';.   
11290 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 71 6c 5b     memcpy(&zSql[
112a0 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65 2c 20 6c 65  nSql], zLine, le
112b0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c  n+1);.      nSql
112c0 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20   += len;.    }. 
112d0 20 20 20 69 66 28 20 7a 53 71 6c 20 26 26 20 5f     if( zSql && _
112e0 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c  contains_semicol
112f0 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69  on(&zSql[nSqlPri
11300 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72  or], nSql-nSqlPr
11310 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ior).           
11320 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
11330 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29  complete(zSql) )
11340 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d  {.      p->cnt =
11350 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
11360 62 28 70 29 3b 0a 20 20 20 20 20 20 42 45 47 49  b(p);.      BEGI
11370 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20 72  N_TIMER;.      r
11380 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70  c = shell_exec(p
11390 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c  ->db, zSql, shel
113a0 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  l_callback, p, &
113b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
113c0 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20  END_TIMER;.     
113d0 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
113e0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  sg ){.        ch
113f0 61 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b  ar zPrefix[100];
11400 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 21  .        if( in!
11410 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73 5f  =0 || !stdin_is_
11420 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20  interactive ){. 
11430 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11440 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
11450 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66  (zPrefix), zPref
11460 69 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ix, .           
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69 6e  "Error: near lin
11490 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69 6e  e %d:", startlin
114a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
114b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
114c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
114d0 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
114e0 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22  Prefix, "Error:"
114f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11500 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
11510 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
11520 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
11530 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65   "%s %s\n", zPre
11540 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  fix, zErrMsg);. 
11550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11560 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
11570 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73            zErrMs
11580 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
11590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
115a0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
115b0 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66  "%s %s\n", zPref
115c0 69 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ix, sqlite3_errm
115d0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
115e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72      }.        er
115f0 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rCnt++;.      }.
11600 20 20 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29        free(zSql)
11610 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 30  ;.      zSql = 0
11620 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30  ;.      nSql = 0
11630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11640 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 69 66  ( zSql ){.    if
11650 28 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  ( !_all_whitespa
11660 63 65 28 7a 53 71 6c 29 20 29 20 66 70 72 69 6e  ce(zSql) ) fprin
11670 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
11680 72 3a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51  r: incomplete SQ
11690 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  L: %s\n", zSql);
116a0 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b  .    free(zSql);
116b0 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69 6e  .  }.  free(zLin
116c0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72  e);.  return err
116d0 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cnt;.}../*.** Re
116e0 74 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20  turn a pathname 
116f0 77 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65  which is the use
11700 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  r's home directo
11710 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75  ry.  A.** 0 retu
11720 72 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20  rn indicates an 
11730 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69  error of some ki
11740 6e 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  nd.  Space to ho
11750 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ld the.** result
11760 69 6e 67 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ing string is ob
11770 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
11780 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
11790 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  ng.** function s
117a0 68 6f 75 6c 64 20 66 72 65 65 20 74 68 65 20 72  hould free the r
117b0 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
117c0 20 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65   char *find_home
117d0 5f 64 69 72 28 76 6f 69 64 29 7b 0a 20 20 63 68  _dir(void){.  ch
117e0 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e  ar *home_dir = N
117f0 55 4c 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ULL;..#if !defin
11800 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
11810 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
11820 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f   !defined(__OS2_
11830 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
11840 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 21 64  WIN32_WCE) && !d
11850 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
11860 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
11870 5f 4b 45 52 4e 45 4c 29 0a 20 20 73 74 72 75 63  _KERNEL).  struc
11880 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74 3b  t passwd *pwent;
11890 0a 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20 67  .  uid_t uid = g
118a0 65 74 75 69 64 28 29 3b 0a 20 20 69 66 28 20 28  etuid();.  if( (
118b0 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28 75  pwent=getpwuid(u
118c0 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  id)) != NULL) {.
118d0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 70      home_dir = p
118e0 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20 20  went->pw_dir;.  
118f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
11900 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
11910 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20 43  ).  /* Windows C
11920 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
11930 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
11940 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65 74   not provide get
11950 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68 6f  env().   */.  ho
11960 6d 65 5f 64 69 72 20 3d 20 73 74 72 64 75 70 28  me_dir = strdup(
11970 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a 23 69 66  "/");.#else..#if
11980 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
11990 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
119a0 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  2) || defined(__
119b0 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21 68 6f  OS2__).  if (!ho
119c0 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f  me_dir) {.    ho
119d0 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28  me_dir = getenv(
119e0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
119f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
11a00 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20   (!home_dir) {. 
11a10 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65     home_dir = ge
11a20 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20  tenv("HOME");.  
11a30 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  }..#if defined(_
11a40 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
11a50 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  d(WIN32) || defi
11a60 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20 69  ned(__OS2__).  i
11a70 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
11a80 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76 65      char *zDrive
11a90 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69 6e  , *zPath;.    in
11aa0 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65 20  t n;.    zDrive 
11ab0 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44 52  = getenv("HOMEDR
11ac0 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74 68  IVE");.    zPath
11ad0 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 50   = getenv("HOMEP
11ae0 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  ATH");.    if( z
11af0 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20 29  Drive && zPath )
11b00 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c  {.      n = strl
11b10 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b 20 73  en30(zDrive) + s
11b20 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2b  trlen30(zPath) +
11b30 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64   1;.      home_d
11b40 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29  ir = malloc( n )
11b50 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 6d 65  ;.      if( home
11b60 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  _dir==0 ) return
11b70 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
11b80 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f  3_snprintf(n, ho
11b90 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22 2c 20  me_dir, "%s%s", 
11ba0 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a  zDrive, zPath);.
11bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 6f 6d        return hom
11bc0 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20  e_dir;.    }.   
11bd0 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c   home_dir = "c:\
11be0 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  \";.  }.#endif..
11bf0 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33  #endif /* !_WIN3
11c00 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20  2_WCE */..  if( 
11c10 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20 20  home_dir ){.    
11c20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
11c30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b 0a  (home_dir) + 1;.
11c40 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d 61      char *z = ma
11c50 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 69  lloc( n );.    i
11c60 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a 2c  f( z ) memcpy(z,
11c70 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a 20   home_dir, n);. 
11c80 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a 3b     home_dir = z;
11c90 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68  .  }..  return h
11ca0 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  ome_dir;.}../*.*
11cb0 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
11cc0 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76 65 6e  m the file given
11cd0 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f 76 65   by sqliterc_ove
11ce0 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20 74 68  rride.  Or if th
11cf0 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  at.** parameter 
11d00 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69 6e  is NULL, take in
11d10 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c 69  put from ~/.sqli
11d20 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  terc.**.** Retur
11d30 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
11d40 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
11d50 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 73  ic int process_s
11d60 71 6c 69 74 65 72 63 28 0a 20 20 73 74 72 75 63  qliterc(.  struc
11d70 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
11d80 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *p,        /* Co
11d90 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61  nfiguration data
11da0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11db0 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72   *sqliterc_overr
11dc0 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ide   /* Name of
11dd0 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55   config file. NU
11de0 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  LL to use defaul
11df0 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
11e00 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b  home_dir = NULL;
11e10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  .  const char *s
11e20 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65  qliterc = sqlite
11e30 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63  rc_override;.  c
11e40 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20  har *zBuf = 0;. 
11e50 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c   FILE *in = NULL
11e60 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
11e70 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69  int rc = 0;..  i
11e80 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e  f (sqliterc == N
11e90 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
11ea0 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f  dir = find_home_
11eb0 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68  dir();.    if( h
11ec0 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69  ome_dir==0 ){.#i
11ed0 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  f !defined(__RTP
11ee0 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
11ef0 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20  _WRS_KERNEL).   
11f00 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11f10 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 63 61  r,"%s: Error: ca
11f20 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72  nnot locate your
11f30 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 5c   home directory\
11f40 6e 22 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e 64  n", Argv0);.#end
11f50 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
11f60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 75  1;.    }.    nBu
11f70 66 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d  f = strlen30(hom
11f80 65 5f 64 69 72 29 20 2b 20 31 36 3b 0a 20 20 20  e_dir) + 16;.   
11f90 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 20   zBuf = malloc( 
11fa0 6e 42 75 66 20 29 3b 0a 20 20 20 20 69 66 28 20  nBuf );.    if( 
11fb0 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
11fc0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
11fd0 22 25 73 3a 20 45 72 72 6f 72 3a 20 6f 75 74 20  "%s: Error: out 
11fe0 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 2c 41 72 67  of memory\n",Arg
11ff0 76 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  v0);.      retur
12000 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
12010 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12020 6e 42 75 66 2c 20 7a 42 75 66 2c 22 25 73 2f 2e  nBuf, zBuf,"%s/.
12030 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f 64  sqliterc",home_d
12040 69 72 29 3b 0a 20 20 20 20 66 72 65 65 28 68 6f  ir);.    free(ho
12050 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73 71 6c  me_dir);.    sql
12060 69 74 65 72 63 20 3d 20 28 63 6f 6e 73 74 20 63  iterc = (const c
12070 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 7d 0a 20  har*)zBuf;.  }. 
12080 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
12090 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
120a0 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
120b0 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
120c0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66 70  tive ){.      fp
120d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d 2d  rintf(stderr,"--
120e0 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72 63   Loading resourc
120f0 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73 71  es from %s\n",sq
12100 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a 20  literc);.    }. 
12110 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
12120 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20  input(p,in);.   
12130 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
12140 0a 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  .  free(zBuf);. 
12150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12160 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c 61  *.** Show availa
12170 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ble command line
12180 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
12190 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4f  ic const char zO
121a0 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22 20  ptions[] = .  " 
121b0 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20 20 20    -help         
121c0 20 20 20 20 20 20 20 73 68 6f 77 20 74 68 69 73         show this
121d0 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 20   message\n".  " 
121e0 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61 6d 65    -init filename
121f0 20 20 20 20 20 20 20 72 65 61 64 2f 70 72 6f 63         read/proc
12200 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65 5c 6e  ess named file\n
12210 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20  ".  "   -echo   
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
12230 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f  nt commands befo
12240 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a  re execution\n".
12250 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65    "   -[no]heade
12260 72 20 20 20 20 20 20 20 20 20 20 74 75 72 6e 20  r          turn 
12270 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
12280 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69 6c  f\n".  "   -bail
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  stop after hitti
122b0 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20  ng an error\n". 
122c0 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76   "   -interactiv
122d0 65 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20  e         force 
122e0 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c  interactive I/O\
122f0 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63 68 20  n".  "   -batch 
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
12310 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22  rce batch I/O\n"
12320 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20  .  "   -column  
12330 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
12340 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
12350 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20  column'\n".  "  
12360 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20   -csv           
12370 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
12380 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e   mode to 'csv'\n
12390 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20 20 20  ".  "   -html   
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
123b0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
123c0 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  HTML\n".  "   -l
123d0 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
123e0 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
123f0 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
12400 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
12410 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
12420 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
12430 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73  ist'\n".  "   -s
12440 65 70 61 72 61 74 6f 72 20 27 78 27 20 20 20 20  eparator 'x'    
12450 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 66 69     set output fi
12460 65 6c 64 20 73 65 70 61 72 61 74 6f 72 20 28 7c  eld separator (|
12470 29 5c 6e 22 0a 20 20 22 20 20 20 2d 73 74 61 74  )\n".  "   -stat
12480 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
12490 70 72 69 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61  print memory sta
124a0 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66  ts before each f
124b0 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20  inalize\n".  "  
124c0 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 27 74 65 78   -nullvalue 'tex
124d0 74 27 20 20 20 20 73 65 74 20 74 65 78 74 20 73  t'    set text s
124e0 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76  tring for NULL v
124f0 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 2d  alues\n".  "   -
12500 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
12510 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74 65 20      show SQLite 
12520 76 65 72 73 69 6f 6e 5c 6e 22 0a 3b 0a 73 74 61  version\n".;.sta
12530 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 69  tic void usage(i
12540 6e 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a  nt showDetail){.
12550 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12560 2c 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a 20  ,.      "Usage: 
12570 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c  %s [OPTIONS] FIL
12580 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20 20  ENAME [SQL]\n"  
12590 0a 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45  .      "FILENAME
125a0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
125b0 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
125c0 73 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61  se. A new databa
125d0 73 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22  se is created\n"
125e0 0a 20 20 20 20 20 20 22 69 66 20 74 68 65 20 66  .      "if the f
125f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65  ile does not pre
12600 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e  viously exist.\n
12610 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28  ", Argv0);.  if(
12620 20 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20   showDetail ){. 
12630 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12640 72 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63 6c  r, "OPTIONS incl
12650 75 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69  ude:\n%s", zOpti
12660 6f 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ons);.  }else{. 
12670 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12680 72 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c  r, "Use the -hel
12690 70 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64  p option for add
126a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
126b0 69 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65  ion\n");.  }.  e
126c0 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xit(1);.}../*.**
126d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
126e0 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  state informatio
126f0 6e 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61  n in data.*/.sta
12700 74 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e  tic void main_in
12710 69 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61  it(struct callba
12720 63 6b 5f 64 61 74 61 20 2a 64 61 74 61 29 20 7b  ck_data *data) {
12730 0a 20 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20  .  memset(data, 
12740 30 2c 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29  0, sizeof(*data)
12750 29 3b 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65 20  );.  data->mode 
12760 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 6d  = MODE_List;.  m
12770 65 6d 63 70 79 28 64 61 74 61 2d 3e 73 65 70 61  emcpy(data->sepa
12780 72 61 74 6f 72 2c 22 7c 22 2c 20 32 29 3b 0a 20  rator,"|", 2);. 
12790 20 64 61 74 61 2d 3e 73 68 6f 77 48 65 61 64 65   data->showHeade
127a0 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
127b0 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
127c0 4f 4e 46 49 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c  ONFIG_LOG, shell
127d0 4c 6f 67 2c 20 64 61 74 61 29 3b 0a 20 20 73 71  Log, data);.  sq
127e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
127f0 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d 70 74  izeof(mainPrompt
12800 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c 22 73  ), mainPrompt,"s
12810 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73 71 6c  qlite> ");.  sql
12820 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
12830 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50 72 6f  zeof(continuePro
12840 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65 50 72  mpt), continuePr
12850 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20 22 29  ompt,"   ...> ")
12860 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
12870 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
12880 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
12890 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  }..int main(int 
128a0 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
128b0 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  v){.  char *zErr
128c0 4d 73 67 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  Msg = 0;.  struc
128d0 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
128e0 64 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  data;.  const ch
128f0 61 72 20 2a 7a 49 6e 69 74 46 69 6c 65 20 3d 20  ar *zInitFile = 
12900 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 72 73  0;.  char *zFirs
12910 74 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  tCmd = 0;.  int 
12920 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  i;.  int rc = 0;
12930 0a 0a 20 20 41 72 67 76 30 20 3d 20 61 72 67 76  ..  Argv0 = argv
12940 5b 30 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74  [0];.  main_init
12950 28 26 64 61 74 61 29 3b 0a 20 20 73 74 64 69 6e  (&data);.  stdin
12960 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
12970 3d 20 69 73 61 74 74 79 28 30 29 3b 0a 0a 20 20  = isatty(0);..  
12980 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
12990 68 61 76 65 20 61 20 76 61 6c 69 64 20 73 69 67  have a valid sig
129a0 6e 61 6c 20 68 61 6e 64 6c 65 72 20 65 61 72 6c  nal handler earl
129b0 79 2c 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  y, before anythi
129c0 6e 67 0a 20 20 2a 2a 20 65 6c 73 65 20 69 73 20  ng.  ** else is 
129d0 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  done..  */.#ifde
129e0 66 20 53 49 47 49 4e 54 0a 20 20 73 69 67 6e 61  f SIGINT.  signa
129f0 6c 28 53 49 47 49 4e 54 2c 20 69 6e 74 65 72 72  l(SIGINT, interr
12a00 75 70 74 5f 68 61 6e 64 6c 65 72 29 3b 0a 23 65  upt_handler);.#e
12a10 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e  ndif..  /* Do an
12a20 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68   initial pass th
12a30 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e  rough the comman
12a40 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d-line argument 
12a50 74 6f 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74  to locate.  ** t
12a60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
12a70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12a80 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
12a90 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c  itialization fil
12aa0 65 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  e,.  ** and the 
12ab0 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 74 6f  first command to
12ac0 20 65 78 65 63 75 74 65 2e 0a 20 20 2a 2f 0a 20   execute..  */. 
12ad0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
12ae0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  -1; i++){.    ch
12af0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 61  ar *z;.    if( a
12b00 72 67 76 5b 69 5d 5b 30 5d 21 3d 27 2d 27 20 29  rgv[i][0]!='-' )
12b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 20 3d 20   break;.    z = 
12b20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
12b30 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
12b40 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
12b50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
12b60 67 76 5b 69 5d 2c 22 2d 73 65 70 61 72 61 74 6f  gv[i],"-separato
12b70 72 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  r")==0 || strcmp
12b80 28 61 72 67 76 5b 69 5d 2c 22 2d 6e 75 6c 6c 76  (argv[i],"-nullv
12b90 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  alue")==0 ){.   
12ba0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73     i++;.    }els
12bb0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
12bc0 76 5b 69 5d 2c 22 2d 69 6e 69 74 22 29 3d 3d 30  v[i],"-init")==0
12bd0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
12be0 20 20 20 20 20 7a 49 6e 69 74 46 69 6c 65 20 3d       zInitFile =
12bf0 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 2f 2a   argv[i];.    /*
12c00 20 4e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   Need to check f
12c10 6f 72 20 62 61 74 63 68 20 6d 6f 64 65 20 68 65  or batch mode he
12c20 72 65 20 74 6f 20 73 6f 20 77 65 20 63 61 6e 20  re to so we can 
12c30 61 76 6f 69 64 20 70 72 69 6e 74 69 6e 67 0a 20  avoid printing. 
12c40 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
12c50 6e 61 6c 20 6d 65 73 73 61 67 65 73 20 28 6c 69  nal messages (li
12c60 6b 65 20 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f  ke from process_
12c70 73 71 6c 69 74 65 72 63 29 20 62 65 66 6f 72 65  sqliterc) before
12c80 20 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 74   .    ** we do t
12c90 68 65 20 61 63 74 75 61 6c 20 70 72 6f 63 65 73  he actual proces
12ca0 73 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e 74  sing of argument
12cb0 73 20 6c 61 74 65 72 20 69 6e 20 61 20 73 65 63  s later in a sec
12cc0 6f 6e 64 20 70 61 73 73 2e 0a 20 20 20 20 2a 2f  ond pass..    */
12cd0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
12ce0 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
12cf0 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  batch")==0 ){.  
12d00 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74      stdin_is_int
12d10 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20  eractive = 0;.  
12d20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c    }.  }.  if( i<
12d30 61 72 67 63 20 29 7b 0a 23 69 66 20 64 65 66 69  argc ){.#if defi
12d40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 4f 53  ned(SQLITE_OS_OS
12d50 32 29 20 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f  2) && SQLITE_OS_
12d60 4f 53 32 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  OS2.    data.zDb
12d70 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  Filename = (cons
12d80 74 20 63 68 61 72 20 2a 29 63 6f 6e 76 65 72 74  t char *)convert
12d90 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 61 72  CpPathToUtf8( ar
12da0 67 76 5b 69 2b 2b 5d 20 29 3b 0a 23 65 6c 73 65  gv[i++] );.#else
12db0 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c  .    data.zDbFil
12dc0 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b 69 2b 2b  ename = argv[i++
12dd0 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  ];.#endif.  }els
12de0 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e{.#ifndef SQLIT
12df0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12e00 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65      data.zDbFile
12e10 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a  name = ":memory:
12e20 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 61 74  ";.#else.    dat
12e30 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  a.zDbFilename = 
12e40 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
12e50 69 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 20 20  if( i<argc ){.  
12e60 20 20 7a 46 69 72 73 74 43 6d 64 20 3d 20 61 72    zFirstCmd = ar
12e70 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 69  gv[i++];.  }.  i
12e80 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 20 20 20  f( i<argc ){.   
12e90 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12ea0 22 25 73 3a 20 45 72 72 6f 72 3a 20 74 6f 6f 20  "%s: Error: too 
12eb0 6d 61 6e 79 20 6f 70 74 69 6f 6e 73 3a 20 5c 22  many options: \"
12ec0 25 73 5c 22 5c 6e 22 2c 20 41 72 67 76 30 2c 20  %s\"\n", Argv0, 
12ed0 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 66 70  argv[i]);.    fp
12ee0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73  rintf(stderr,"Us
12ef0 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69  e -help for a li
12f00 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e  st of options.\n
12f10 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
12f20 3b 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74  ;.  }.  data.out
12f30 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 23 69 66 64   = stdout;..#ifd
12f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12f50 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 64 61  EMORYDB.  if( da
12f60 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  ta.zDbFilename==
12f70 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
12f80 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72  (stderr,"%s: Err
12f90 6f 72 3a 20 6e 6f 20 64 61 74 61 62 61 73 65 20  or: no database 
12fa0 66 69 6c 65 6e 61 6d 65 20 73 70 65 63 69 66 69  filename specifi
12fb0 65 64 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20  ed\n", Argv0);. 
12fc0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 6f  .#endif..  /* Go
12fe0 20 61 68 65 61 64 20 61 6e 64 20 6f 70 65 6e 20   ahead and open 
12ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13000 65 20 69 66 20 69 74 20 61 6c 72 65 61 64 79 20  e if it already 
13010 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 0a  exists.  If the.
13020 20 20 2a 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e    ** file does n
13030 6f 74 20 65 78 69 73 74 2c 20 64 65 6c 61 79 20  ot exist, delay 
13040 6f 70 65 6e 69 6e 67 20 69 74 2e 20 20 54 68 69  opening it.  Thi
13050 73 20 70 72 65 76 65 6e 74 73 20 65 6d 70 74 79  s prevents empty
13060 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
13070 69 6c 65 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  iles from being 
13080 63 72 65 61 74 65 64 20 69 66 20 61 20 75 73 65  created if a use
13090 72 20 6d 69 73 74 79 70 65 73 20 74 68 65 20 64  r mistypes the d
130a0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 72 67  atabase name arg
130b0 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68  ument.  ** to th
130c0 65 20 73 71 6c 69 74 65 20 63 6f 6d 6d 61 6e 64  e sqlite command
130d0 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a 2f  -line tool..  */
130e0 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 64 61  .  if( access(da
130f0 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  ta.zDbFilename, 
13100 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  0)==0 ){.    ope
13110 6e 5f 64 62 28 26 64 61 74 61 29 3b 0a 20 20 7d  n_db(&data);.  }
13120 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
13130 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
13140 6e 20 66 69 6c 65 20 69 66 20 74 68 65 72 65 20  n file if there 
13150 69 73 20 6f 6e 65 2e 20 20 49 66 20 6e 6f 20 2d  is one.  If no -
13160 69 6e 69 74 20 6f 70 74 69 6f 6e 0a 20 20 2a 2a  init option.  **
13170 20 69 73 20 67 69 76 65 6e 20 6f 6e 20 74 68 65   is given on the
13180 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 6c   command line, l
13190 6f 6f 6b 20 66 6f 72 20 61 20 66 69 6c 65 20 6e  ook for a file n
131a0 61 6d 65 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63  amed ~/.sqliterc
131b0 20 61 6e 64 0a 20 20 2a 2a 20 74 72 79 20 74 6f   and.  ** try to
131c0 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a   process it..  *
131d0 2f 0a 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73  /.  rc = process
131e0 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74 61 2c  _sqliterc(&data,
131f0 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 20 20 69 66  zInitFile);.  if
13200 28 20 72 63 3e 30 20 29 7b 0a 20 20 20 20 72 65  ( rc>0 ){.    re
13210 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
13220 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64  /* Make a second
13230 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
13240 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
13250 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a  rgument and set.
13260 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54    ** options.  T
13270 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20  his second pass 
13280 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
13290 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74 69   after the initi
132a0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66  alization.  ** f
132b0 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ile is processed
132c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d   so that the com
132d0 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65  mand-line argume
132e0 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64  nts will overrid
132f0 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20  e.  ** settings 
13300 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
13310 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f  ation file..  */
13320 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
13330 67 63 20 26 26 20 61 72 67 76 5b 69 5d 5b 30 5d  gc && argv[i][0]
13340 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  =='-'; i++){.   
13350 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
13360 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d  i];.    if( z[1]
13370 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  =='-' ){ z++; }.
13380 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13390 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
133a0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
133b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
133c0 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  z,"-html")==0 ){
133d0 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
133e0 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
133f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13400 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30  mp(z,"-list")==0
13410 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
13420 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
13430 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
13440 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29  trcmp(z,"-line")
13450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
13460 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  a.mode = MODE_Li
13470 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ne;.    }else if
13480 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c  ( strcmp(z,"-col
13490 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  umn")==0 ){.    
134a0 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
134b0 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
134c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
134d0 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a  z,"-csv")==0 ){.
134e0 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
134f0 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
13500 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 73 65    memcpy(data.se
13510 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a  parator,",",2);.
13520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13530 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74  rcmp(z,"-separat
13540 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
13550 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 69   i++;.      if(i
13560 3e 3d 61 72 67 63 29 7b 0a 20 20 20 20 20 20 20  >=argc){.       
13570 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13580 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d 69 73 73  "%s: Error: miss
13590 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  ing argument for
135a0 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
135b0 41 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20  Argv0, z);.     
135c0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
135d0 72 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72  r,"Use -help for
135e0 20 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f   a list of optio
135f0 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ns.\n");.       
13600 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13610 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13620 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13630 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72 29  (data.separator)
13640 2c 20 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  , data.separator
13650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13660 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
13670 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74 61  (int)sizeof(data
13680 2e 73 65 70 61 72 61 74 6f 72 29 2d 31 2c 61 72  .separator)-1,ar
13690 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  gv[i]);.    }els
136a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
136b0 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20  -nullvalue")==0 
136c0 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
136d0 20 20 20 20 69 66 28 69 3e 3d 61 72 67 63 29 7b      if(i>=argc){
136e0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
136f0 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72  (stderr,"%s: Err
13700 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72 67 75  or: missing argu
13710 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 3a  ment for option:
13720 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a   %s\n", Argv0, z
13730 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
13740 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d  tf(stderr,"Use -
13750 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20  help for a list 
13760 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b  of options.\n");
13770 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13780 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
13790 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
137a0 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e 75  f(sizeof(data.nu
137b0 6c 6c 76 61 6c 75 65 29 2c 20 64 61 74 61 2e 6e  llvalue), data.n
137c0 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  ullvalue,.      
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a   "%.*s",(int)siz
137f0 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  eof(data.nullval
13800 75 65 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a  ue)-1,argv[i]);.
13810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13820 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22  rcmp(z,"-header"
13830 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
13840 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
13850 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
13860 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65   strcmp(z,"-nohe
13870 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ader")==0 ){.   
13880 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
13890 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  er = 0;.    }els
138a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
138b0 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  -echo")==0 ){.  
138c0 20 20 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e 20      data.echoOn 
138d0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
138e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 74  f( strcmp(z,"-st
138f0 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ats")==0 ){.    
13900 20 20 64 61 74 61 2e 73 74 61 74 73 4f 6e 20 3d    data.statsOn =
13910 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
13920 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61 69  ( strcmp(z,"-bai
13930 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
13940 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20  bail_on_error = 
13950 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
13960 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72 73   strcmp(z,"-vers
13970 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
13980 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
13990 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
139a0 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 72 65  ion());.      re
139b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
139c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
139d0 2d 69 6e 74 65 72 61 63 74 69 76 65 22 29 3d 3d  -interactive")==
139e0 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e  0 ){.      stdin
139f0 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
13a00 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
13a10 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
13a20 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tch")==0 ){.    
13a30 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
13a40 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  active = 0;.    
13a50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13a60 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20 7c  (z,"-help")==0 |
13a70 7c 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 2d 68  | strcmp(z, "--h
13a80 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  elp")==0 ){.    
13a90 20 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20 20    usage(1);.    
13aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
13ab0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
13ac0 20 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20   Error: unknown 
13ad0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41  option: %s\n", A
13ae0 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20  rgv0, z);.      
13af0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
13b00 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20  Use -help for a 
13b10 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e  list of options.
13b20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
13b30 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
13b40 0a 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64  .  if( zFirstCmd
13b50 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 6a   ){.    /* Run j
13b60 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  ust the command 
13b70 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
13b80 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 20   database name. 
13b90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46     */.    if( zF
13ba0 69 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27 20  irstCmd[0]=='.' 
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f  ){.      rc = do
13bc0 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 46  _meta_command(zF
13bd0 69 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29 3b  irstCmd, &data);
13be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13bf0 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29    open_db(&data)
13c00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 68 65  ;.      rc = she
13c10 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  ll_exec(data.db,
13c20 20 7a 46 69 72 73 74 43 6d 64 2c 20 73 68 65 6c   zFirstCmd, shel
13c30 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
13c40 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
13c50 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 21      if( zErrMsg!
13c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
13c70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
13c80 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
13c90 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Msg);.        re
13ca0 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72 63 20  turn rc!=0 ? rc 
13cb0 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
13cc0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
13cd0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13ce0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
13cf0 62 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 53  ble to process S
13d00 51 4c 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  QL \"%s\"\n", zF
13d10 69 72 73 74 43 6d 64 29 3b 0a 20 20 20 20 20 20  irstCmd);.      
13d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13d30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
13d40 73 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 63  se{.    /* Run c
13d50 6f 6d 6d 61 6e 64 73 20 72 65 63 65 69 76 65 64  ommands received
13d60 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69   from standard i
13d70 6e 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nput.    */.    
13d80 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
13d90 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20  eractive ){.    
13da0 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20    char *zHome;. 
13db0 20 20 20 20 20 63 68 61 72 20 2a 7a 48 69 73 74       char *zHist
13dc0 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ory = 0;.      i
13dd0 6e 74 20 6e 48 69 73 74 6f 72 79 3b 0a 20 20 20  nt nHistory;.   
13de0 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20     printf(.     
13df0 20 20 20 22 53 51 4c 69 74 65 20 76 65 72 73 69     "SQLite versi
13e00 6f 6e 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20  on %s\n".       
13e10 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c   "Enter \".help\
13e20 22 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69 6f  " for instructio
13e30 6e 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 45  ns\n".        "E
13e40 6e 74 65 72 20 53 51 4c 20 73 74 61 74 65 6d 65  nter SQL stateme
13e50 6e 74 73 20 74 65 72 6d 69 6e 61 74 65 64 20 77  nts terminated w
13e60 69 74 68 20 61 20 5c 22 3b 5c 22 5c 6e 22 2c 0a  ith a \";\"\n",.
13e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13e80 6c 69 62 76 65 72 73 69 6f 6e 28 29 0a 20 20 20  libversion().   
13e90 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 48 6f 6d     );.      zHom
13ea0 65 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  e = find_home_di
13eb0 72 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  r();.      if( z
13ec0 48 6f 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Home ){.        
13ed0 6e 48 69 73 74 6f 72 79 20 3d 20 73 74 72 6c 65  nHistory = strle
13ee0 6e 33 30 28 7a 48 6f 6d 65 29 20 2b 20 32 30 3b  n30(zHome) + 20;
13ef0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 7a 48  .        if( (zH
13f00 69 73 74 6f 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  istory = malloc(
13f10 6e 48 69 73 74 6f 72 79 29 29 21 3d 30 20 29 7b  nHistory))!=0 ){
13f20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13f30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 48 69 73  e3_snprintf(nHis
13f40 74 6f 72 79 2c 20 7a 48 69 73 74 6f 72 79 2c 22  tory, zHistory,"
13f50 25 73 2f 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f  %s/.sqlite_histo
13f60 72 79 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20  ry", zHome);.   
13f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
13f80 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
13f90 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48 41 56  READLINE) && HAV
13fa0 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20  E_READLINE==1.  
13fb0 20 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79      if( zHistory
13fc0 20 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28   ) read_history(
13fd0 7a 48 69 73 74 6f 72 79 29 3b 0a 23 65 6e 64 69  zHistory);.#endi
13fe0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  f.      rc = pro
13ff0 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61  cess_input(&data
14000 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
14010 7a 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20  zHistory ){.    
14020 20 20 20 20 73 74 69 66 6c 65 5f 68 69 73 74 6f      stifle_histo
14030 72 79 28 31 30 30 29 3b 0a 20 20 20 20 20 20 20  ry(100);.       
14040 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a   write_history(z
14050 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20  History);.      
14060 20 20 66 72 65 65 28 7a 48 69 73 74 6f 72 79 29    free(zHistory)
14070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14080 66 72 65 65 28 7a 48 6f 6d 65 29 3b 0a 20 20 20  free(zHome);.   
14090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
140a0 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74   = process_input
140b0 28 26 64 61 74 61 2c 20 73 74 64 69 6e 29 3b 0a  (&data, stdin);.
140c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 5f      }.  }.  set_
140d0 74 61 62 6c 65 5f 6e 61 6d 65 28 26 64 61 74 61  table_name(&data
140e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 61 74 61  , 0);.  if( data
140f0 2e 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 73  .db ){.    if( s
14100 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 61 74  qlite3_close(dat
14110 61 2e 64 62 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  a.db)!=SQLITE_OK
14120 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
14130 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
14140 20 63 61 6e 6e 6f 74 20 63 6c 6f 73 65 20 64 61   cannot close da
14150 74 61 62 61 73 65 20 5c 22 25 73 5c 22 5c 6e 22  tabase \"%s\"\n"
14160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14170 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
14180 62 29 29 3b 0a 20 20 20 20 20 20 72 63 2b 2b 3b  b));.      rc++;
14190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
141a0 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.